일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | 5 | 6 | 7 |
8 | 9 | 10 | 11 | 12 | 13 | 14 |
15 | 16 | 17 | 18 | 19 | 20 | 21 |
22 | 23 | 24 | 25 | 26 | 27 | 28 |
29 | 30 | 31 |
- 티스토리챌린지
- 알고리즘
- Spring
- 클린아키텍처
- Effective Java
- 카카오
- Sort
- ElasticSearch
- java
- kubernetes
- 스프링핵심원리
- 엘라스틱서치
- 알고리즘정렬
- 자바
- 이펙티브자바
- Effective Java 3
- k8s
- 이차전지관련주
- 스프링 핵심원리
- 자바스크립트
- 스프링부트
- 카카오 면접
- 예제로 배우는 스프링 입문
- 김영한
- JavaScript
- effectivejava
- 이펙티브 자바
- 오블완
- 코딩테스트
- 스프링
- Today
- Total
Kim-Baek 개발자 이야기
자바 기본 ( 18 ) - 예외처리 본문
- Type 통일 : 부모타입에 자식객체를 모두 대입가능
상속 -> 다형성 + overriding -> abstract -> Interface
- 코드 재사용 -> 타입통일 : 다형성을 위해 사용이 된다.
※ 객체와의 좋은 관계
1. high cohesion (높은 집중도) (하나의 클래스가 하나의 일만 하자) : 단일 책임
2. loose coupling (느슨한 연결) - 관계가 깊을수록 다른 쪽에 영향을 끼칠 가능성이 많다.
◎ 내부 class (Nested class, inner class)
- JDK 1.1 에서 추가되었다. GUI에 대한 것이 많이 바뀌게 되었는데, 그것을 지원하기 위해 나오게 되었다.
class A{
class B{
} -> class 안에 class를 정의 -> 외부 class 멤버에 자유롭게 접근하기 위해서 사용
} -> private 도
classA{
private int var;
}
classB{
void go()
{
System.out.print(var); <- 접근이 안되는데 GUI 에서 이렇게 해야 편한 상황이 있어 class A안에 class B를 넣게 되었다.
} ->private 도 사용이 되니까!
}
- > Outer class (외부 class), Inner class (내부 class)
class Outer{
class Inner{ -> outer 의 멤버
}
}
※ inner class 의 종류
class Outer{
class Inner{ } -> Instance Inner class -> Outer 객체의 것 : Outer 모든 멤버에 접근
static class Inner{ } -> static Inner class -> Outer class 의 것 : Outer static 멤버만 접근
void go(){
class Inner{ } -> Local Inner class -> 메소드의 것 (거의사용X)
}
}
◎ 예외 처리
----> 실행중 오류가 100% 발생시 코드를 잘못짠 것이다.
- 컴파일 에러 ex) String s = 20; (100% 오류)
----> 정상으로 될 때 50%, 오류가 50% 이면 사용자의 사용이 잘못되었을 수 있다. 오류를 처리하자.
ex) String s = null; 컴파일 ok
s.equals("abc"); 컴파일 ok -> 컴파일러는 한줄씩만 확인한다. 이어서 생각하지 않는다.
-> NullPointerException (100%오류)
----> String url ="www.google.co.kr";
url 로 연결해라! 라는 코드를 작성 (프로그램은 완벽)
-> 만약 네트워크가 연결이 안된다면? 어떤 상황이냐에 따라 될수도 안될수도!
※ 오류 : 프로그램이 정상적으로 실행되지 않는 상황 -> 오류를 객체화 : class
-> 실행 시점의 오류 : 컴파일 에러
※ 오류의 종류
1. Error : program 내에서 처리가 안되는 오류 (발생하면 끝)
2. Exception : 처리가 가능한 오류
-> 정상화 : Exception handling - 발생한 Exception을 처리해서 정상흐름으로 돌리는 것
※ Call Stack 메카니즘 : JVM -> JVM (흐름) , main ' { '-> main ' } ' (코드)
method : caller------> worker
<------return
오류가 나도 JVM에서 시작해 JVM으로 끝나게 된다 (호출한 곳으로 계속간다(오류가 나서 리턴 : throw))
-> 오류가 나면 나머지 아래(파란색) 부분은 모두 실행을 하지 못한다
오류가 나는 부분에서 처리를 하게 되면 나머지 부분은 실행이 가능하다
-> 보통 오류가 난 지점에서는 처리X (그럴수 있으면 아예 코드를 고치지!)
: 호출한 부분에서 처리하게 된다.
※ Exception 구문
- unchecked (계열) Exception : 예외처리여부를 compiler가 체크안하는 exception 들
- 처리를 안해서 오류가 나던 말던 관심없다
- system 레벨 예외 : system(core)상에서 발생하는 오류
-> JVM에게 맡긴다
-> 수정해야 되는 경우가 많다(코드가 틀림), 일반적으로 처리보다는 수정.
- RuntimeException 이 최상위 class
ex) void go (String s){
s.-----();
}
go(null) ---> 에러발생 : 만들때는 모른다! (null 이 올 수도 안 올 수도 있다)
int[ ] a = {1, 2} a[5]=20;
-> Java 에서 지켜야할 것이다. System 문법적인 오류 -> system 쪽에서 발생하는 것이니 system(JVM)에게 맡기자
-> 내가 하는 업무와는 관계없이 프로그램이 지켜야하는 것을 안지켰어.
- checked (계열) Exception : 예외처리코드가 없으면 compile에러 발생하는 exception
-> 예외처리를 반드시 해야하는 exception
-> application 레벨 exception -> 업무의 흐름상 발생가능한 exception
-> 실행환경과 관련이 있는 에러, 사용자의 사용법
-> code 작성시 발생가능성이 있다는 것은 알지만 발생여부는 알 수 없다. -> 처리코드 필요
-> RuntimeException 제외한 모든 Exception -> Exception 을 상속 (최상위)
ex) url 받기, url 연결, 정보받기
if(네트워크 연결 x){
} -> 내 업무로직에서 발생하는 오류이다. 실행환경 흐름상 충분히 발생가능 (application)
개발자는 발생할지 알 수 없다. -> 작성자가 만든것이니 작성자가 처리해! 컴파일러가 강제한다.
- 상속의 계층구조
※ try, catch , finall(실제처리 : if, else 처럼 같이 써야한다.)throws(처리할 곳으로 미룬다) : 처리관련 키워드
throw -> 예외발생
throw new exception(); : 더 이상 실행하지 않겠다.
※ try-catch-finally : 발생한 예외를 직접처리
기본구문
try{
1. ---------- A exception 발생가능성
2. ---------- B exception 발생가능성
3. ---------- C exception 발생가능성
}catch(A exception ae){
4. 처리
}catch(B exception be){
5.처리
}catch(C exception ce){
6.처리
}
7.
1 -> 2 -> 3-> 7 : 정상구조
1 -> 4-> 7 : A exception 발생시
1 -> 2 -> 5 -> 7 : B exception 발생시
1 -> 2 -> 3 -> 6 -> 7 : C exception 발생시
※ 만약 잡을수있는 catch가 없으면 호출한 곳으로 비정상적(throw)으로 넘어간다.
※ 한번에 묶는 경우 : 한 묶음의 단위로 진행될 때(하나가 진행되지 않으면 필요없다)
-> 독립적으로 처리되도 될때는 따로 잡아도 된다.
※ 다중 catch 시 (상속관계에서) 하위 Exeption 부터 잡아야 한다. 아니면 뒤의 코드는 쓸일이 없어진다.
try{
1. ---------- A exception 발생가능성
2. ---------- B exception 발생가능성
3. ---------- C exception 발생가능성
}catch(Exception e){ -> 할일이 똑같다면(처리코드의 동일) 이렇게 해도 무방 (상위타입으로 잡자)
}
※ finally
try{
1 ---------- exception 시 실행 X
}catch(A exception ae){
2 ---------- exception 없으면 실행 X
}
3 ---------- exception 을 못잡으면 실행X
-> 어느 하나도 100% 실행이 보장되지 않는다.
finally {구문}
- 예외 발생 - 처리 상황과 상관없이 무조건 실행되는 code block
- try 블록 다음에 와야한다
- try - finally
- try -catch - finally
-> 주로 close() 코드가 들어간다.
'개발 > java basic' 카테고리의 다른 글
자바에서 코틀린 - 6장 자바에서 코틀린 컬렉션으로 (0) | 2023.04.17 |
---|---|
자바에서 코틀린 - 5장 빈에서 값으로 (0) | 2023.04.13 |
자바 기본 (17) - 추상, 인터페이스 (0) | 2020.10.08 |
자바 기본 (16) - 상속, 다형성 (0) | 2020.10.07 |
자바 기본 (15) - 의존 관계, is a, has a (0) | 2020.10.06 |