2012-01-07 11 views

답변

2

다시 던지는 예외 것은 (여전히 원래 던져 같은 객체의) 그것에 대해 아무것도 변경되지 않습니다.

+0

정말인가요? 내 게시물보기. –

+0

@DougTreadwell 귀하의 게시물은 jtahlbom이 작성한 것을 지원합니다. – davogotland

+0

@davogotland, 맞습니다. 반영하도록 업데이트했습니다. –

0

이클립스는 내부 catch의 "throw e"를 처리되지 않은 예외로 표시하지만 예외를 잡았습니다. 실행하면 "It worked!"라는 내용이 출력되기 때문입니다. @jtahlborn에게 감사합니다. 불행히도 이것은 어딘가에 불필요한 try/catch 블록이 필요함을 의미합니다. jtahlborn 대답이 올바른지


public class Tester { 

    public static void main(String[] args) { 
     try { 
      try { 
       throw new SpecificException("Test!"); 
      } catch (Exception e) { 
       throw e; 
      } 
     } catch (SpecificException e) { 
      System.out.println("It worked!"); 
     } 
    } 

} 
+2

어떻게 불행합니까? 'catch (Exception e)'는'Exception' 클래스에서 파생 된 예외를 잡을 것입니다 (모두 있어야합니다). 그리고 나서 당신은 그것을 다시 던지고, 그 후에 특정한 예외만을 다룹니다. 자바는 그것을 허용해서는 안됩니다! 실제로 애플리케이션을 죽일 수있는 예외를 원한다면 런타임 예외를 사용해야한다. 왜냐하면 그 예외는 잡힐 필요가 없기 때문이다. – davogotland

+0

런타임 유형에 따라 예외가 발견되지만 컴파일러는 경고 및 오류만으로 정적 정보를 결정해야합니다. 확실히 당신의 경우 우리는'Exception'이'SpecificException'을 잡을 수는 있지만 진짜 문제는 어렵다는 것을 구별 할 수 있습니다. 그러나 당신은 여하튼 당신이해야하는 것보다 더 많이 붙잡아서는 안됩니다. – Voo

2

있지만, 한 번 더 감사가 : 컴파일러가 (그것은 단지 특정 클래스 될 수도 런타임에 경우) 제네릭 타입의 예외를 던지는 것을 볼 것이다 강제 메소드 헤더에 제네릭 예외를 선언해야합니다.

private void test() throws FileNotFoundException { 
    try { 
     throw new FileNotFoundException("Es una exception"); 
    } catch (IOException e) { 
     throw e; <-- Error because the method only throws 
         FileNotFoundException, not IOException 
    } 
} 

e은 참으로 FileNotFoundException이이지만,이 IOException가 선언 될 때 컴파일러는 광범위한 클래스와 함께 작동합니다. 당신이 할 수있는 것은 예외를 "던지기"입니다.

 throw (FileNotFoundException) e; 
+0

그러나 여러 예외를 포착하는 경우 어느 예외를 캐스팅할지 알 수 없습니다. –

+1

@DougTreadwell 여러 예외를 잡는다면 실제로 ** 잡을 수 있습니다 **. 그것이 컴파일러가 이것을 허용하지 않는 이유입니다. – davogotland

+0

그런 다음 유형을'instanceof'로 확인하고 apropiate 캐스트를 수행하거나'throws' 절에서 일반 예외를 선언하도록 강요하십시오 (부모 메소드에서는 원래 예외 였는지 확인할 수 있습니다. 컴파일러가 필요하지 않다고 결정할 수 없기 때문에 "generic"예외도 포함해야합니다. 어쨌든 당신은 너무 복잡하다. 예외는 호출하는 메소드에 의해 똑같이 처리되어야한다. (일반적인 것을 고수해야한다.) 그렇지 않다. ('throws'에서 다른 특별한 예외를 선언한다.) – SJuan76