728x90
: 프로그램 실행 중에 발생하는 예기치 않은 사건 처리.
자바는 프로그램 실행 중 발생할 수 있는 예외를 처리할 수 있는 기법을 제공한다. 발생하는 모든 예외를 객체로 취급하고 예외관련 클래스를 제공한다.
에러발생 예제
-
정수를 0으로 나누는 경우
-
배열의 첨자가 음수값을 가지는 경우
-
배열 첨자가 배열의 크기를 벗어나는 경우
-
부적절한 형변환이 일어나는 경우
-
입출력시 interupt가 발생하는 경우
-
입출력하기 위해 지정한 파일이 존재하지 않거나 파일 이름이 틀린 경우
int su = 3.14; //에러 --> int자료형에서는 0.14에 대한 표현을 할 수 없다.
int su = (int)3.14; //su변수에 3이 저장
double d = 30; //묵시적인 형변환. d변수에 30.0이 저장
double d = (double)30; //명시적인 형변환
(int)"홍길동" //에러발생: String과 int자료형은 공통점이 없다.
(B)A //에러발생: A클래스와 B클래스간의 상속관계가 없다.
(Object)String --> Object ob = (Object)"길동";
--> 부모캐스팅은 보통 생략 => Object ob = "길동";
ob.length() //에러발생
ob.toString() //에러발생. toString()메소드는 String 클래스의 메소드다.
(String)Object
--> 자식캐스팅: 반드시 명시 String str = (String)ob;
str.length() //3 실행
(Parent)Child데이터(생략가능)
(Child)Parent데이터
==> 상속관계에 있었을 때만 캐스팅이 가능하다.
Exception 클래스 계층구조
java.lang.Object
|
java.lang.Throwable
|
------------------------
| |
Error Exception
- 예외발생시 JVM에서 관련된 예외클래스로 부터 예외 객체 생성하고 프로그램에서 지정된 예외처리루틴에게 넘겨준다.
- Error발생하는 경우 : 하드디스크 포맷이 망가진경우, 메모리 파괴, 스택오버플로우 (메모리가 적재되다가 과부화하여 에러)
throw문
- throws문은 예외가 발생시 할일에 대해 전가의 뜻을 가짐.
void gildong() throws IOException
{
readLine();
}
void lime()
{
gildong();
}
try~catch문
void hello(){
try { //대체적으로 메소드 호출문장에서 예외 발생
1;
2; ->AException 발생 가능성
3;
4; ->BException 발생 가능성
} catch(AException e) { //catch(예외타입 변수명)
AException 발생시 실행할 문장;
} catch(BException e){
BException 발생시 실행할 문장;
}
}
}
각각 처리
try{
AException문장이 발생할 가능성 있는 문장1;
}catch(AException e){
AException 발생 시 처리할 문장;
}
try{
BException문장이 발생할 가능성 있는 문장2;
}catch(BException e){
BException 발생 시 처리할 문장;
}
finally
try{
AException문장이 발생할 가능성 있는 문장1;
BException문장이 발생할 가능성 있는 문장2;
CException문장이 발생할 가능성 있는 문장3;
} catch(AException e){
AException 발생 시 처리할 문장;
}catch(BException e){
BException 발생 시 처리할 문장;
}finally{
예외발생과 상관없이 반드시 실행할 문장;
}
}
※ 다중 catch를 사용할 때 주의할 점
- 부모자식 클래스 정의하는 순서에 주의
- 자식클래스에 대한 catch문을 먼저 정의해야 함
//catch에서 선언한 클래스 예외발생 클래스
catch(ParentException pe){} // => ParentException pe = new ParentException();
catch(ChildException ce){} //에러발생=> ParentException pe = new ChildException();
---
catch(ChildException ce){} //ChildException ce = new ChildException();
catch(ParentException pe){} //ParentException pe = new ParetnException();
예외 종류
체크(Checked) 예외
public static void main(String[] args) throws IOException {
System.in.read(); // Unhandled Exception type IOException
}
- 컴파일 에러발생
- 명시적으로 발생할 수 있는 예외에 대한 처리를 강요
- 반드시 try~catch 또는 throws를 사용해야함
in.readLine() // --> unhandled exception IOException 에러발생
new FileReader("a.txt") //--> unhandled exception FileNotFoundException 에러발생
언체크(UnChecked) 예외
public static void main(String[] args) {
String[] names = {"길동", "주원"}//배열 인덱스 0,1 생성
System.out.println(names[3]);//컴파일시에는 에러가 발생하지 않고 런타임시 에러발생
}
- 개발자 실수 또는 사용자 입력데이터로 인해 예외 발생
- 컴파일시 에러가 발생하지 않는다.
- 특징은 RuntimeException(부모)을 상속받는 예외(자식)클래스
- try~catch 또는 throws 사용 가능
- if문을 통해 처리가능
사용자 정의 예외
-
예외의 발생은 JVM에 의해 실행중 발생할 수도 있지만 사용자 프로그램에서 인위적으로 예외를 발생시킬 수 있다. (throw문을 제공)
throw 예외객체; throw new 예외객체타입(매개변수); class MyException extends Exception{ public MyException(String msg){ super(msg) } }
예외 오버라이딩 시 주의할 점
- 접근제한자는 부모와 동일하거나 확장해야 함
- throws는 부모와 동일하거나 축소해야 함
'Web develop > JAVA' 카테고리의 다른 글
[JAVA] 자바 GUI (0) | 2019.04.29 |
---|---|
[JAVA] 자바 내부클래스(Inner Class/비 정적 중첩클래스) (0) | 2019.04.29 |
[JAVA] 자바 String 클래스 종류 및 사용법 (0) | 2019.04.25 |
[JAVA] 자바 클래스 객체생성법 (0) | 2019.04.24 |
[JAVA] 추상클래스(abstract class) (0) | 2019.04.24 |