-
컴파일에러
- 컴파일 시에 발생하는 에러
런타임에러
- 실행 시에 발생하는 에러
ArithmeticException
- 산술연산과정에서 발생한 오류로 인한 예외
예외가 발생하면, 발생한 예외에 해당하는 클래스의 인스턴스가 만들어진다.
모든 예외 클래스는 Exception클래스의 자손이므로, catch블럭의 괄호()에 Exception클래스 타입의 참조변수를 선언해 놓으면 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해서 처리된다.
instanceof
- 참조변수가 참조하고 있는 인스턴스의 실제 타입을 알아보기 위해 instanceof 연산자를 사용합니다. 주로 조건문에 사용되며, instanceof의 왼쪽에는 참조변수를 오른쪽에는 타입(클래스명)이 피연산자로 위치합니다. 그리고 연산의 결과로 boolean값인 true, false 중의 하나를 반환 합니다.
instanceof를 이용한 연산결과로 true를 얻었다는 것은 참조변수가 검사한 타입으로 형변환이 가능하다는 것을 뜻합니다.
[참고] 값이 null인 참조변수에 대해 instanceof 연산을 수행하면 false를 결과로 얻는다.
try-catch문의 마지막에 Exception클래스 타입의 참조변수를 선언한 catch블럭을 사용하면, 어떤 종류의 예외가 발생하더라도 이 catch블럭에 의해 처리되도록 할 수 있다.
printStacktrace()
- 예외발생 당시의 호출스택에 있었던 메서드의 정보와 예외 메시지를 화면에 출력한다. sysout사용해서 출력을 하는것이 아니다.
getMessage()
- 발생한 예외클래스의 인스턴스에 저장된 메시지를 얻을 수 있다.
예외발생시키기
- 먼저, 연산자 new를 이용해서 발생시키려는 예외 클래스의 객체를 만든 다음
Exception e = new Exception("고의로 발생시켰음");
인스턴스를 생성할 때, 생성자에 String을 넣어주면, 이 String이 Exception인스턴스에 메시지로 저장된다.
이 메시지는 getMessage()를 이용해서 얻을 수 있다.
- 키워드 throw를 이용해서 예외를 발생시킨다.
throw e;
메서드에 예외 선언하기
- void method() throws Exception {
//메서드의 내용
}
throw와 throws의 구분
자신(예외가 발생할 가능성이 있는 메서드)을 호출한 메서드에게 예외를 전달하여 예외처리를 떠맡기는 것이다.
예외를 전달받은 메서드가 또다시 자신을 호출한 메서드에게 전달할 수 있으며, 이런식으로 계속 호출스택에 있는 메서드들을 따라 전달되다가 제일 마지막에 있는 main메서드에서도 예외가 처리되지 않으면, main메서드마저 종료되어 프로그램 전체가 종료된다.
public static void main(String[] args) throws Exception { method1(); } static void method1() throws Exception { method2(); } static void method2() throws Exception { throws new Exception(); }
예외가 발생했을 때, 모두 3개의 메서드가 호출스택에 있었다는 것을 알 수 있다.
finally블럭
public static void main(String args[]) { try { startInstall(); copyFiles(); deleteTempFiles(); } catch (Exception e) { e.printStackTrace(); deleteTempFiles(); } // try-catch의 끝 } // main의 끝 static void startInstall() { //프로그램 설치에 필요한 준비를 하는 코드를 적는다. } static void copyFiles() { //파일 복사하는 코드를 적는다. } static void deleteTempFiles() { //임시파일들을 삭제하는 코드를 적는다. }
public static void main(String args[]) { try { startInstall(); copyFiles(); } catch (Exception e) { e.printStackTrace(); } finally { deleteTempFiles(); }// try-catch의 끝 } // main의 끝 static void startInstall() { //프로그램 설치에 필요한 준비를 하는 코드를 적는다. } static void copyFiles() { //파일 복사하는 코드를 적는다. } static void deleteTempFiles() { //임시파일들을 삭제하는 코드를 적는다. }
finally 블럭은 예외의 발생여부에 상관없이 실행되어야할 코드를 포함시킬 목적으로 사용된다.
문장수행중에 return문을 만나도 finally블럭의 문장들은 수행된다.
남궁성,『Java의 정석』,도우출판