-
[Java_Basic]예외처리(윤성우의 열혈 Java 프로그래밍)Java/Basic 2021. 1. 2. 19:47
예외
예외적인 상황. 문법 오류가 아닌 정상적이지 않은 상황. 일반적인 예외 상황이란 사용자가 만드는 예외상황
예외 처리
예외 상황에 대한 처리를 의미. 자바는 예외처리 메커니즘을 제공한다.
import java.util.Scanner; class ExceptionCase{ public static void main(String[] args){ Scanner kb = new Scanner(System.in); 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); System.out.println("Good bye~~!"); } }
예외 클래스 : 예외 상황을 알리기 위해 만들어진 클래스
java.lang.ArithmeticException
->수학 연산에서의 오류 상황을 의미하는 예외 클래스
java.util.InputMismatchException
->클래스 scanner를 통한 값의 입력에서의 오류 상황을 의미하는 예외 클래스
try ~ catch
예외의 처리를 위한 코드를 별도로 구분하기 위해 디자인 된 예외처리 메커니즘
try{
...관찰 영역...
}
catch(ArithmericException e){
...처리 영역...
}
try 영역에서 발생한 예외 상황을 catch 영역에서 처리한다.
import java.util.Scanner; class ExceptionCase2{ 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(ArithmeticException e){ System.out.println(e.getMessage()); } System.out.println("Good bye~~!"); } }
import java.util.Scanner; import java.util.InputMismatchException; class ExceptionCase4{ 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(ArithmeticException e){ System.out.println(e.getMessage()); } catch(InputMismatchException e){ System.out.println(e.getMessage()); } System.out.println("Good bye~~!"); } }
import java.util.Scanner; import java.util.InputMismatchException; class ExceptionCase5{ 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(ArithmeticException | InputMismatchException e){ System.out.println(e.getMessage()); } System.out.println("Good bye~~!"); } }
Throwable 클래스
java.lang.Throwable 클래스 : 모든 예외 클래스의 최상위 클래스
public String getMessage() -> 예외의 원인을 담고 있느 문자열을 반환
public void printStackTrace() -> 예외가 발생한 위치와 호출된 메소드의 정보를 출력
class ExceptionMessage2 { public static void md1(int n) { md2(n, 0); } public static void md2(int n1, int n2) { int r = n1 / n2; } public static void main(String[] args) { try { md1(3); } catch(Throwable e) { e.printStackTrace(); } System.out.println("Good bye~~!"); } }
class ArrayIndexOutOfBounds { public static void main(String[] args) { int[] arr = {1, 2, 3}; for(int i = 0; i < 4; i++) System.out.println(arr[i]); } }
class Board { } class PBoard extends Board { } class ClassCast { public static void main(String[] args) { Board pbd1 = new PBoard(); PBoard pbd2 = (PBoard)pbd1; // OK! System.out.println(".. intermediate location .. "); Board ebd1 = new Board(); PBoard ebd2 = (PBoard)ebd1; // Exception! } }
class NullPointer { public static void main(String[] args) { String str = null; System.out.println(str); // null 출력 int len = str.length(); // Exception! } }
예외 클래스의 구분
Error 클래스를 상속하는 예외 클래스
Exception 클래스를 상속하는 예외 클래스
RuntimeException 클래스를 상속하는 예외 클래스
Error 클래스 / 만들어졌을때 코드레벨의 오류가 아님
VirtualMachineError 가상 머신에 심각한 오류
IOError 입출력 관련해서 코드 수준 복구가 불가능한 오류 발생
RuntimeException 클래스 / 에러같지만 예외인 애매한 클래스
ArithmeticException
ClassCastException
IndexOutOfBoundException
Exception 클래스를 상속하는 예외 클래스
IOException
throws IOException 을 통해 해당 구문에서 발생한 오류를 던져버리겠다 나를 부른 아이에게!
직접 정의하는 예외
논리적인 예외일 경우
class ReadAgeException extends Exception{ public ReadAgeException(){ super("유효하지 않은 나이가 입력되었습니다."); } //Throwable 클래스의 getMessage 메소드가 반환할 문자열 지정 }
import java.util.Scanner; class ReadAgeException extends Exception { public ReadAgeException() { super("유효하지 않은 나이가 입력되었습니다."); } } class MyExceptionClass { public static void main(String[] args) { System.out.print("나이 입력: "); try { int age = readAge(); System.out.printf("입력된 나이: %d \n", age); } catch(ReadAgeException e) { System.out.println(e.getMessage()); } } public static int readAge() throws ReadAgeException { Scanner kb = new Scanner(System.in); int age = kb.nextInt(); if(age < 0) throw new ReadAgeException(); return age; } }
if(age < 0)
throw new ReadAgeException();직접 예외의 상황을 설정함
finally 구문
마지막에 담기 위한 구문
try{...
}
finally{...
}
또는
try{...
}
catch(Exception name){...
}
finally{...
}
try-with-resources
try 구문을 빠져 나갈 때, 다음 문장을 안정적으로 자동 실행
writer.close();
'Java > Basic' 카테고리의 다른 글
[Java_Basic]자바의 메모리 모델과 Object 클래스(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.06 [Java_Basic]자바 가상머신의 메모리 모델(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.05 [Java_Basic]인터페이스와 추상 클래스(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02 [Java_Basic]클래스의 상속3 : 상속의 목적(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02 [Java_Basic]클래스의 상속 2 : 오버라이딩(윤성우의 열혈 Java 프로그래밍) (0) 2021.01.02