1

캐치하지 않고 :자바는 시도 - 마침내 클래스 생성기의 방법으로 일하고 있어요

public void executeAction(String s) throws MyException { 
    if (s.equals("exception")) 
     throw new MyException("Error, exception", this.getClass().getName()); 
} 

public void close() { 
     System.out.println("Closed"); 
} 

나는이 코드를 사용했습니다 :

public void execute() throws MyException 
    Generator generator = new Generator(); 
    try { 
     String string = "exception"; 
     generator.executeAction(string); 
    } finally { 
     generator.close(); 
    } 

}

에서 main 예외 처리 :

try { 
     manager.execute(); 
    } catch (MyException e) { 
     System.err.println(e.toString()); 
    } 
} 

주요 나는 그것을 잡을 수 있습니다. 정상적인 행동입니까?

+2

에서 사용할 수 있습니다. 예외가 표시되지 않는 이유는 무엇입니까? – user2357112

+0

죄송합니다, 질문을 수정 – Stefano

+0

마침내 재생 예외가 발생하지 않습니다. 따라서 예외가 발생하여 잡히지 않으면 예외적으로 영향을 미치지 않습니다. – efekctive

답변

1

예. 이는 정상적인 동작입니다. 최소한 생성기가 닫혀 있는지 확인하지만 finally가 예외를 throw하면 try 블록에서 예외가 표시되지 않을 수 있습니다.

java7을 사용하면 try-with-resources를 사용해야합니다.

  1. GeneratorAutoCloseable을 구현 가지고, 당신이 이미 구현 외에 그래서 진정한 변화가없는 .close() 방법을 적용합니다.

  2. 은이 방법을 시도 -과 - 자원

try(Generator generator = new Generator()) { 
     String string = "exception"; 
     generator.executeAction(string); 
    } 
장점은 적은 코드 외에입니다

를 사용하는 실행 변경

그 @Mouad가 제대로 처리 언급하는 억제 예외 . .close() 호출의 예외는 e.getSuppressedException()

0

예, 올바른 동작입니다. 당신의 경우가 아닌, try-with-resources 문에서 예외가 발생합니다.

public void close() { 
    throw new OtherException("some msg");//This Exception will be added to your main Exception (MyException) as a Suppressed Exception 
    System.out.println("Closed"); 
} 

그래서 예, 이것은 정상적인 동작입니다 : 예를 들어 당신의 Generator.close() 메소드는 -in 마지막 블록 - 다른 예외를 throw 할 때 당신은 억제 예외를 얻을 것이다 What is a suppressed exception?

0

에서보세요.

관련 문제