class Main {
public static void main(String[] args) {
try {
Exception e = new Exception("throw로 예외 강제 발생");
throw e;
// throw new Exception("예외");
} catch (Exception e) {
System.out.println("에러 메시지 : " + e.getMessage());
e.printStackTrace();
}
}
}
public static void main(String[] args) throws IOException { ... do something }
try { // 예외를 처리하길 원하는 실행 코드 }
catch (e1) { // e1 예외가 발생할 경우에 실행될 코드 }
catch (e2) { // e2 예외가 발생할 경우에 실행될 코드 }
...
finally { // 예외 발생 여부와 상관없이 무조건 실행될 코드 }
try{ ... }
: 예외가 발생하면 catch블록에서 처리, 예외가 발생하지 않는다면 바로 finally블럭으로 이동 catch (e1) { ... }
finally{ ... }
: 모든 예외처리가 끝나면 finally블럭으로 이동
- 다른 제어문과는 달리 예외 처리문은 중괄호({})를 생략할 수 없다.
- 모든 예외 클래스는 Exception 클래스의 자손이므로,
catch (Exception e)
와 같이 선언해 놓으면 어떠한 종류의 예외가 발생하더라도 이 catch 블럭에 의해 처리된다.- try블럭 안에 return문이 있어서 try블럭을 벗어나더라도 finally블럭은 실행된다.
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
try {
StringTokenizer st = new StringTokenizer(br.readLine());
} catch (IOException e) {
e.printStackTrace(); // 참조변수 e를 통해, 생성된 IOException인스턴스에 접근
}
}
e.printStackTrace()
: 예외 발생 당시 호출스택(Call Stack)에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다.
getMessage()
: 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
public class Main {
public static void main(String[] args) {
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st = new StringTokenizer(br.readLine());
...
}
}
throws IOException
을 통해 예외를 처리해주거나 try/catch문
을 통해 예외 처리를 해 주면 된다. 사용자 정의 예외 클래스를 만들 때 기존에는 Exception 클래스를 상속받아 checked 예외를 작성하곤 했지만, 요즘은 RuntimeException 클래스를 상속받아 선택적인 예외처리를 허용하는 방향으로 변화하고 있다.
try { System.out.write(list);}
catch (Exception e) {e.printStackTrace();}
catch (IOException e) {e.printStackTrace();}
catch (IOException e)
문은 영원히 실행되지 않는다. catch (IOException e)
을 위에 써주어야 한다. try {
System.out.write(list);
} catch (IOException e) {
e.printStackTrace();
} catch (Exception e) {
e.printStackTrace();
}
Source
ㅎㅎ 스크럼 시간에 예외처리 공부해봐야 겠다고 생각했는데 여기 잘 정리되어 있네요 감사합니다.