2012-11-01 5 views
-1

클래스에서 친구의 메모를 읽고 있는데 다음 코드의 주석에서 질문에 대한 답이 궁금합니다.예외가 발견 된 곳은 어디입니까?

public void withdraw(double amount) { 
     if (amount > balance) { 
      IllegalArgumentException exception1 = new IllegalArgumentException("Amount exceeds balance"); 
      throw exception1; //where caught?? 
     } 
     balance = balance - amount; 
    } 
+2

어떤 코드가이 메서드를 호출하는지 보지 않고는 말할 수 없습니다. 그것은 결코 잡히지 않을 것입니다. 그것은 main 메소드까지 계속 전파되어 프로그램을 종료시킬 수 있습니다. – DNA

+0

'withdraw' 메소드의 호출자에서? –

+4

@ Nambari IllegalArgumentException이 선택 취소되었습니다. – djechlin

답변

1

메서드에서 throw하는 예외는 메서드 내에서 처리하지 않으면 해당 메서드를 호출 한 메서드에 위임됩니다. 마지막으로 메서드 호출 계층 구조를 주 스레드 스택의 맨 아래까지 이동합니다.이 스레드는 사용자의 main 메서드입니다. 이제 main 메소드가 예외를 처리하지 못하면 JVM에 도달하여 주 스레드를 정지시키고 전체 스택 추적으로 발생한 예외를 표시합니다.

@JBNizet이 주석에 지적한대로 main 스레드가 아닌 다른 스레드에서 메서드를 호출하면 예외가 run 메서드에 도달하면 해당 스레드가 중지됩니다. 그러나 주 스레드는 실행을 계속할 것입니다. 모든 스레드가 자체적으로 stack을 가지므로 그 이유는 추측 할 수 있습니다. 따라서 주 스레드는 예외가 발생한 스레드와 다른 stack에 있습니다.

+0

코드가 주 스레드가 아닌 스레드에서 호출되지 않으면 스레드가 단순히 중지됩니다. –

+0

@JBNizet. 예 바로 그 거예요. 여기에 멀티 스레딩의 경우는 고려하지 않았습니다. 그러나 그것은 유효한 지적입니다. :) –

4

IllegalArgumentException은 검사되지 않은 예외이므로 프로그램의 어딘가에 잡히지 않으면 VM에 도달 할 때까지 계속 올라가고 실행이 중지됩니다.

@ JBNizet에 대한 신용 : 주 스레드가 아닌 스레드에서 메소드를 호출하면 예외가 발생하면 해당 스레드가 중지됩니다. 그러나 주 스레드는 실행을 계속할 것입니다.

관련 문제