하드웨어의 오동작/고장으로 인한 오류로 프로그램이 종료가 되어 정상 실행 상태로 돌아갈 수 없음
사용자의 잘못된 조작 / 개발자의 잘못된 코딩으로 인한 오류로 프로그램 종료가 발생하지만 예외 처리를 추가하면 정상 실행 상태로 돌아갈 수 있음
예외 처리 코드가 없다면 컴파일 되지 않음
예외 처리 코드 생략하더라도 컴파일 되지만 경험에 따라 예외 처리 코드 작성 필요
java.lang.Exception
java.lang.ClassNotFoundException
java.lang.InterruptException
java.lang.RuntimeException
java.lang.NullPointException
java.lang.NumberFormatException
객체 참조가 없는 상태로 Null 값을 갖는 참조변수로 객체 접근 연산자 사용한 경우 발생함
배열에서 인덱스 범위를 초과하여 사용한 경우 발생
문자열을 숫자로 반환하는 경우에 숫자로 변환될 수 없는 문자가 포함된 경우 발생
타입 변환이 되지 않을 경우에 발생
예외가 발생한 경우 프로그램 종료를 막고 정상 실행을 유지할 수 있도록 처리하는 코드
try-catch-finally
구문
예외 발생 여부와 관계없이 사용했던 리소스 객체의 close() 메소드 호출 통해 안전하게 리소스 닫아줌
FileInputStream fis = null;
try{
fis = new FileInputStream("file.txt");
...
} catch(IOException e){
...
} finally {
if(fis != null){
try{
fis.close();
}catch(IOException e){
...
}
}
}
try(FileInputStream fis = new FileInputStream("file.txt")){
...
} catch(IOException e){
...
}
try(
FileInputStream fis = new FileInputStream("file1.txt");
FileOutputStream fos = new FileOutputStream("file2.txt");
){
...
} catch(IOException e){
...
}
리소스 객체의 조건
java.lang.AutoCloseable 인터페이스를 구현하는 객체
메소드 선언부 끝에 작성하여 메소드에서 처리하지 않은 예외를 호출한 곳으로 떠넘김
public void method1(){
try{
method2();
}catch(ClassNotFoundException e){
...
}
}
public void mehtod2() throws ClassNotFoundException{
Class clazz = Class.forName("java.lang.String2");
}
자바 표준 API에서 제공하지 않는 예외 / 애플리케이션 서비스와 관련된 예외는 사용자가 정의
public class CustomException extends [Exception|RuntimeException] {
public CustomException(){}
public CustomException(String message){
super(message);
}
}
public void method() throws CustomException{
throw new CustomException("메시지");
}
예외를 발생시킬 때 생성자 매개값으로 사용한 메시지를 리턴
catch(Exception e){
String message = e.getMessage();
}
예외 발생 코드 추적한 내용 모두 콘솔에 출력