[java] try / catch 대 예외 발생

이 코드 문은 동일합니까? 그들 사이에 차이점이 있습니까?

private void calculateArea() throws Exception {
    ....do something
}

private void calculateArea() {
    try {
        ....do something
    } catch (Exception e) {
        showException(e);
    }
}



답변

예, 큰 차이가 있습니다. 후자는 예외를 삼키고 (확실히 보여줍니다) 첫 번째는 전파를 허용합니다. (나는 그것을 다시 showException던지지 않는다고 가정하고 있습니다.)

따라서 첫 번째 메서드를 호출하고 “무언가”가 실패하면 호출자가 예외를 처리해야합니다. 두 번째 메서드를 호출하고 실패 “무언가를”경우를 제외하고 호출자는 일반적으로 나쁜 일이 전혀 예외를 … 볼 수 없습니다 showException했다 진정으로 잘못 어떤 고정 된 예외를 처리, 일반적으로 확인했다 그 calculateArea목적을 달성했다.

당신은 당신이없이 첫 번째 방법을 호출 할 수 있기 때문에, 이것을 말할 수 있습니다 중 하나를 잡기 Exception자신 또는 귀하의 방법은 너무 그것을 던질 수 있음을 선언.


답변

첫 번째 throws Exception는 호출자가 Exception. 두 번째는 Exception내부적으로 잡아서 처리 하므로 호출자는 예외 처리를 수행 할 필요가 없습니다.


답변

예. 선언하는 버전 throws Exception은 예외를 처리하기 위해 호출 코드가 필요하지만 명시 적으로 처리하는 버전은 그렇지 않습니다.

즉, 간단히 :

performCalculation();

호출자에게 예외 처리 부담을 이동하는 것과 비교 :

try {
    performCalculation();
catch (Exception e) {
    // handle exception
}


답변

예, 그들 사이에는 많은 차이가 있습니다. 첫 번째 코드 블록에서 호출 코드에 예외를 전달합니다. 두 번째 코드 블록에서는 직접 처리합니다. 올바른 방법은 전적으로 수행중인 작업에 따라 다릅니다. 어떤 경우에는 코드에서 예외를 처리하기를 원하지만 (예를 들어 파일을 찾을 수없고 파일을 생성하려는 경우) 다른 경우에는 호출 코드가 예외를 처리하기를 원합니다 (파일을 찾을 수 없음). 그리고 그들은 새로운 것을 지정하거나 만들어야합니다).

일반적으로 말해서 일반적인 예외를 포착하고 싶지 않습니다. 대신 FileNotFoundException또는 같은 특정 항목 만 잡을 IOException수 있습니다. 다른 의미를 가질 수 있기 때문입니다.


답변

던지기를 사용할 수없는 특정 시나리오가 하나 있습니다. try-catch를 사용해야합니다. “재정의 된 메소드는 상위 클래스가 던지는 것 이외의 추가 예외를 던질 수 없습니다”라는 규칙이 있습니다. try-catch를 사용하여 처리해야하는 추가 예외가있는 경우. 이 코드 조각을 고려하십시오. 간단한 기본 클래스가 있습니다.

package trycatchvsthrows;

public class Base {
    public void show()
    {
        System.out.println("hello from base");
    }
}

그리고 파생 된 클래스입니다 :

package trycatchvsthrows;

public class Derived extends Base {

    @Override
    public void show()   {
        // TODO Auto-generated method stub
        super.show();

        Thread thread= new Thread();
        thread.start();
        try {
            thread.sleep(100);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        // thread.sleep(10);
        // here we can not use public void show() throws InterruptedException 
        // not allowed
    }
}

thread.sleep ()을 호출해야 할 때 try-catch를 사용해야합니다. 여기서는 사용할 수 없습니다.

 public void show() throws InterruptedException

재정의 된 메서드는 추가 예외를 throw 할 수 없기 때문입니다.


답변

나는 “동일한”당신이 행동을 말하는 것이라고 가정합니다.

함수의 동작은 다음에 의해 결정될 수 있습니다.

1) 반환 값

2) 던져진 예외

3) 부작용 (예 : 힙, 파일 시스템 등의 변경)

이 경우 첫 번째 메서드는 모든 예외를 전파하고 두 번째 메서드는 확인 된 예외를 throw하지 않고 대부분의 확인되지 않은 예외도 삼키므로 동작이 다릅니다.

그러나 “무언가”가 예외를 throw하지 않는다고 보장하면 동작은 동일합니다 (첫 번째 버전에서는 컴파일러가 예외를 처리하도록 호출자가 필요함).

–편집하다–

API 디자인의 관점에서 볼 때 계약 방식은 완전히 다릅니다. 또한 Exception 클래스를 던지는 것은 권장되지 않습니다. 호출자가 예외를 더 잘 처리 할 수 ​​있도록 더 구체적인 것을 던져보십시오.


답변

예외가 발생하면 자식 메서드 (이를 재정의)가 예외를 처리해야합니다.

예:

class A{
public void myMethod() throws Exception{
 //do something
}
}

A a=new A();
try{
a.myMethod();
}catch Exception(e){
//handle the exception
}