1. 예외처리(Exception Handling)
Error(오류)와 Exception(예외사항)
오류 : 크게 컴파일 오류(Compile error)와 실행 오류(Runtime error)로 구분
Error는 프로그램이 실행될 수 없는 오류.
프로그램이 실행중에 처리할 수 없음.(코드를 고쳐야..)
Exception은 프로그램 실행 중에 발생하는 오류.
수습 코드를 통해 실행 중 해결할 수 있는 오류.
예외 처리란 수습 코드를 작성하여 사전에 예외로 인한
프로그램의 비정상적 종료를 미연에 방지하는 작업.
주요 예외 사항
ArithmeticException : 수학적으로 해결할 수 없는 예외
NullPointException : 인스턴스가 생성되지 않았다.
ArrayIndexOutOfBoundsException : 배열 범위 밖.
NumberFormatException : 숫자로 변환할 수 없음.
IOException : 입출력 예외(파일 입출력 포함)
SQLException : DB 처리 관련 예외
예외 사항의 처리
try, catch, finally 구문으로 처리
try(시도하다)
예외사항이 발생될 수 있는(가정) 코드를 작성하는 부분.
정상적으로 처리될 수도 있으며, 코드를 작성할 때는
잘 처리될 것으로 생각하며 작성함.
catch(예외사항을 잡아서 처리하다)
try 부분에서 예외사항이 발생되면 처리해야할
작업 코드를 작성하는 부분.(문제에 대한 출력문 등..)
catch 부분은 예외사항에 따라 여러개가 존재할 수 있음.
finally(반드시 마지막에 실행하다)
생략할 수 있는 부분. 예외가 없어도, 예외가 있어도
마지막에 실행되야하는 코드를 작성하는 부분.
마지막에 실행할 작업이 없으면 작성하지 않아도 됨.
처리 순서
1. 정상적으로 처리될 경우
try 부분 -> finally 부분(작성했을 경우)
2. 예외가 발생했을 경우
try 부분 -> catch 부분 -> finally 부분(작성했을 경우)
예외처리 방식
1. 메소드 안에서 자체적으로 처리
try, catch 구문을 사용
2. 호출한 메소드에서 처리하도록 예외를 넘김
반환형 메소드() throws 예외사항 { ... }
메소드를 호출한 위치에 try, catch를 사용하여 예외를 처리해야함.
Multi-catch
catch부분은 여러개를 작성할 수 있음.
예)
try {
//숫자 입력 처리
//나눗셈 처리
} catch(NumberFormatException ne) { //(1)
.... //숫자를 입력해야 합니다.
} catch(ArithmeticException ae) { //(2)
.... //0으로 나눌 수 없습니다.
} catch(Exception e) { //(3)
.... //그 외의 예외사항 처리
}
작성 순서대로 실행됨.
(1)이 아니면 (2), (2)도 아니면 (3) catch부분 실행.
마지막에 큰 범위의 예외사항이 와야 함.
(예외사항 클래스 계층도를 조사해 보세요.)
호출하는 메소드에게 예외사항 전달(throws 키워드)
throws Exception클래스1, Exception클래스2.., Exception클래스n
메소드 선언 뒤쪽에 throws 키워드를 사용하여 예외사항 클래스를
입력하면 호출한 메소드에 발생한 예외사항을 넘길 수 있음.
다양한 예외사항을 처리해야 할 경우 ','로 구분하여 여러개의
예외사항 클래스를 입력할 수 있음.
예외사항 일부러 발생시켜서 처리하기
예외 사항 인스턴스를 만들어서 보내기.
Exception 클래스로 예외사항 인스턴스를 생성.
- 생성 시 메시지로 사용할 문자열 추가.
Exception ex = new Exception("메시지");
- throw 키워드를 사용하여 예외 인스턴스 전달
throw ex;
이 때 메소드는 예외를 전달해야 하기 때문에
throws로 예외를 선언해야 함.
public void method() throws Exception { ... }
나만의 Exception 클래스를 만들자!
에러 코드와 메시지를 갖는 예외 클래스 만들기
작성 단계
1. Exception 클래스를 상속하여 새로운 클래스(MyException)
작성
2. 작성한 새로운 클래스로 인스턴스 생성
3. 생성 시 메시지, 에러코드 등 값 추가
4. 새로 만든 예외사항임을 알려야 함.
throws 뒤에 클래스이름을 작성.
5. 메소드를 호출하는 곳에서 새로운 클래스로 catch 처리.
catch 부분에서 새로운 클래스의 정보를 출력 및 처리.
import java.util.Scanner;
public class CalculatorTest {
static Scanner scan = new Scanner(System.in);
public static void main(String[] args) {
String menu = "";// 메뉴 입력
while(true) {
System.out.println();
System.out.println("예외처리 계산기");
System.out.println("1. 덧셈");
System.out.println("2. 뺄셈");
System.out.println("3. 나눗셈");
System.out.println("4. 예외 발생");
System.out.println("0. 종료");
System.out.print("선택>> ");
menu = scan.nextLine();
if(menu.equals("0")) {
System.out.println("종료");
break;
}
switch(menu) {
case "1"://덧셈 처리(예외사항 자체 처리)
add();
break;
case "2"://뺄셈 처리(예외사항 떠넘기기)
try {
subManage();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("숫자를 입력해 주세요.");
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
break;
case "3"://나눗셈 처리(자체 처리도 하고 떠넘기기도 하고)
try {
div();
} catch (NumberFormatException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("숫자를 입력해 주세요.");
}
break;
case "4"://예외를 일부러 발생 시켜서 처리해 보기.
try {
makeException();
} catch (MyException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println(e.getMessage());
System.out.println("에러코드: " + e.getErrCode());
}
break;
}
}
}
private static void makeException() throws MyException {
//특정 문구를 가진 예외 인스턴스 만들기
//Exception myexp = new Exception("일부러 만든 예외사항~");
//만든 예외 던지기
MyException myexp =
new MyException("페이지를 찾을 수 없습니다.", 404);
throw myexp;
}
private static void div() throws NumberFormatException {
int n1, n2, rs;
String str;
System.out.println("나눗셈 연산");
System.out.print("첫번째 수: ");
str = scan.nextLine();
n1 = Integer.parseInt(str);
System.out.print("두번째 수: ");
str = scan.nextLine();
n2 = Integer.parseInt(str);
try {
rs = n1 / n2;
} catch (ArithmeticException e) {
// TODO Auto-generated catch block
//e.printStackTrace();
System.out.println("0으로 나눌 수 없습니다.");
rs = 0;
}
System.out.println("계산 결과 : " + rs);
}
private static void sub() throws NumberFormatException, Exception {
int n1, n2, rs;
String str;
System.out.println("뺄셈 연산");
System.out.print("첫번째 수: ");
str = scan.nextLine();
n1 = Integer.parseInt(str);
System.out.print("두번째 수: ");
str = scan.nextLine();
n2 = Integer.parseInt(str);
rs = n1 - n2;
System.out.println("계산 결과 : " + rs);
}
private static void add() {
int n1, n2, rs;
String str;
System.out.println("덧셈 연산");
try {
System.out.print("첫번째 수: ");
str = scan.nextLine();
n1 = Integer.parseInt(str);
System.out.print("두번째 수: ");
str = scan.nextLine();
n2 = Integer.parseInt(str);
rs = n1 + n2;
System.out.println("계산 결과 : " + rs);
} catch(Exception ne) {
System.out.println("숫자를 입력해 주세요.");
} finally {//없을 수도 있음.
System.out.println("덧셈 연산이 끝났습니다.");
}
}//add 끝
public static void subManage()
throws NumberFormatException, Exception {
sub();
}
}//Calculator class 끝
class MyException extends Exception {
//에러 코드 저장 필드
private final int ERR_CODE;
public MyException(String msg, int eCode) {
super(msg);
ERR_CODE = eCode;
}
public int getErrCode() {
return ERR_CODE;
}
}
'JAVA' 카테고리의 다른 글
JAVA(23) - 실습 <제품 관리프로그램> /응용실습 - <데이트 관리프로그램> (0) | 2020.04.11 |
---|---|
JAVA(21) - Super/부모클래스 생성자 생성 방법/생성자들의 실행 순서 (0) | 2020.03.30 |
JAVA(20) - 캡슐화(정보 은닉)/상속/상속의 장점/상속의 계층화/상속과 포함관계를 모두 사용한 새로운 클래스 작성/클래스 상속 받는 방법/상속 실습 프로젝트 만들어보기/Override (오버라이드)/.. (0) | 2020.03.27 |
JAVA(19) - 생성자/기본 생성자/메소드 오버로딩/Method Overloading/ (0) | 2020.03.18 |
JAVA(18) - 콜백함수/(STATIC/인스턴스)메소드에서 호출 (0) | 2020.03.17 |