일반 예외 : RuntimeException 클래스를 상속받지 않는 예외클래스로 예외처리
실행 예외 : RuntimeException 클래스를 상속받는 예외클래스로 예외처리
try ~ catch 구문 사용
형식)
try {
예외가 발생될 수 있는 명령;
...
} catch (예외클래스 참조변수 e ) {
예외처리 명령;
...
} finally {
예외에 상관없이 무조건 실행될 명령;
}
예외가 발생된 명령에서 발생된 예외를 메소드를 이용하여 전달 가능
메소드에서 발생된 모든 예외를 Exception 클래스(모든 예외클래스의 부모클래스) 하나로 전달 가능
인위적으로 예외 객체를 생성하여 예외를 발생시키는 명령
public class ExceptionHandleApp {
public static void main(String[] args) {
int[] array={10,20,30,40,50};
try {
for(int i=0;i<=array.length;i++) {
System.out.println("array["+i+"] = "+array[i]);
}
//예외가 발생된 경우 예외 발생 명령 하단에 존재하는 명령 미실행
//예외 발생된 경우 프로그램은 강제 종료 or catch 블럭으로 이동
System.out.println("[메세지]프로그램이 정상적으로 실행");
} catch (ArrayIndexOutOfBoundsException e) {
//프로그램 사용자에게는 예외 관련 메세지 출력 (생략 가능)
System.out.println("[에러]프로그램 실행에 오류가 발생");
//프로그램 개발자에게는 예외 관련 메세지를 기록하여 전달 (에러 로그:필수)
//예외 객체를 전달받아 참조변수에 저장하여 예외처리시 사용
//Throwable.getMessage() : 예외 메세지를 문자열로 반환하는 메소드
System.out.println("[예외]"+e.getMessage());
e.printStackTrace();
//예외가 발생된 경로를 역추적하여 발생된 상세정보를 제공받아 출력하는 메소드
} finally {//생략 가능
System.out.println("[메세지]예외와 상관없이 무조건 실행되는 명령"); }}}
public class ExceptionThrowsApp {
public static void display() throws ArrayIndexOutOfBoundsException {
int[] array={10,20,30,40,50};
for(int i=0;i<=array.length;i++) {
System.out.println("array["+i+"] = "+array[i]); }}
public static void main(String[] args) {
try {
//정적메소드는 클래스 이름을 이용하여 호출
//같은 클래스에 선언된 정적메소드는 클래스 표현 없이 메소드 호출 가능
display();
//일반 예외시 컴파일 에러가 발생되고 실행 예외시 JVM에 의해 자동으로 예외처리
} catch (ArrayIndexOutOfBoundsException e) {
System.out.println("[에러]프로그램 실행에 오류 발생"); }}}
키보드로 정수값 2개를 입력받아 첫번째 정수값으로 두번째 정수값을 나눈 몫을 계산하여 출력하는 프로그램 작성
메소드에서 발생된 모든 예외를 Exception 클래스 하나로 전달 가능
catch 블럭에서 예외클래스를 | 연산자로 연결하여 다수의 예외에 대한 처리 가능
public class CalcApp {
public CalcApp() throws InputMismatchException, ArithmeticException {
//public CalcApp() throws Exception {
//메소드에서 발생된 모든 예외를 Exception 클래스 하나로 전달 가능
Scanner scanner=new Scanner(System.in);
System.out.print("첫번째 정수값 입력 >> ");
//Scanner.nextInt() : 입력값을 정수값으로 변환하여 반환하는 메소드
//입력값이 정수값으로 변환되지 못할 경우 InputMismatchException 발생
// → 직접 예외처리하지 않고 메소드를 사용하여 발생 예외 전달 가능
int num1=scanner.nextInt();
System.out.print("두번째 정수값 입력 >> ");
int num2=scanner.nextInt();
//어떤수를 0으로 나눈 경우 ArithmeticException 발생
System.out.println("[결과]"+num1+" / "+num2+" = "+(num1/num2));
scanner.close();
}
public static void main(String[] args) {
try {
//생성자를 이용하여 객체 생성 (생성자의 명령 실행)
// → 예외가 전달된 메소드 호출 - 예외처리
new CalcApp();
} catch (InputMismatchException e) {
System.out.println("[에러]정수값만 입력 가능합니다.");
} catch (ArithmeticException e) {
System.out.println("[에러]0으로 나눌수 없습니다.");
} catch (Exception e) {
//모든 예외 객체를 전달받아 참조변수에 저장하여 예외처리 가능
System.out.println("[에러]프로그램에 오류 발생");}
try {
new CalcApp();
} catch (InputMismatchException | ArithmeticException e) {
//catch 블럭에서 예외클래스를 | 연산자로 연결하여 다수의 예외 처리 가능
System.out.println("[에러]형식에 맞는 값을 입력해 주세요.");
} catch (Exception e) {
System.out.println("[에러]프로그램에 오류가 발생"); }}}
public class PasswordMatchApp {
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
try {
System.out.print("비밀번호 입력 >> ");
int password=scanner.nextInt();//InputMismatchException 발생 가능
if(password!=123456) {
//인위적으로 예외 객체를 생성하여 예외를 발생시키는 명령
throw new PasswordMismatchException("입력된 비밀번호가 다릅니다.");
}
//인위적 예외가 발생되지 않을 경우 실행되는 명령
System.out.println("[결과]입력된 비밀번호가 맞습니다.");
} catch (InputMismatchException e) {
System.out.println("[에러]숫자만 입력 가능합니다.");
} catch (PasswordMismatchException e) {
System.out.println(e.getMessage());
} finally {
scanner.close(); }}}
public class PasswordMismatchException extends Exception {
private static final long serialVersionUID = 1L;
public PasswordMismatchException() { }//기본생성자
public PasswordMismatchException(String message) {
//Exception 클래스에는 예외 메세지를 저장하기 위한 필드 선언
//super 키워드를 사용하여 Exception 클래스의 필드에 초기값(예외 메세지) 저장
super(message); }}