파파비의 블로그
자바의 try-catch, throws, throw /예외처리 본문
예외 class의 가장 상위는 Exception 클래스이다.
Exception은 크게 2개로 나눌 수 있다.
Exception과 RuntimeException이다.
RuntimeException은 Exception을 상속한 exception인데,
이 예외를 발생시키는 것들은 코딩단계에서 예외처리가 필수는 아니다.
반대로 Exception을 바로 상속한 class들, RuntimeException을
상속하지 않은 Exception들은 예외처리를 필수로 요구된다.
그렇다면 예외를 처리는 어떻게 할까? 하는 방법이 2가지가 있다.
try-catch를 통해 직접처리하는 방법과
throws를 통해 직접처리하지 않고 떠넘기는 방식이 있다.
먼저 try-catch부터 파악해보자
try{
//여기에는 에러가 날 수 있는, 예외를 처리가 필요한 코드들이 들어간다.
}
catch(Exception e){
// 여기에는 예외가 발생했을 경우 실행된다.
}
finally{
// 여기는 무조건 실행되는 부분이다.
}
무조건 실행되는 부분이라니, 그럼 실행되지 않는 부분도 존재한다는 것일까?
그렇다.
try 부분에서 코드들이 실행되다가 예외가 발생하게 되면 try구문은 그 자리에서 중단된다.
그리고 바로 catch 구문에 있는 곳으로 가게 된다.
try 예외발생 아랫부분들은 실행이되지 않는다.
finally는 catch부분이 실행된 이후, or try구문이 끝까지 진행된 이후 실행되는 부분들이다.
다음방법은 throws 키워드를 이용하는 방법이다.
어떤 에러가 나올 수 있는 메소드에 throws 키워드를 붙여준다.
public void Read() throws Exception{
System.in.read();
}
위 코드처럼 throws Exception을 파라미터 옆, 블록이 시작되기 전에 넣어준다.
이렇게 될 경우, 해당 메소드를 실행한 상위 메소드로 에러가 넘어가게 된다.
public void main(String[] args)
{
try{
read();
}
catch(Exception e){ }
}
따라서 main에서 read()를 호출했다면 main 블록에서 try, catch로 예외처리를 해줄 수도 있고
아니면 main 옆에 throws 를 붙여서 그 상위 메소드로 토스할 수도 있다.
이제 예외를 발생시키는 키워드 throw에 대해 알아보자
throws와 알파벳 하나 차이지만, 의미는 나왔다시피 많이 다르다.
throw를 사용하는 방법은 다음과 같다.
예외를 발생시키고 싶은 곳에
throw new Exception();
를 넣으면 된다. 그렇다면 저 코드가 실행될 때 예외가 발생하게 된다.
그렇다면 저 코드를 넣은 메소드를 생각해보자.
저 순간에 예외가 발생하므로, 처리를 해주어야 한다.
처리방법은 2가지 try-catch 와 throws. 이 둘 중 하나를 추가해서 예외처리를 해주어야 한다.
그런데 잘 생각해보라, throw를 쓴다는 것은
우리는 예외가 발생했음을 '알리는' 입장이다.
try-catch는 발생한 예외를 직접 처리하겠다는 것이다. > 취지에 맞지 않다.
그래서 throws를 통해 상위 메소드로 던져준다.
마지막으로 Java에서 예외 객체를 직접 만든 예외에 대해서 다루어보자.
java에는 미리정의된 예외들이 상당히 많은데 본인이 직접 만든 것을 사용하고 싶을 때도 있다.
그럴 땐 가장 상위의 class인 Exception을 상속받으면된다.
아 물론, RuntimeException을 상속받아도 괜찮다. 이 둘의 차이를 이해했으면 골라서 사용하면 된다.
여기에 추가적으로 상속해서 구현할 때, getMessage()함수를 구현해주면 좋다.
string을 return하는 이 메소드는
실행될 때 보여질 메시지를 string으로 반환한다.
'개발 > java' 카테고리의 다른 글
필터스트림 (0) | 2020.04.07 |
---|---|
스트림의 개념과 file IO stream (0) | 2020.04.07 |
Thread 쓰레드 (0) | 2020.04.05 |
인터페이스 (0) | 2020.04.05 |
추상클래스, 추상메소드 (0) | 2020.04.05 |