Try catch문
자바를 공부하면서 try catch문이라는 구절을 많이 들어봤습니다.
이건 어떤 것 일지 알아보도록 합니다.
일단 try는 시도하다 catch는 잡다 입니다.
말그대로 오류 구문이 뜰 것 같은 코드를 try안에 넣어서 시도합니다.
그 후 그 오류코드가 뜨면 잡아서 실행 시킨다는 뜻입니다.
어떤 뜻인지 제대로 한번 알아보도록 합시다.

저희는 main메서드에 출력문으로 0과 0/0을 나눈 값을 출력 하려고 합니다.
하지만 출력결과

Zero로 나눳다고 산술 오류라고 발생 했습니다.
하지만 try catch구문을 사용하여 이 오류코드를 없앨 수 있습니다.

오류가 날 것 같은 코드에 try문에 집어넣고
이 오류가 발생 시 5를 출력하게끔 만들었습니다.

결과는 0과 5가 출력 됐습니다.
여기서 이상한 점을 느끼셨습니까?
제가 main메서드에서 코드를 짠 것은

0과 0/0,5를 넣었지만 0과 5만 출력이 됐습니다. 0/0은 출력되지 않았습니다.
이것은 try catch문을 사용해서 오류코드가 나온다면
이 오류코드에 맞는 catch문을 찾아서 출력하게 되고 오류코드가 뜬 구문은 실행 시키지 않고 catch문에 들어있는 구문을 실행 시킵니다.

이런식으로 말입니다.
그렇다면 생각한번 해봅시다.
그렇다면 try catch구문을 쓸 필요 없이 그냥 오류코드가 안나게 끔
코드를 작성하면 되는 것 아니냐?
라고 생각 할 수 있습니다.
하지만 이건 큰 착각입니다.
예를들어 보여드리겠습니다.

제가 프로젝트를 진행하면서 사용한 코드입니다.
이 프로젝트는
이름과 포인트를 입력해서 이름이 중복일 시 포인트의 값을 누적 시키는 코드입니다.
그렇기에 ex는 객체 배열입니다. 객체 배열로 이름과 포인트를 담아서
이 값들을 저장했습니다.
자 그렇다면 여기서 포인트의 값을 누적 시킬려면 if문을 이용해서 이 객체 배열의 값안에 내가 입력한 스캐너의 이름이 있으면 값을 넣어주면 됩니다.

여기 if문에서 name의 값들을 비교해야 합니다.
하지만 name의 값들은 null값 이기때문에 컴파일러 실행시
런타임 에러(nullpointException)이 뜨게 됩니다.
if문을 걸어서 첫 값을 넣어줘야 하는데 객체 배열안에 값들이 저장이 되어있지 않아서 오류코드가 뜨기 때문에 이 값들을 비교할 수 없습니다.
하지만 try catch를 사용한다면
이 문제를 쉽게 해결 할 수 있습니다.

자 여기를 보면 for문으로 값들을 하나하나 비교해 갑니다.
하지만 당연히 ex(객체배열)의 값안엔 아무것도 저장이 되어있지 않으니
NullPoint가 뜨게 될겁니다. 그렇다면 저 문장은 실행되지 않고
catch문으로 들어가 ex값안에 값을 넣어 주게 됩니다.
그렇다면.. 해결이 됐습니다. 처음엔 값이 없으니 catch문으로 값을 넣어주게 됐고
그 후에는 값이 있기때문에 오류코드가 뜨지 않습니다. 그렇기에
저기 if문은 정상적으로 실행 될 것이고 코드는 정상적으로 돌아 갈 것 입니다.
이렇듯 try catch문은 정말 유용한 문법이 아닐 수 없습니다.
모르시는 분들이라면 어렵지 않으니 꼭 숙지하시길 바랍니다.
또한 이 오류코드에는 여러 종류가 있습니다.
이 오류코드를 모른다면 try catch문을 제대로 쓸 수 없을 것입니다.
오류 코드의 종류
1.컴파일러 오류
2.런타임 오류
3.논리적 오류
이 세 부분이 있습니다.
컴파일러 오류
컴파일러 오류란
실행전에 생기는( 컴파일러 이전에) 생기는 오류를 뜻합니다.
예를 들어

제가 System.out.println부분에 System을 system으로 적으니
문법 오류라고 뜹니다. 바로 이것이 컴파일러 오류입니다.
자바 JVM이 실행전에 문법 경고를 해주는 것이 컴파일러 오류이며
대부분 문법오류로 인해 컴파일러 오류가 발생합니다.
런타임 오류
런타임 오류란
컴파일러가 실행되는 과정에서 발생하는 오류로
쉽게 생각해서 컴파일러 실행 시 발생하는 오류를 뜻합니다.
막상 실행시 발생하는 오류라고 생각하니 막막합니다.
어떤게 있을까요?

이렇게 많은 것들이 있습니다만 우리가 흔히 볼 수 있는
ArrayIndexOutOfBoundsException
배열 오류나
NullPointException
오류 등이 있습니다.
이처럼 런타임 에러라는 것은 사용자에 실수로 인해 생기는 오류를 뜻합니다.
논리적 에러
실행은 되지만 의도와 다르게 동작 하는 것이 논리적 오류입니다.
게임으로 쉽게 생각해서 예시를 들자면
저는 계산기를 만들었지만 이것은 계산기가 아니라 고객 관리프로그램이 된 것 입니다.(터무니 없긴 하지만..)
이렇듯 말 그대로 자기가 의도한 바와 다르게 동작하는 코드를 논리적 오류라고 합니다.
에러와 예외
자바에서는 발생할 수 있는 프로그램의 오류를 에러(error)와 예외(Exception) 두 가지로 구분 했습니다.

에러라는 것은 쉽게 생각해서 메모리 공간 부족등 사용자가 어찌 할 수없는 심각한 오류를 에러라고 명명했습니다.
예외라는 것은 코드에의해서 수습될 수 있는 다소 미약한 오류가 예외입니다.
이 예외라는것은 어떻게 본다면 런타임 에러라고 할 수 있습니다.
앞서 저희가 런타임 에러라는 것은 사용자의 실수로 인해 일어난 오류라고 했습니다. 그렇다면 이 오류를 수습이 가능 할 수 없을까? 라고 생각해서 만들어진게
예외 입니다. 바로 try catch문이죠
그렇기에 우리는 런타임 에러를 막기 위해 사용 하는 것이 try catch문입니다.
예외 클래스의 계층구조
하지만 저희는 런타임 에러를 보면서 너무나도 많은 에러코드를 접합니다.
그러나 이 계층구조를 본다면 쉽게 에러코드를 유연하게 사용 할 수 있습니다.

자바에서는 실행시 발생할 수 있는 오류(Exception)를 클래스로 정의 하였습니다.
저기 보이는 ERROR에 OutOfMemoryError가 메모리 공간 부족..등
심각한 오류를 가진 클래스가 error클래스 입니다.
Exception은 미악한 오류를 가지고 있는 클래스입니다.

최고 조상은 당연 Exception입니다.
여기서 Exception예외와 Rumtime예외 두 가지 클래스가 있습니다.
이것들은 쉽게 얘기해서

이렇게 정의 할 수 있습니다.
Exception 클래스같은 경우는 예시로써 IOException이 있습니다. 이것은 출력 오류로써 쉽게 생각한다면 뭐 프린터기나 키보드같은 외적인 요인의 의한 오류라고 생각 하시면 쉽습니다.
Runtime예외는 앞서 말씀 드린듯이 사용자에 의해 발생되는 예외가 런타임예외입니다. 그렇기에
catch문을 작성할때

이렇듯 Exception e을 작성 했습니다.
모든 예외코드를 처리 할 수 있기 때문입니다.
만약에 try catch문에서 컴파일러가 존재하지 않는 에러코드를 발생 했다면 어떻게 될 것 인가?

저는 방금 코드에 NumberformatException을 넣었습니다.
저희는 알고 있습니다 이 값은 nullPoint가 뜰 것이라는걸 알고 있죠?
하지만 이 코드를 실행 한다면

이런식으로 NullPoint가 뜨게 됩니다. try catch를 사용 했음에도
그렇기에 try catch문을 사용할때에는 오류코드가 어떤 것이냐에 따라 catch문에 적절히 사용해주시면 됩니다.
만약 어떤 에러코드인지 모르겠다.. 아니면 그냥 쉽게 쓰고 싶다 한다면
Exception을 사용해주면 이 클래스는 모든 오류에 최고 조상이기 때문에
모든 오류 코드를 catch하여 받을 수 있습니다.
요약
1.try catch문은 런타임 에러를 막기 위해 사용한다.
2.try문에는 오류가 날 것 같은 코드를 집어 넣고 catch에는 어떤 오류가 날 것인지
예상을 한 후 작성한다.
만약 거기에 맞는 오류가 난다면 try에 있는 문법은 실행시키지 않고
catch에 작성된 문법을 실행시킨다.
'JAVA 기초' 카테고리의 다른 글
[자바 기초] 인터페이스란? 인터페이스와 다형성의 대해 쉽게 알아보자 (2) | 2023.03.11 |
---|---|
[자바]Thread(쓰레드)의 이해와 개념 (1) | 2022.12.12 |
[자바]iterator 개념부터 적용까지 알아보자 (1) | 2022.11.27 |
[자바]Arraylist,LinkedList 사용방법 (1) | 2022.11.26 |
자바 상속(extends)의 개념 한번에 이해하기 (1) | 2022.11.24 |