Java/이론

[Java] 에러 핸들링

Puft 2024. 12. 16. 12:10

프로그램 실행할 때 콘솔창에 빨간글씨로 ~~~ 나오는 것을 뭐라고할까요?

 

3가지 정도로 생각해볼 수 있습니다.

 

error 

warning

exception

 

차례차례 살펴보겠습니다.

 

error는 Java의 문법에 안맞게 써서 컴파일이 불가능한 상태입니다.

에러가 발생하게 된 원인은 오롯이 개발자의 잘못입니다.

에러가 난 상태에서 실행하면 완성본은 절대 나오지 않습니다.

 

Warining은 지저분한 형태의 코드를 말합니다.

이 역시도 개발자 잘못인데 컴파일은 가능하니

완성본은 나오게됩니다.

하지만 이클립스가 경고문을 출력합니다.

ex) Scanner 객체 만들고 나서 이 기능을 안 닫을시 경고문 출력

 

Excaption은 프로그램이 100%완성되었는데

실행할 때 뭔가 외부적인 요인에 의해서 

작동이 제대로 안되는 상황입니다.

이때 개발자 잘못은 아닙니다.

개발자 입장에서 상황을 예측해서

대책을 세워놓으라는 기능입니다.

 

 

에러의 종류에 대해서 알아봅시다.

 

1. NullPointerException

- 객체참조가 없는 상황

null값이 있는 참조변수로 .xxx()를 사용할 때 자주 발생함.

 

ex) String s = null;

System.out.println(s.length());

 

2. ArrayIndexOfBoundsException

- 배열에서 인덱스의 범위를 초과하게 되는 상황에서 발생

 

ex) int[] ar = {1,2,3};

System.out.println(ar[3]);

 

3. NumberFormatException

- 문자열을 숫자로 바꾸는 상황에서

변환할 수 없는 문자가 있는 경우에 발생

 

ex) String s = "a12345";

int i = Integer.parseInt(s);

System.out.println(i + 20);

 

이 외에도 다양한 Exception이 있는데

콘솔창에 해당 Exception의 종류와 해당 줄의 번호가 뜨니

당황하지말고 디버깅하는게 중요할 것 같다는 생각이듭니다.

 

Java에서는 예외처리가 강제로 다뤄줘야 합니다.

하지만 Python은 예외처리를 하지 않아도 됩니다.

 

예외처리의 예시를 하나 보겠습니다.

 어떤 정수를

0으로 나누게 되면

 

Exception in thread "main" java.lang.ArithmeticException: / by zero

at EMain1.main(EMain1.java:21)

 

이런 경고메세지가 출력됩니다.

이런 예외를 처리하려면

try - catch문을 사용해야 합니다.

 

try {

} catch (Exception e) {

// TODO: handle exception

}finally {

 

}

 

 

이런 형식으로 생겼는데

 

먼저 try문은 블럭안에 있는 내용을 실행합니다.

다른 메소드에서 try-catch를 사용하면

일종의 월권행위이기 때문에

main메뉴에서 주로 사용해야합니다.

 

catch의 파라미터에는 예외유형명과 변수명이들어갑니다.

try쪽을 실행하다가 해당 유형의 에외가 발생하면

catch 블록내의 코드를 실행합니다.

만약 예외 없이 정상적으로 실행됐을 경우,

catch부분은 그냥 지나치고 다음 코드를 실행합니다.

catch문은 예외 유형에 따라서 여러 개 집어넣는 것도 가능합니다.

 

catch (Exception e) {

// TODO: handle exception

e.printStackTrace();

}

 

catch에 파라미터로 Exception을 넣어주면

모든 예외처리를 해줍니다.

이때 printStackTrace 기능을 사용하면

어떤 에러인지 출력해줘서

개발자가 에러를 다루는데 용이합니다.

 

finally는 정상적으로 프로그램이 실행됐던지,

예외가 터졌던지 상관없이 실행되는 블록입니다.

필수로 작성될 필요는 없으며

return보다 먼저 실행된다는 특징이 있습니다.

 

두가지 문제가 동시에 발생한 경우에는

Java의 입장에서는 첫번째 예외가 발생했을 때 

즉시 실행 중지 후 해당 예외처리부분으로 넘어갑니다.

 

 

try catch외에도 예외 처리를 할 수 있는 구문이 있는데요.

바로 throws입니다.

try보다 더 주력으로 쓰입니다.

public int decidePrice(int price, int weight) throws ArithmeticException{

return price / weight;

}

이렇게 메소드 뒤에 붙여서 사용할 수 있는데

divide2를 실행하다가 에러가 생기면

에러가 생긴쪽으로 돌아가서 해결하라는 의미입니다.

 

이번 시간에는 에러와 예외처리 방법에 대해서

공부해봤습니다.