보통 문법적인 오류사항이나 로직 자체의 오류 사항에 대해서는 컴파일러가 사전에 에러 사항을 찾아준다. 하지만 정수 자리에 문자 입력 등 사용자에 의해 발생하는 예외 사항에 대해서는 예외처리를 해주어야 한다. try-catch-finally 와 throws를 이용해서 예외처리를 해줄 수 있다.
package javaAPI;
import java.util.Scanner;
public class TryCatch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
System.out.println("사칙연산 계산기");
int num1 = 0;
char op = 'a';
int num2 = 0;
num1 = sc.nextInt();
op = sc.next().charAt(0);
num2 = sc.nextInt();
switch(op) {
case '+':
System.out.println(num1 + num2);
break;
case '-':
System.out.println(num1 - num2);
break;
case '*':
System.out.println(num1 * num2);
break;
case '/':
System.out.println(num1 / num2);
break;
}
}
}

예외사항 발생 (숫자에 문자 입력)

다음 그림과 같이 콘솔창에 java.util.InputMismatchException 이라는 에러 내용을 출력해준다. 이것을 복붙하여 try-catch문을 작성해준다.
예외사항 처리 (try-catch 블럭 작성)
package javaAPI;
import java.util.Scanner;
public class TryCatch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("사칙연산 계산기");
int num1 = 0;
char op = 'a';
int num2 = 0;
num1 = sc.nextInt();
op = sc.next().charAt(0);
num2 = sc.nextInt();
switch(op) {
case '+':
System.out.println(num1 + num2);
break;
case '-':
System.out.println(num1 - num2);
break;
case '*':
System.out.println(num1 * num2);
break;
case '/':
System.out.println(num1 / num2);
break;
}
}
catch(java.util.InputMismatchException e) {
System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
}
sc.close();
}
}
ex) 나눗셈에서 0으로 나누는 예외 사항을 처리해 주었습니다.

package javaAPI;
import java.util.Scanner;
public class TryCatch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("사칙연산 계산기");
int num1 = 0;
char op = 'a';
int num2 = 0;
num1 = sc.nextInt();
op = sc.next().charAt(0);
num2 = sc.nextInt();
switch(op) {
case '+':
System.out.println(num1 + num2);
break;
case '-':
System.out.println(num1 - num2);
break;
case '*':
System.out.println(num1 * num2);
break;
case '/':
System.out.println(num1 / num2);
break;
}
}
catch(java.util.InputMismatchException e) {
System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
}
catch(java.lang.ArithmeticException e) {
System.out.println("0으로 다른 수를 나눌 수는 없습니다.");
}
sc.close();
}
}
package javaAPI;
import java.util.Scanner;
public class TryCatch {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
try {
System.out.println("사칙연산 계산기");
int num1 = 0;
char op = 'a';
int num2 = 0;
num1 = sc.nextInt();
op = sc.next().charAt(0);
num2 = sc.nextInt();
switch(op) {
case '+':
System.out.println(num1 + num2);
break;
case '-':
System.out.println(num1 - num2);
break;
case '*':
System.out.println(num1 * num2);
break;
case '/':
System.out.println(num1 / num2);
break;
}
}
catch(java.util.InputMismatchException e) {
System.out.println("정수 숫자 자리에 문자가 입력되었습니다.");
}
catch(java.lang.ArithmeticException e) {
System.out.println("0으로 다른 수를 나눌 수는 없습니다.");
}
catch(Exception e) {
System.out.println("문자 입력과 0으로 나누는 것 이외의 예측 못한 예외 사항 발생");
}
sc.close();
}
}
메소드 내부에서 예외를 직접 처리하지 않고, 해당 메소드를 호출하는 곳에서 예외처리하는 방법.
import java.util.*;
public class TryCatch {
public void throwsTest() throws InputMismatchException {
int num1 = 0;
Scanner sc = new Scanner(System.in);
num1 = sc.nextInt();
System.out.println(num1);
sc.close();
}
public static void main(String[] args) {
TryCatch tc = new TryCatch();
try {
tc.throwsTest();
}
catch(InputMismatchException e) {
System.out.println("잘못된 입력 타입입니다.");
}
}
}