출처: 자바의 정석 3판 ch8예외처리 p 414~434
에러: 프로그램 코드에 의해서 수습될 수 없는 심각한 오류
예외: 프로그램 코드에 의해서 수습될 수 있는 다소 미약한 오류
둘다 런타임에러
예외처리의 정의와 목적
정의: 프로그램 실행 시 발생할 수 있는 예외의 발생에 대비한 코드를 작성하는 것
목적: 프로그램의 비정상 종료를 막고 정상적인 실행상태를 유지하는 것
처리하기. try-catch문
try블럭안에는 예외가 발생할 가능성이 있는 문장들을 넣고,
catch(Exception1 e1) 블럭안에는 Exception1이 발생했을 경우, 이를 처리하기 위한 문장들을 넣음
try블럭 내에서 예외가 발생한 경우
-1. 발생한 예외와 일치하는 catch블럭이 있는지 확인
-2.일치하는 catch블럭을 찾게되면, 그 catch블럭 내의 문장들을 수행하고 전체 try-catch문을 빠져나가서 그 다음 문장을 계속해서 수행. 만일 일치하는 catch블럭을 찾지 못하면 예외는 처리되지 못하고 프로그램이 비정상종료됨
try블럭내에서 예외 발생안한경우
-catch블럭을 거치지 않고 전체 try-catch문을 빠져나가서 수행을 계속함
printStackTrace()와 getMessage()
printStackTrace(): 예외 발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력
getMessage() 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수있다.
멀티 catch블럭
catch블럭안의 내용이 같을 경우 하나로 합침
try{
...
}catch(ExcepitonA e){
e.printStackTrace();
}catch(ExceptionB e2){
e2.printStackTrace();
}
//하나로 합치면
try{
...
}catch(ExceptionA | ExceptionB e){
e.printStackTrace();
}
예외 발생시키기
1. 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든다음
Exception e = new Exception("고의로 예외발생시킴");
2. 키워드 throw를 이용해서 예외를 발생시킴
throw e;
한줄로 줄이면 throw new Exception
Exception클래스의 자손은 checked예외로 예외처리가 필수이다.
RuntimeException자손은 unchecked예외로 예외처리가 필수가 아닌 선택이다. 근데 그만큼 더 조심해서 코딩해야함.
eclipse에서 checked예외를 예외처리안해주면 빨간줄이 떠서 반드시 예외처리해줘야함
unchecked예외는 빨간줄은 안뜨는데 실행시 에러가 발생할 수있다.
메서드 예외 처리방법: try-catch문: 직접처리
예외선언하기: 예외떠넘기기(알리기)
은폐->catch블럭에 아무것도 넣지 않는다.
=빅데이터 처리할때 사용됨
예외처리 예시
import java.io.File;
public class ThrowExceptionClass {
public static void main(String[]args) {
try {
File f = createFile(args[0]);
System.out.println(f.getName()+"파일이 성공적으로 생성되었습니다.");
} catch(Exception e) {
System.out.println(e.getMessage()+"다시 입력해주시기 바랍니다.");
}
}
static File createFile(String fileName)throws Exception{
if(fileName==null || fileName.equals(""))
throw new Exception("파일이름이 유효하지 않습니다.");
File f = new File(fileName);
f.createNewFile();
return f;
}
}
실행방법: 이클립스 메뉴바에 run탭에서 run configuration을 클릭한후 argument에 파일명을 입력한다.
실행결과
조금 다르게 변경할 수도 있다.
import java.io.File;
public class ThrowExceptionClass {
public static void main(String[]args) {
File f = createFile(args[0]);
System.out.println(f.getName()+"파일이 성공적으로 생성되었습니다.");
}
static File createFile(String fileName){
try{
if(fileName==null || fileName.equals(""))
throw new Exception("파일이름이 유효하지 않습니다.");
}catch(Exception e){
fileName = "제목없음.txt";
}
File f = new File(fileName);
try{
f.createNewFile();
}catch(IOException e){
e.printStackTrace();
}
return f;
}
}
finally블럭
:예외 발생여부와 관계없이 수행되어야 하는 코드를 넣는다.
try{
startInstall();
copyFiles();
deleteTempFiles();
} catch(Exception e){
e.printStackTrace();
deleteTempFiles();
}
//finally를 사용햐면 중복코드를 없앨 수 있다.
try{
startInstall();
copyFiles();
} catch(Exception e){
e.printStackTrace();
}finally{
deleteTempFiles();
}