예외
사용자 조작실수, 개발자 코딩 문제 발생 오류
예외가 발생하면 프로그램 종료.
-> 정상실행 상태가 유지(예외처리)
대표적으로 아래의 오류가 있다.
NullPointerException
ArrayIndexOutOfBoundException
NumberIndexOutOfBoundsException
ClassCastException
예외 처리 코드
try-catch-finally 블록은 생성자 내부와 메서드 내부에서 작성되어 일반 예외와 실행 예외가 발생할 경우 예외 처리를 할 수 있도록 해준다.
① try 블록에는 예외 발생 가능 코드가 위치한다.
② try 블록의 코드가 예외 발생 없이 정상 실행되면 catch 블록의 코드는 실행되지 않고 finally 블록의 코드를 실행합니다. 만약 try 블록의 코드에서 예외가 발생하면 즉시 실행을 멈추고 catch 블록으로 이동하여 예외 처리 코드를 실행합니다. 그리고 finally 블록의 코드를 실행합니다.
③ finally 블록은 생략 가능합니다. 예외 발생 여부에 상관없이 항상 실행할 내용이 있을 경우에만 finally 블록을 작성해주시면 됩니다.
심지어 try 블록과 catch블록에서 return문을 사용하더라도 finally 블록은 항상 실행됩니다.
ClassNotFoundException
ClassNotFoundException은 Java에서 클래스를 찾을 수 없을 때 발생하는 예외입니다. 이 예외는 클래스를 로드할 때 클래스 경로에 지정된 클래스가 존재하지 않는 경우, 또는 클래스 이름이 잘못된 경우에 발생합니다. 예를 들어, 클래스 이름을 올바르게 지정하지 않았거나, 클래스 파일이 삭제되거나 경로가 잘못된 경우에 ClassNotFoundException이 발생합니다.
예제)
예제 오류를 해결
ArrayIndexOutOfBoundsException 예외
배열에서 인덱스 범위를 벗어나는 접근을 시도할 때 발생하는 예외입니다. 이 예외는 배열의 유효한 인덱스 범위를 초과하는 인덱스에 액세스하려고 할 때 발생합니다. 예를 들어, 배열의 크기가 10인데 인덱스 10에 액세스하려고하면 ArrayIndexOutOfBoundsException이 발생합니다.
예제)
예외 처리
No exception of type ArrayIndexOutOfBoundsException can be thrown; an exception type must be a subclass of Throwable 오류
lang이나, java.util에 기본클래스에 있는 동일한 이름의 CLASS가 패키지내에 존재하기 때문에 자바가 인식을 못해서 발생함.
-> 패키지내에 동일한 이름을 수정해주면 오류 해결되었음.
다중 catch
다중 catch 블록에서 예외 처리 순서는 매우 중요합니다. 예외 처리 순서는 catch 블록에 나열된 예외 클래스의 상속 구조와 일치해야 합니다. 즉, 상위 예외 클래스는 하위 예외 클래스보다 먼저 나와야 합니다. 그렇지 않으면 컴파일러는 Unreachable catch block 오류를 발생시킵니다.
예를 들어, 다음과 같은 코드가 있다고 가정해보겠습니다.
try {
// some code that may throw exceptions
} catch (Exception e) {
// handle exception
} catch (NullPointerException e) {
// handle null pointer exception
}
위의 코드에서는 첫 번째 catch 블록에서 Exception 클래스를 처리하고 두 번째 catch 블록에서 NullPointerException 클래스를 처리합니다. 이 순서는 정상적입니다. 왜냐하면 NullPointerException 클래스는 Exception 클래스의 하위 클래스이기 때문입니다. 그러나 첫 번째 catch 블록에서 NullPointerException을 처리하고 두 번째 catch 블록에서 Exception을 처리하려고 시도하면 컴파일러는 Unreachable catch block 오류를 발생시킵니다.
따라서 다중 catch 블록에서는 예외 처리 순서를 항상 유의해야 합니다. 보통은 하위 예외 클래스부터 처리하는 것이 좋습니다.
위 예제를 다중 catch로 변경
예외 떠넘기기 throws
throws 키워드는 메소드나 생성자에서 해당 메소드를 호출할 때 예외 처리를 위임하는 방법입니다. 메소드나 생성자에서 throws 키워드를 사용하면 해당 메소드에서 발생할 수 있는 예외를 호출한 쪽에서 처리할 수 있도록 예외 처리를 위임합니다.
throws 키워드는 메소드 또는 생성자의 선언부에 사용됩니다. 예를 들어, 다음과 같은 메소드가 있다고 가정해보겠습니다.
public void myMethod() throws IOException {
// some code that may throw an IOException
}
위의 코드에서 throws 키워드를 사용하여 IOException 예외를 호출한 쪽에서 처리할 수 있도록 예외 처리를 위임하고 있습니다. 이 메소드를 호출하는 코드에서는 try-catch 블록을 사용하여 IOException 예외를 처리할 수 있습니다.
throws 키워드를 사용하여 예외 처리를 위임할 때, 호출하는 쪽에서는 예외를 처리해주어야 합니다. 그렇지 않으면 컴파일러는 Unhandled exception type 오류를 발생시킵니다.
throws 키워드를 사용하여 예외 처리를 위임할 때, 여러 개의 예외를 처리할 수 있습니다. 이 경우에는 쉼표로 구분하여 여러 예외를 선언합니다. 예를 들어,
public void myMethod() throws IOException, SQLException {
// some code that may throw an IOException or SQLException
}
위의 코드에서는 IOException과 SQLException 예외를 호출한 쪽에서 처리할 수 있도록 예외 처리를 위임하고 있습니다.
예제)
끝.
'프로그래밍 언어 > Java' 카테고리의 다른 글
Java 예외 처리 #1 (0) | 2023.02.22 |
---|---|
Java 중첩 클래스와 중첩 인터페이스 #1 (0) | 2023.02.22 |
Java 인터페이스 #2 (0) | 2023.02.22 |
Java 인터페이스 #2 (0) | 2023.02.20 |
Java 인터페이스 #1 (0) | 2023.02.20 |