Day18 - 예외처리

2021. 3. 11. 16:29JAVA 공부

이번에는 예외처리 에 대해 알아 봅시다.

 

예외처리

예외란 무엇일까요? 바로 오류 입니다.

오류가 나면 처리를 해줘야 겠죠?

오류 처리를 안하고 넘어가면 어떻게 되겠어요? 버그가 되는 겁니다

 

예외의 종류는 여러 가지가 있는데 , 4가지만 보고 갑시다

 

1. nullPointer - 객체 참조가 없는 상태, null 값을 참조하려고 할때 뜨는 오류

2. ArrayIndexBoundsException - 배열의 인덱스 범위를 초과해서 참조하려고 할경우 뜨는 오류

3. NumberFormat - 문자열로 되어 있는 데이터를 숫자로 변경하려고 할 때 뜨는 오류

4. ClassCasting - 형변환 할 수 없는 클래스에 형변환 하려고 하는 경우 ex) 부모 클래스를 자식 클래스로

 

4 개를 간단히 알아봤는데, 에러가 이렇게 4개만 있는게 아니고 한 1000 개 정도 된다고 합니다.

그래서, 에러가 왜 발생했는지 확인을 할 줄 알아야 한다고 해요

 

이제, 이 오류들을 처리하는 법을 배워 봅시다

 

try{

1...

} catch ( Exception e){

2....

}

 

1 안에 오류가 날 것 같은 코드를 작성해 주세요, 만약 오류가 나면 2 에 있는 코드가 실행 됩니다.

 

예제를 봅시다

10을 0으로 나눌 수 있나요? 없죠? 그래서 오류가 나는 겁니다. 이거를 try catch 로 고쳐볼거에요 ~

자 보시면, i / j 에서 오류가 나죠? 그러면 바로 catch 로 넘어 갑니다. 그렇기 때문에 오류가 발생하는 코드 밑은 실행이 안됩니다 ~ 그리고, 끝까지 잘 실행이 됩니다.

 

여기서 Exception 은 , 에러(오류) 를 전부 받아주는 클래스 라고 해요.

 

그리고 finally 라는게 있는데, 이것도 한번 볼게요

finally 에 오는 코드는 , 에러가 나도, 안나도 전부 실행하는 구문 입니다.

try 구문에서 에러가 날 경우. 그 밑의 코드 (try 안에 있는 코드) 는 실행되지 않고, catch 구문으로 넘어가는데, 그 후 finally 에 있는 구문을 실행 합니다.

 

그리고,

다중 예외 처리가 있는데요

에러가 난 경우가 여러가지 잔아요?

그래서 catch 를 여러개로 나눌 수 있습니다.

각각의 에러에 따라 코드를 다르게 해주고 싶을 때 사용하면 되겠습니다.

catch 를 더 만들어 주면 되요 ~ if else if 처럼 ~

Exception 은 에러 처리의 최상위 클래스 라서 맨 마지막에 써주셔야 되요 ~

 

그 다음으로는,

스캐너 입력 에러 무한 루프를 알아 볼거에요

이렇게 코드를 짜면, 입력을 받을 때, 정수가 아닌 다른 값을 입력하면 무한루프가 발생 됩니다.

그 이유는 ? scan.nextInt() 는 숫자를 입력하고 엔터를 치죠?

ex) 7 엔터

그러면, 엔터를 기준으로 왼쪽에 있는 숫자는 정수로 저장을 하고, 엔터는 가지고 있습니다.

 

※ 엔터도 하나의 char타입의 아스키 코드 입니다.

 

그런데, 문자열을 입력하면.... 엔터를 기준으로 왼쪽에 있는 값이 정수가 아니에요. 에러가 나죠? 그럼 catch 구문으로 넘어 갑니다. 그리고 다시 정수를 입력받으려고 올라오면, 버퍼에 엔터가 남아 있어서, 입력한 것처럼 인식을 하기 때문입니다.

즉. Scanner(버퍼)에 엔터값(아스키코드) 이 남아 있기 때문입니다.

 

그래서 이걸 해결하기 위해서, catch구문에서 enter 까지 같이 처리를 해주는 scan.next() / scan.nextLine() 을 해주면 되는데, next() 는 스페이스바 도 문장의 마지막으로 처리하기 때문에, nextLine()을 해주는게 좋습니다.

이 외에, 처리하는 방법이 1개 더 있습니다.

Integer.parseInt(scan.nextLine()); 입니다. 저희가 아직 Integer 를 안배워서 뭔지는 자세히 모르겠지만...

이건, 문자열을 Int형으로 바꿔주는 거라고 합니다.

그래서 엔터까지 포함해 주는 scan.nextLine() 을 써서 같이 int형으로 바꿔 버리는 겁니다.

그럼, 에러가 나도 엔터값은 같이 포함이 되어 있겠죠?

 

이렇게 예외 처리하는 방법에 대해 알아 보았습니다

 

고생하셨습니다

 

※ main 클래스에 데이터를 전달 해보자

 

 

run 탭 -> run_configurations -> arguments탭 -> ${string_prompt}

 

 

'JAVA 공부' 카테고리의 다른 글

Day19 - 예외 만들기  (0) 2021.03.12
Day19 - 예외 던지기 throws  (0) 2021.03.12
Day18 - 그동안 뭘 배웠는지 정리해봅시다  (0) 2021.03.11
Day18 - interface 02  (0) 2021.03.11
Day17 - interface 01  (0) 2021.03.10