2014-05-13 2 views
3

JAVA에서는 Exception handling exercise를 거치면서 여러 가지를 혼동합니다. 기본적으로 내가 이해하지 못하는 것은 예외가 발생할 때 프로그램의 흐름이 어떻게 발생 하는지를 설명하는 것입니다. 다음 시나리오에서 실제로 프로그램의 흐름이 어떻게 일어나는지, 그리고 개념에 대한 내 이해가 옳은지 또는 잘못되었는지를 이해하고 싶습니다.JAVA의 이해 키워드 throw

public void myFunction(){ 

    try{ 

      //Some code...... 

     }catch(Exception e1){ 

      //If this Exception is occured handle it here. 

     }catch(Exception e2){ 

      //if this exception has occured then 

      throw new myException("whatever message required"); 
     } 

     finally{ 

      //code that has to be executed 
     } 

} 

지금 나의 이해는 무엇인가 :

예외가없는 설치 1. 코드가 원활하게 실행하고 결국 finally 블록의 코드가 2.If 예외 E1은이 잡힌 후 발생 실행됩니다 후 발생 첫 번째 catch 블록에서는 적절하게 처리되고 마지막으로 블록이 실행됩니다. 3. 예외 e2가 발생하면 어떻게됩니까? catch 블록에서 우리는 새로운 예외를 throw합니다. 그래서 myFunction을 호출하는 메서드는 this를 처리 할 수있는 메커니즘을 제공해야합니다. myException? 그래서 실행은 호출하는 메소드의 catch 블록으로 전달됩니다. 맞습니까? 그렇다면 myFunction()의 "finally"블록은 어떻게 될까요? 그 때 실행되지 않을 것인가? 프로그램의 흐름은 어떻습니까? 나는 정말로 우리가 "던짐"을 사용할 때 일어나는 일을 열심히 찾는다. 우리가 그것을 사용할 때 실제로 일어나는 일은 무엇입니까?

+1

보기 : e1과 e2 모두 동일한 유형입니다. 예외, catch (Exception e2)가 실행될 기회가없는 이유입니다. –

답변

4

참조 (당신의 수정 예) :

try { 
    // Some code ... 
} 
catch(SomeException e1) { 
    // SomeException code ... 
} 
catch(SomeOtherException e2) { // SomeOtherException is NOT SomeException extension 
    throw new myException("whatever message required"); 
} 
finally { 
    // Some final code ... 
} 

실행 가능성이 당신이

http://www.c4learn.com/java/java-multiple-catch-blocks/

또한 더 catch 블록을 이해하는 데 도움이됩니다

1. No exception at all: 
    Some code executed 
    Some final code executed 
2. SomeException is thrown: 
    Some code (may be partially) executed 
    SomeException code executed 
    Some final code executed 
3. SomeOtherException is thrown: 
    Some code (may be partially) executed 
    Some final code executed 
    throw new myException("whatever message required"); 
4. SomeStrangeException is thrown 
    Some code (may be partially) executed 
    Some final code executed 
    System'll look for other try {} catch {} block to catch SomeStrangeException 
+0

후속 catch 블록에서 처리되지 않는 예외가 throw되면 우선 finally 블록이 실행 된 다음 예외가 어디에서 처리되는지 여부에 관계없이 프로그램 만 호출 스택을 검색합니다. – neerajDorle

+0

@neerajDorle : 네, 매우 편리한 동작입니다. 리소스를 먼저 지우고 그 이유를 수정하려고 시도합니다 (비할 데없는 예외). –

1

"myFunction을 호출하는 방법은이 myException을 처리 할 수있는 메커니즘을 제공해야합니까?" 그렇지만 컴파일러는 확인 된 예외를 확장하는 경우에만 그렇게 할 수 있습니다. 어떤 일이 생기든지 결국 블록이 항상 실행됩니다.

+0

그렇다면 후속 catch 블록에서 처리되지 않는 예외가 발생하면 먼저 finally 블록이 실행 된 다음 예외가 어디서나 처리되면 프로그램이 호출 스택을 검색합니다. – neerajDorle

+0

예, 흐름이 어떻게 진행되는지보기 위해 디버그 해보십시오. – Szarpul

0

혹시 자바의 예외가 런타임에 처리하는 방법에 대해 알고 싶어 할 수있는 모든 예외가 발생 본질적으로 Java Language Specification, section 11.3

에서 발견 할 수는, 프로그램 흐름은 정지 및 제어 할 때까지 호출 스택 중 하나를 전송 예외는 try/catch에 의해 또는 예외가 스택의 맨 아래에 도달 할 때까지 잡히게되고, 그 시점에서 스레드가 종료됩니다.

그래서 즉, 귀하의 경우에는

"뭔가 스레드를 죽이는 경우에는 catch 블록이 존재하지 않는 한,이 예외와 일치 가까운 catch 블록, 이동, 당신이하던대로 중지 발생했습니다" 모두 예외가 이미 첫 번째 catch 블록에 걸려 있기 때문에 e2이 발생하지 않습니다. 다른 예외를 다르게 처리하려는 경우 일반적으로 복수 catch 블록이 사용됩니다. 파일에서 숫자를 파싱하는 경우 한 블록에 IOException을, 다른 블록에 NumberFormatException을 붙잡습니다.

런타임 예외 (RuntimeException까지 확장되는 예외)는 처리 할 필요가 없습니다. 명시 적으로 예외를 처리해야합니다. (예외는 Exception을 확장하지만 RuntimeException은 예외입니다).

finally 블록의 코드는 예외가 throw되었는지 여부에 관계없이 실행됩니다.

+0

첫 번째 대답에 작성된 수정 된 코드를 살펴보고 그에 따라 대답을 ..... ..... 한 가지 더 질문하십시오. 예외가 throw되는 경우 후속 catch 블록에서 처리되지 않습니다. 먼저 finally 블록이 실행되고 예외가 어디서나 처리되면 프로그램이 호출 스택을 검색합니다. – neerajDorle

+0

나는 그것이 사실이라고 믿습니다. 'finally' 블록은 JVM이 호출 스택을 작동하기 전에 실행됩니다. – awksp

+0

고마워,이게 내가 원했던거야. 대답을 편집 해주세요. – neerajDorle

0

, 안으로 버지니아 (7), 다중 예외 어획량이 지원됩니다

try { 
// stuff 
} catch (Exception1 | Exception2 ex) { 
// Handle both exceptions 
} 
2

다음과 같은 예를 생각해 (그냥 몇 가지 실제 코드로 가득 Basicalliy 귀하의 예를 들어, NullPointerException이 던져 설계) :

public class Exceptions { 

    public static void myMethod() { 
     try{ 
      String s = null; 
      s.length(); 
     } 
     catch(NumberFormatException e1){ 
      System.out.println("Something unexpected happend"); 
     } 
     catch(NullPointerException e2){ 
      throw new RuntimeException("Exactly what we want happened"); 
     } 
     finally{ 
      System.out.println("Finally Block"); 
     } 
    } 

    public static void main(String[] args){ 
     try{ 
      myMethod(); 
     } 
     catch(RuntimeException e){ 
      e.printStackTrace(); 
     } 
    } 
} 

출력

Finally Block 
java.lang.RuntimeException: Exactly what we want happened 
    at Exceptions.myMethod(Exceptions.java:14) 
    at Exceptions.main(Exceptions.java:23) 

새로운 RuntimeException이 호출 메소드에 전달되기 전에 finally 블록이 실행된다는 것을 알 수 있습니다. 그렇지 않으면 "마지막 블록"출력이 RuntimeException의 스택 추적 뒤에 있습니다.

+0

감사합니다! 그것은 내 혼란을 정리 :) – neerajDorle