import java.util.Scanner;
public class MulDiv1 {
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
System.out.print("x값: "); int x = stdIn.nextInt();
System.out.print("y값: "); int y = stdIn.nextInt();
System.out.println("x * y = "+ (x*y));
System.out.println("x / y = "+ (x/y));
}
}
런타임 오류와 try구문
위의 프로그램에서 오류가 날 수 있는 경우는 다음과 같다.
- 변수 y에 "ABC"가 입력된 경우.
java.util.InputMismatchException
- 변수 y에 숫자 0이 입력된 경우.
java.lang.ArithmeticException
프로그램에서 사용되는 클래스와 메서드 등에서 예외를 적절히 처리하는 것이 중요하다.
예외를 발생시키는 것을 "예외를 던진다 throw
라고 표현한다. 던진 예외를 포착해서 대응하는 구문이 try 구문
이다. try 구문은 3개의 부분으로 구성된다.
- try 블록 : try 바로 뒤에 실행할 구문이 포함되는 블록이다.
- catch절 : try 구문에서 예외가 발생했을 때 실행할 구문으로 괄호( ) 안에 예외명을, { } 블록 안에 실행할 구문을 포함한다.
- finally절 : try 절의 예외 발생 여부에 상관 없이 반드시 실행될 구문이다.
finally절이 있는 구문을 try-catch-finally
구문이라고 하며, 없는 구문을 try-catch
구문이라고 한다.
위의 MulDiv1을 수정한 다음 예제 코드를 보자.
import java.util.InputMismatchException;
import java.util.Scanner;
public class MulDiv2 {
static int mul(int x, int y) {
return x * y;
}
static int div(int x, int y) {
return x / y;
}
static void muldiv(int x, int y) {
System.out.println("x * y = "+mul(x, y));
System.out.println("x / y = "+div(x, y));
}
public static void main(String[] args) {
Scanner stdIn = new Scanner(System.in);
try {
System.out.print("x값: "); int x = stdIn.nextInt();
System.out.print("y값: "); int y = stdIn.nextInt();
muldiv(x, y);
}catch (InputMismatchException e) {
System.out.println("입력 오류 발생."+e);
e.printStackTrace();
} catch (ArithmeticException e) {
System.out.println("산술 오류 발생."+e);
e.printStackTrace();
}finally {
System.out.println("프로그램을 종료합니다.");
}
}}
결과
x값: 3
y값: 0
x * y = 0
산술 오류 발생.java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
프로그램을 종료합니다.
at TryFirstProjject/chap16.MulDiv2.div(MulDiv2.java:12)
at TryFirstProjject/chap16.MulDiv2.muldiv(MulDiv2.java:17)
at TryFirstProjject/chap16.MulDiv2.main(MulDiv2.java:26)
자바의 예외 핸들러와 스택트레이스
- 위의 catch절에 예외명으로 기술되는 것이 핸들러(handler)이다.
- 첫 번째 예외 핸들러는
java.util.InputMismatchException
이고, 2번째 예외 핸들러는java.lang.ArithmeticException
이다. - 결과에서 오류 구문을 살펴보면, 먼저 "산술 오류 발생"을 출력 후, e 변수에 저장된 핸들러가 출력된다.
산술 오류 발생.java.lang.ArithmeticException: / by zero
java.lang.ArithmeticException: / by zero
프로그램을 종료합니다.
- 그 다음 실행되는 부분이
e.printStackTrace();
인데, 메서드가 호출되며 예외가 메서드를 거치면서 전파되는 과정이 표시된다. - 처음 div 메소드에서 예외가 발생하여 실행이 중단된다 → muldiv 메소드의 17번 행으로 돌아가 역시 메소드가 중단된다 → 예외의 근원지인 main 메서드의 실행도 중단된다.
- 이처럼 예외를 호출한 위치를 역순으로 표시하는 것을
stacktrace
라고 한다.
'Java > Java 기초' 카테고리의 다른 글
Java32 Exception 클래스와 RuntimeException 클래스 (0) | 2020.06.15 |
---|---|
Java31 예외 클래스- Throwable 클래스 (0) | 2020.06.12 |
Java29 String.equals, compareTo, String.format메서드 (0) | 2020.06.09 |
Java28 String. intern, length, charAt, indexOf (0) | 2020.06.08 |
Java27 문자와 문자열, 유니코드와 유니코드 확장 (0) | 2020.06.05 |