-
예외 잡기 (try, catch, finally문)프로그래밍/JAVA 자바 2021. 7. 29.반응형
package ex0727; import java.util.Scanner; public class Ex102_exception { public static void main(String[] args) { // 예외 처리 Scanner sc = new Scanner(System.in); int a,b,c; try { // (1)예외 발생할 가능성이 있는 코드를 작성 System.out.println("두 수 입력"); a = sc.nextInt(); b = sc.nextInt(); c = a/b; System.out.println(a+"/"+b+"="+c); } catch (Exception e) { // (2)예외가 일어났을때 실행할 코드 // Exception = 모든 예외를 catch할 수 있지만 예외 상황별로 분리 가능 System.out.println("에러 발생"); } //(3) System.out.println("end"); sc.close(); } }
예외 처리의 필요성
위 코드로 예를 들때 나누기 단계에서 0으로 나누면 에러가 발생한다
이때 미리 예외로 코드 내부에서 잡아두지 않으면 프로그램이 종료가 되기 때문에
오류가 일어날 때를 대비해야 한다.
Exception = 모든 에러를 잡아준다, 다른 에러 구문이랑 같이 쓰려면 맨 마지막에 두자
package ex0727; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Ex103_exceptrion { public static void main(String[] args) { // TODO Auto-generated method stub BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); // 버퍼를 이용하여 문자열을 입력 받음. 입력 속도 향상 String s; int a,b,c; try { System.out.println("첫번째 수?"); s=br.readLine(); // readLine()은 checked IOEexception이 발생하므로 반드시 예외 처리 해야함 a = Integer.parseInt(s); // 문자열을 숫자로 변환하지 못하면 // NumberFormatException 이라는 unchecked exception 발생 System.out.println("두번째 수"); b = Integer.parseInt(br.readLine()); c = a/b; System.out.println(a+"/"+b+"="+c); } catch (IOException e) { // IOException : 입출력에 문제가 발생할 때 발생하는 예외(checked exception) // checked exception 은 메소드를 정의할 때 throws를 한 예외임 // checked exception은 예외 처리를 하지 않으면 컴파일 에러가 발생하는 예외 e.printStackTrace(); // 에러 메세지를 표준 출력 장치에 출력 } // 0으로 나누거나 문자열이 입력되면 예외가 발생함 아래 메세지는 출력 안됨 System.out.println("end"); } }
e.printStackTrace(); = 에러를 자세하게 보여준다.
여러가지 예외를 선언
package ex0727; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; public class Ex104_exception { public static void main(String[] args) { // 여러가지 예외를 선언 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int a,b,c; try { System.out.println("첫번째 수 ?"); a = Integer.parseInt(br.readLine()); System.out.println("두번째 수 ?"); b = Integer.parseInt(br.readLine()); c = a/b; System.out.println(a+"/"+b+"="+c); } catch (IOException e) { // checked 예외(반드시 catch 해야 함) // TODO: handle exception e.printStackTrace(); } catch (NumberFormatException e) { // uncheked exception // 문자열을 숫자로 변경하지 못하는 경우 발생하는 에러 System.out.println("숫자만 입력 가능합니다"); System.out.println(e.getMessage()); //간단한 메세지 출력 System.out.println(e.toString()); // 예외 종료 및 간단한 메세지 e.printStackTrace(); //자세한 에러 메세지 및 에러 발생 줄도 표시 } catch (ArithmeticException e) { // uncheked exception // 숫자를 0으로 나누는 등 연산이 불가능한 경우에 발생하는 에러 System.out.println("0으로 나눌수 없습니다."); } catch (Exception e) { // Exception : 모든 예외를 catch할 수 있다. // 여러 예외를 catch 하는 경우에는 다른 예외 클래스의 상위 클래스이므로 // 가장 마지막에 위치해야 한다. e.printStackTrace(); } System.out.println("end"); } }
System.out.println(e.getMessage()); //간단한 메세지 출력
System.out.println(e.toString()); // 예외 종료 및 간단한 메세지
e.printStackTrace(); //자세한 에러 메세지 및 에러 발생 줄도 표시어떤 예외를 분류 해야 할지를 모를때
package ex0727; import java.io.BufferedReader; import java.io.InputStreamReader; public class Ex105_exception { public static void main(String[] args) { //어떤 예외를 분류 해야 할지를 모를때 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); int a,b,c; try { System.out.println("첫번째 수 ?"); a = Integer.parseInt(br.readLine()); System.out.println("두번째 수 ?"); b = Integer.parseInt(br.readLine()); c = a/b; System.out.println(a+"/"+b+"="+c); } catch (Exception e) { // Exception : 모든 예외를 catch할 수 있다. // 근데 이것만 쓰면 예외를 분류 할 수없다. e.printStackTrace(); } System.out.println("end"); } }
그냥 Exception로 모든 오류 처리를 해버리면 된다.
finally : 예외의 발생 여부와 상관없이 무조건 실행함.
package ex0727; import java.util.Scanner; public class Ex106_finally { public static void main(String[] args) { // TODO Auto-generated method stub Scanner sc = new Scanner(System.in); String [] ss = new String[3]; int idx; String s; try { idx=0; System.out.println("문자열 입력[종료 : 입력하지 않고 엔터]"); while( (s=sc.nextLine() ).length() != 0) { ss[idx++] = s; System.out.println("문자열 입력 : "); // 예외 발생하면 실행 되지 않는다. } } catch (ArrayIndexOutOfBoundsException e) { // ArrayIndexOutOfBoundsException : unchecked exception // 배열의 첨자가 벗어난 경우 발생하는 예외 System.out.println("입력을 초과 했습니다."); } finally { System.out.println("예외 발생 여부와 상관 없이 실행 합니다."); sc.close(); } System.out.println("\n입력 문자열"); for(String str : ss) { System.out.println(str); } } }
finally {
//finally 블럭에서 일반적으로 사용한 resource를 close한다.
sc.close();
}이런식으로 finally는 예외 관계없이 무조건 실행하기 때문에
InputMismatchException : 스캐너의 nextInt() 등에서 숫자가 아닌 문자열을 입력하면 발생하는 에러
ArithmeticException : 산술,연산이 불가능할때 나오는 에러
tryRecource
package ex0727; import java.util.InputMismatchException; import java.util.Scanner; public class Ex109_tryRecource { public static void main(String[] args) { // TODO Auto-generated method stub int n; String s; // JDK 7부터 가능 // try~with~resource : 자동으로 resource가 close() 됨. try (Scanner sc = new Scanner(System.in)) { System.out.println("나이 ?"); n = sc.nextInt(); s = n >= 19 ? "성인" : "미성년"; System.out.println(s + " 입니다."); } catch (InputMismatchException e) { System.out.println("숫자만 입력 가능합니다."); } System.out.println("end"); } }
try문에 리소스 넣으면 자동으로 클로즈가 된다.
반응형'프로그래밍 > JAVA 자바' 카테고리의 다른 글
throw, throws / 예외 주기 (2) (0) 2021.07.29 throw / throws (0) 2021.07.29 중첩 ,내부 ,익명 클래스 (0) 2021.07.28 추상 클래스 / 인터페이스 (0) 2021.07.26 오버라이드 / 오버로딩 / 클래스 상속 (0) 2021.07.24