이 코드 문은 동일합니까? 그들 사이에 차이점이 있습니까?
private void calculateArea() throws Exception {
....do something
}
private void calculateArea() {
try {
....do something
} catch (Exception e) {
showException(e);
}
}
이 코드 문은 동일합니까? 그들 사이에 차이점이 있습니까?
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
내부적으로 잡아서 처리 하므로 호출자는 예외 처리를 수행 할 필요가 없습니다.
예, 그들 사이에는 많은 차이가 있습니다. 첫 번째 코드 블록에서 호출 코드에 예외를 전달합니다. 두 번째 코드 블록에서는 직접 처리합니다. 올바른 방법은 전적으로 수행중인 작업에 따라 다릅니다. 어떤 경우에는 코드에서 예외를 처리하기를 원하지만 (예를 들어 파일을 찾을 수없고 파일을 생성하려는 경우) 다른 경우에는 호출 코드가 예외를 처리하기를 원합니다 (파일을 찾을 수 없음). 그리고 그들은 새로운 것을 지정하거나 만들어야합니다).
일반적으로 말해서 일반적인 예외를 포착하고 싶지 않습니다. 대신 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 클래스를 던지는 것은 권장되지 않습니다. 호출자가 예외를 더 잘 처리 할 수 있도록 더 구체적인 것을 던져보십시오.
private void calculateArea() throws Exception {
....do something
}
이렇게하면 예외가 발생하므로 호출자는 해당 예외를 처리 할 책임이 있지만 호출자가 예외를 처리하지 않으면 jvm에 제공되어 프로그램이 비정상적으로 종료 될 수 있습니다.
두 번째 경우 :
private void calculateArea() {
try {
....do something
} catch (Exception e) {
showException(e);
}
}
여기서 예외는 피 호출자가 처리하므로 프로그램이 비정상적으로 종료 될 가능성이 없습니다.
Try-catch 는 권장되는 접근 방식입니다.
IMO,
컴파일러를 설득하기 위해 주로 Checked 예외와 함께 사용되는 키워드를 던지지 만 프로그램의 정상적인 종료를 보장하지는 않습니다.
예외 처리 책임을
호출자 (JVM 또는 다른 메서드) 에게 위임하는 키워드를 던집니다 .
Throws 키워드는 확인 된 예외에만 필요하며, 확인되지 않은 예외의 경우 throws 키워드를 사용하지 않습니다.