try - catch
•
에러가 나면 프로그램이 강제 종료된다. 강제 종료되는 것을 막기 위한 문법
import java.util.InputMismatchException;
import java.util.Scanner;
public class ExceptionTest {
public static void main(String[] args) {
Scanner kb = new Scanner(System.in);
try{
System.out.print("a/b... a? ");
int n1 = kb.nextInt();
System.out.print("a/b... b? ");
int n2 = kb.nextInt();
System.out.printf("%d / %d = %d \n", n1, n2, n1/n2);
}catch (Exception err) {
err.printStackTrace(); // 에러 원인 메세지 출력
System.out.println(err.getMessage());
}finally {
System.out.println("finally 내부. 무조건 실행.");
}
System.out.println("try-catch 바깥");
}
}
Java
복사
예제 코드를 보자.
try 문 내부의 System.out.printf("%d / %d = %d \n", n1, n2, n1/n2); 에서 n2에 0이 들어가면 에러가 난다.
이 때 생기는 에러를 catch 문에서 Exception err 로 잡는다.
에러가 잡혔으니 catch 내부의 문장을 실행한다.
finally 문은 항상 작동한다.
// 에러 원인 메세지 출력((에러가 뜨고 break 된 위치를 알려줌))
err.printStackTrace();
// 에러 원인만 출력
System.out.println(err.getMessage());
Java
복사
catch 문의 예외처리 종류는 많다.
catch (InputMismatchException err) {
System.out.println(err.getMessage());
}catch (ArithmeticException err) {
System.out.println(err.getMessage());
}catch (Exception err) {
System.out.println(err.getMessage());
}
Java
복사
입력 타입이 다르거나, 0으로 나누거나 등 각 상황에 맞는 예외처리가 있다.
모든 예외 처리의 부모 예외처리가 있다. Exception 를 쓰면 다 처리가 된다.
Exception 이 catch 에서 선언될 때, 맨 위에서 선언되어야 한다
→ 컴파일러가 Exception 이 부모라서 모든 에러를 처리할 수 있다는 걸 안다.
→ 그래서 아래의 다른 예외처리 문은 쓸모없다고 생각해 컴파일 에러가 남
catch (Exception err) {
System.out.println(err.getMessage());
}catch (ArithmeticException err) {
System.out.println(err.getMessage());
}catch (InputMismatchException err) {
System.out.println(err.getMessage());
}
Java
복사
→ 이런 식이면 컴파일 에러
throws
예외처리를 호출한 함수에게 맡기는 것
import java.io.FileReader;
import java.io.IOException;
public class ExceptionTest_3 {
public static void main(String[] args) throws IOException {
// 예외처리를 호추한 함수(여기선 main)에게 맡긴다
// JVM 에게 IOException 을 던지겠다(내가 처리 안하고)
// >> 테스트용으로 에러처리 안하겠다.
FileReader fr = new FileReader("test.txt");
fr.read();
byte[] byteArr = {'a', 'b', 'c'};
System.out.write(byteArr);
}
}
Java
복사
public static void main(String[] args) throws IOException, InputMismatchException {
}
}
Java
복사
위처럼 여러개의 예외처리를 throw 할 수 있다.
예외 클래스 구분.
노란색 박스 부분: Checked Exception
그 외 부분: Unchecked Exception
자주 쓰이는 예외 클래스가 있다.