본문 바로가기

IT일반과목/java

예외처리3 finally까지 써보기

예외처리

에러에 대한 처리를 할려고 한다.


- 예외처리(Exception)

 -> 예외란 -> 예기치못한 상황

 -> 수많은 오류들경험

 -> 자바에서는 예외란 프로그램을 만든 프로그래머가 예상한 정상적인 처리에서 벗어나는 경우


에 이를 처리하기 위한 방법

 -> 예측이 가능한 에러를 처리하는것


- 예외처리의 이유?

 -> 비정상종료를 막고, 정상적인 실행상태를 유지하기 위해

 -> 어떻게? -> 예외상황이 발생하면 그경우의 처리로직을 만듬


try ~ catch를 쓴다.


try{

에러가 예측이 되는 실행코드

}catch (Exception e) {

에러가 발생했을때 실행코드

}



=======================================================


int a=10;

int b=0;

try{

a/b;

}catch (Exception e) {

}

=====================================================

Exception은 하나의 클래스이고 에러에 대한 최고의 조상 클래스이다.

발생하는 메시지를 보여줘

System.out.println(e.getMessage()); //어떤 에러가 났는지 말해주는 것이다.


에러가 날경우 빨간줄 보면 첫줄뒤에 어떤에러인지 표시가 되어있는데 그걸 getMessage()라고 


부르고 그거에대한게 나오는게 getMessage()이다.



===========================================================


try{

예외가 발생할 소지가 있는 실행코드

}catch (Exception e) {

예외가 발생한 경우 실행코드

}finally{

try를 하건 catch하건 무조건 수행

}

//finally는 무조건 수행된다.

finally를 쓰는 이유?

-> App은 DB랑 연동해서 사용한다. 

-> 정상적으로 DB서버에 연결하고 사용하고있으면 마지막에 DB와의 연결을 끊어주는 역할

-> 비정상적으로 에러가발생한경우 이러한 경우에도 DB와의 연결을 끊어주기위해서 사용



예외의 종류

Exception 상속도.jpg사진 받기

상속도를 봤을때 제일 조상이 Throwable이다.

Throwable : 예외의 가장 큰 조상

-> 우리가 구현하지 않는다.


Error : 개발자가 소스코드로 해결할 수 없는 에러(시스템 에러)

-> 우리가 처리하지 않음


Exception : 개발자가 소스코드로 해결할 수 있는 에러(코드 에러)



그림을 보면 점선을 아래로 

RuntimeException은 우리의 부주의이다.


RuntimeException : Exception의 자식, Unchecked Exception이다.

 -> 주로 프로그래머의 부주의로 인한 버그가 많다.

 -> 예외처리보다는 코드를 수정해야하는 경우가 많다.


1. ArithmeticException - 연산에 대한 에러

 -> 0으로 나누는 경우

2. NullPointerException

 -> 주소값을 할당하지 않고 참조형변수 호출한 경우

3. NegativeArraySizeException

 -> 배열크기를 음수로 하거나 0으로 지정한 경우

4. ArrayIndexOutOfBoundException

 -> 배열의 index번호 넘어서 호출한경우

 int [] arr = new int [5];

arr[5]; -> 이런거 호출할때 발생하는 에러


=============================================================

=============================================================


package jongkyu.test;


import java.util.Scanner;


public class Exam {

Scanner sc = new Scanner(System.in);

public void main() {

while(true) {

System.out.print("첫번째 수 입력 : ");

int su1 = sc.nextInt();

System.out.print("두번째 수 입력 : ");

int su2 = sc.nextInt();


try {

//에러가 예측이 되는 코드

int result = su1/su2;

System.out.println("결과 : "+result);

System.out.println("감사합니다.");

} catch (Exception e) {//하나의 클래스이고 에러에 대한 최고의 조상클래스

// TODO: handle exception

System.out.println(e.getMessage());

System.out.println("0으로는 나눌수 없습니다.");

}


}


}


public void menuPrint() {

System.out.println("======== 메뉴 선택 ===========");

System.out.println("1. 반갑습니다. 출력");

System.out.println("2. 잘지내세요. 출력");

System.out.println("3. 또만나요. 출력");

System.out.print("입력 : ");

}

public void selPrint(int choice) {

switch(choice) {

case 1 : System.out.println("반갑습니다. "); break;

case 2 : System.out.println("잘지내세요. "); break;

case 3 : System.out.println("또 만나요"); break;

default : System.out.println("1~3에서 선택해주세요");

}

}

public void start() {

int choice = 0;

menuPrint();

try {

choice = sc.nextInt();

selPrint(choice);

} catch (Exception e) {

// TODO: handle exception

System.out.println("숫자를 입력해주세요");

}finally {

System.out.println("시스템을 종료합니다.");

}//무조건 수행된다.

//finally는 왜쓰냐면

}


}