예외클래스와 throws의 이해가 부족합니다.

예외클래스와 throws의 이해가 부족합니다.

작성일 2023.01.05댓글 2건
    게시물 수정 , 삭제는 로그인 필요

예외처리가 많이 헷갈리네요. 많이 고심해봤는데도 이해가 안되는것이 있어서
아무쪼록 자세하게 알려주시면 감사합니다...

1. catch 블럭은 메소드의 호출이 아니라 선언이나 정의에 가까운가요?
e 처럼 왜 참조변수를 아무거나 넣어도 되는지 이해가 가질 않았습니다.
try {
Exception anything = new Exception("고의발생"); // 1. 예외 생성
throw anything; //
} catch (Exception e) {
System.out.println("에러메세지:" + e.getMessage());
e.printStackTrace();
}
이런 경우처럼 어떤 참조변수를 가지는 인스턴스가 발생하든지 catch 블록의 매개변수는 신경을 안쓰더라구요. 이는 catch블록은 클래스타입만을 판별하기 위한 '선언이나 정의'에 가까운 코드이기 때문인가요?

2. throw를 하면 return처럼 바로 프로그램이 종료되나요?

3. throws에 해당되는 예외클래스는 호출된 클래스에 예외를 전달한다는데 throws를 쓰지 않아 내부클래스에서 예외를 처리해야 하는 경우를 잘 모르겠습니다. throws 없이도 전달되는 것 같거든요. 
class test {
class PreN extends NullPointerException {
public PreN() {
}
}
class PreA extends ArrayIndexOutOfBoundsException {
public PreA() {
}
}
void pretest() throws PreN { //N을 명시, A를 발생
throw new PreA();
}
}


public class practice {
public static void main(String[] args) {
test t = new test();
try{
t.pretest();

} catch (test.PreN q){
System.out.println("PreN에서 발생");
} catch (test.PreA u) {
System.out.println("PreA에서 발생");
}

}
}

가령 이렇게 다른 예외를 만들어서 throws에 명시한 예외가 아니라 다른 예외상황이 발생했는데도 practice 클래스에 예외가 전달되어 catch가 잡아냅니다.
[PreA에서 발생]이 나옵니다.

제가 코드를 잘못 짠건지, throws에 대해 잘못이해한건지 모르겠습니다.

throws를 쓰지 않아도 호출된 클래스에서 catch블록에 전달된다면 throws로 예외클래스를 명시하는 이유가 무엇인가요?



profile_image 익명 작성일 -

우선 예외는 Checked Exception과 Unchecked Exception으로 나뉜다는 사실을 반드시 알고 계서야 합니다.

Exception을 상속하는 예외의 경우 모두 Checked입니다. RuntimeException을 상속하는 예외는 Unchecked Exception입니다. Error의 경우는 진짜 에러입니다. 예외가 아닙니다. 예외처리로 해결할 수 없고 해결해서는 안됩니다. (예, 메모리 없음)

Checked Exception을 throw하는 method를 호출하면 컴파일러가 강제로 try catch를 쓰도록 강제합니다. 사용하지 않으면 컴파일되지 않습니다. 만약 해당 method를 호출하는 method에서 try catch문을 사용하지 않는다면 반드시 throws를 통해서 해당 Exception 타입을 명시하도록 컴파일러에 의해서 강제됩니다. 그렇기에 Checked Exception을 throw하는 method의 경우 method 선언에 throws를 통해서 해당 Exception 타입을 명시해야만 합니다.

RuntimeException의 경우는 선택입니다. 위 Checked Exception의 경우에서 강제하는 것들이 모두 선택입니다. 그러나 try catch를 통해서 잡을 수 있다는 것은 동일합니다.

그러면 두 개의 경우는 어떻게 나뉘는 것일까요? 그것은 전적으로 해당 기능(method)을 작성한 사람에 의해서 결정됩니다. 내가 만든 코드를 사용하는 사람이 반드시 try catch를 쓰도록 강제할 것인지 아닌지 말입니다. 그게 답니다. 더 깊은 의미가 있을 것이라고 생각하지 마십시오.

아래는 위 질문에 대한 답변입니다.

1. try에 에러가 발생할 코드를 작성하고 catch를 통해서 에러를 잡을 수 있습니다. 메서드 호출이나 선언이 아닌 그냥 에러가 발생할 수 있는 코드영역을 설정하는 겁니다. e라는 이름은 그냥 아무렇게나 지으시면 됩니다.

int a = 10; a는 왜 a입니까? int price = 1000; 이게 좀 더 이해하기 쉬워졌군요. 발생할 수 있는 에러 타입에 따라서 적절하게 변수명을 정하면 됩니다.

2. throw하면 프로그램이 종료되지 않습니다. throw한 throwable 객체가 try catch를 통해서 해결될 때까지 메서드 호출 스택을 타고 올라갑니다. 만약 올라가는 도중 어떤 곳에서도 해결되지 않는다면 main까지 도달하고 해결되지 않은 예외에 의해서 프로그램은 종료됩니다. 이 질문이 아니었다면, throw한 순간 try로 감싸 있었다면 catch로 직시 전송됩니다. 만약 try catch 하지 않았다면 앞서 설명한 상황처럼 됩니다.

3. NullPointException은 Unchecked Exception입니다. Exception을 상속해서 만들어 보면 컴파일러에 의해서 강제될 겁니다.

profile_image 익명 작성일 -

1. catch블록은 클래스타입만을 판별하기 위한 '선언이나 정의'에 가깝습니다.

e와 같은 변수는 지역변수와 같아서 이전에 같은 이름의 지역변수만 없으면

어떤 이름이든 가능합니다.

2. 예외핸들러에서 catch가 안 되면 프로그램이 종료됩니다.

3.

void pretest() throws PreN { //N을 명시, A를 발생

throw new PreA();

}

PreN과 PreA는 서로 어떤 관계도 없어서

throws에서 컴파일 에러가 발생합니다.

throws를 쓰지 않아도 호출된 클래스에서 catch블록에 전달된다면 throws로 예외클래스를 명시하는 이유는

메소드에서 어떤 예외를 발생시키는지를 분명히 하면 예외를 이용한 프로그래밍이 가능해집니다.

예를들어 리턴값을 이용해서 결과를 리턴하는 대신에 예외를 이용해서 메소드의 결과를 리턴할 수도 있습니다.

그리고 컴파일러에 따라서는 throws를 쓰지 않아도 호출된 클래스에서 예외를 리턴할 수도 있습니다.

자바 예외클래스 질문..ㅠㅠ

... printstack 클래스이해가 안가네요... 메소드 //나이입력예외를 발생할 수 있음 public static int readage() throws ageinputexception...

자바 예외 처리 개념

... 하고 예외객체에 기록을 저장한다는것 까진 이해가... 그러나 상위 클래스에서도 이 예외를 처리할 수 있도록 하고 싶다면, throws문을 사용할 수 있습니다. 이렇게...

자바 throws와 try~catch

... 생각하시면 이해가 쉽게 되실 겁니다. ==> 쉽게 설명드리면 자바에는 어떤 클래스의 함수를 사용할시에 따로 발생하는 예외가 있습니다. 자바는...

안될때와 throws를 생략가능할때는...

... 3번째 주석라인을 실행해서 //예외 처리를... 하위 클래스입니다.. 그래서 throws에 명시해주지... 공부해 보시면 쉽게 이해하실 수 있으실 겁니다..

JSP 예외 처리

... 아래 예제보시면 좀 더 쉽게 이해 하실... 메서드에 // throws Exception(던질 예외들)... // File클래스의 객체를 만든다. createNewFile(f)...

[자바] 예외처리 질문입니다.

... 예외처리 소스에서 애러가 나는데... ttttt {//클래스이름으로 변경했습니다 public static void main(String[] ar) throws Exception...