2013-05-24 5 views
25

자바에서는 throws 문을 검사하지 않는 방법을 만들 수 있습니까? 예를 들어예외를 무시할 수 있습니까?

:

public class TestClass { 
    public static void throwAnException() throws Exception { 
     throw new Exception(); 
    } 
    public static void makeNullPointer() { 
     Object o = null; 
     o.equals(0);//NullPointerException 
    } 
    public static void exceptionTest() { 
     makeNullPointer(); //The compiler allows me not to check this 
     throwAnException(); //I'm forced to handle the exception, but I don't want to 
    } 
} 

답변

52

당신이 시도하고 그것에 대해 아무것도 할 수

public static void exceptionTest() { 
    makeNullPointer(); //The compiler allows me not to check this 
    try { 
     throwAnException(); //I'm forced to handle the exception, but I don't want to 
    } catch (Exception e) { /* do nothing */ } 
} 

곰을 염두에두고, 실제 생활이이 extemely 을 경솔한입니다. 문제가 실제로 고양이 (ch) 인 동안 오류를 숨기고 일주일 내내 개를 검색 할 수 있습니다. (가 적어도 System.err.println()을 넣어 어서, -. @BaileyS에 의해 제안 로깅, 여기에 가장 좋은 방법입니다)

Unchecked exceptions in JavaRuntimeException 클래스를 확장합니다. 그들에게 던지는 것은 그들의 클라이언트에서 catch을 요구하지 않습니다 RuntimeException뿐만 아니라 throws 선언을 요구하지 않을 것이다 연장

// notice there's no "throws RuntimeException" at the signature of this method 
public static void someMethodThatThrowsRuntimeException() /* no need for throws here */ { 
    throw new RuntimeException(); 
} 

클래스. 그것에 대해

그리고 a word from Oracle :

여기 하단 라인 가이드 라인이있다 : 클라이언트가 합리적으로 예외를 복구 할 것으로 예상 할 수 있다면, 체크 예외합니다. 클라이언트가 예외로부터 복구하기 위해 아무것도 할 수 없으면 검사되지 않은 예외로 만드십시오.

+6

아주 좋은 글. 제가 제안 할 또 다른 것은 로거에 무시 된 예외를 기록하는 것입니다. –

+2

나는이 끔찍한 말장난에 대해 이것을 downvote하고 싶었지만, 나는 그것을 할 수 없었다. +1 좋은 대답을 위해 – Craig

+11

@Craig 오, 어서, 그 말장난은 완전히 새로운 수준으로 게시물을 가져옵니다 : P – acdcjunior

2

는 아니, 컴파일러 오류를 발생시킵니다. 확인 된 예외이기 때문에 잠재적으로 throw하는 것으로 선언하여 예외를 catch하거나 전파해야합니다. thisthis을 확인하십시오.

+0

나는 아래로 유권자 아니다 잡을 필요가 없습니다 귀하의 예외를 던져하지만, 당신의 대답은 약간 불완전합니다. @ tarrsalah를 고려해보십시오. 대답은 –

+3

이 될 수 있습니다. 또한 downvoter도 아니지만, 링크 된 문서가있는 경우에도 대답이 독자적으로 나타날 수 있도록 연결된 모든 참조에 대한 중요한 요점을 요약하는 것이 좋습니다 움직이거나 사라집니다. –

+0

Noted, 얘들 아. 감사. – LexLythius

1

아시다시피,이 경우에는 불가능합니다. 체크되지 않은 예외 만, 컴파일러는 검사를 건너 뛸 수 있습니다. RuntimeException과 같은

+0

이 답변은 자기 모순입니다. 먼저 그것이 불가능하다고 말하면, 그것이 가능한 방법을 (일종의) 설명합니다. 어느 쪽이 될 것인가? –

+0

방금 ​​내 답변을 업데이트했습니다.이 경우에는 불가능합니다 (사용자의 경우). 그리고 나서 사용자가 실제로 잡히지 않는 예외를 던지기를 원한다면, 우리는 검사되지 않은 예외 만 사용할 수 있습니다. – Stony

3

자바에는 Exceptions, 확인 된 예외 및 확인되지 않은 예외라는 두 가지 종류가 있습니다.

  • 는 확인 된 예외이거나 걸러 내야합니다.
  • NullPointerExceptionRuntimeException (컴파일러 그들이이 클로스를 throw 선언 할 강제로하지 않습니다) 당신이 그것을 무시할 수 있지만 여전히 런타임에서 발생할 수 있으며, 응용 프로그램이 충돌 할 것이다.

    클래스 예외도 예외를 체크 의 RuntimeException의 서브 클래스 아닌 서브 클래스 : Exception 문서에서

. 메서드 또는 생성자의 실행에 의해 throw 된 이 될 수 있고 메서드 또는 생성자 경계 외부로 전파 될 수있는 경우 확인 된 예외가 메서드 또는 생성자의 throws 절에 선언 된 이어야합니다.RuntimeException 문서에서

:

RuntimeException는 Java 가상 머신의 정상 작동 중에 발생 가 될 수있는 각종의 예외의 슈퍼 클래스입니다.

RuntimeException 및 해당 하위 클래스는 검사되지 않은 예외입니다. 생성자의 throws 절이 메서드 또는 생성자를 실행하여 throw 될 수 있고 메서드 외부 또는 생성자 경계로 전파 될 수있는 경우 확인되지 않은 예외를 메서드에서 선언 할 필요가 없습니다.

+1

물론, 'NullPointerException' (또는 예외)을 무시하면 (잡기와 버리기와 반대로) 애플리케이션이 중단됩니다. –

1

RuntimeException을 던지거나 RuntimeException에서 파생 된 예외를 던집니다. 그렇다면 컴파일러가 강제로 catch하지 않습니다.

3

당신이 할 수있는 3 가지가 있습니다

  • , 당신은 그들이 이러한 잡을 필요가 없습니다 (..., NullPointerException, IllegalArgumentException처럼 RuntimeException을 확장 또는 무언가)를 RuntimeException을 던져는 검사되지 않은 예외.

  • 캐치를 제외하고 아무것도하지 않는 (권장하지 않음) :

    public static void exceptionTest() { 
        makeNullPointer(); //The compiler allows me not to check this 
        try { 
         throwAnException(); //I'm forced to handle the exception, but I don't want to 
        } catch (Exception e) { 
         // Do nothing 
        } 
    } 
    
  • 변경 exceptionTest() 선언은 그것이 Exception를 던졌습니다 말과는 Exception를 잡아 적절한 일을 호출하는 방법을 수 있도록합니다 :

    public static void exceptionTest() throws Exception { 
        makeNullPointer(); //The compiler allows me not to check this 
        throwAnException(); //I'm no more forced to handle the exception 
    } 
    
+0

메소드가 확인 된 예외를 throw하는 것으로 선언되지만 특정 호출이 절대로 throw되지 않을 것으로 예상되는 경우, 확인 된 예외를 catch하고 RuntimeException과 같은 형태로 래핑해야합니다. 사실, 호출을하는 메소드가 다른 상황에서 그 예외를 던질 것으로 예상 되더라도 (아마도 * 특히 * 경우) 나는 그러한 행동을 적절하다고 생각할 것이다. 'LoadDocument (string filename)'이'FileNotFoundException'을 던지면'filename'이 발견되지 않았 음을 나타내야합니다 - 템플릿과 같은 다른 필요한 파일을 사용할 수 없다는 것을 나타냅니다. – supercat

1

다른 답변이 제대로 알려 점에서 마우스 오른쪽 무엇인지 이되어야하지만, 이며 실제로 선언되지 않은 검사 예외를 throw 할 수 있습니다. 이 작업을 수행 할 수있는 몇 가지 방법이 있습니다. 간단한입니다

public void methodThatSecretlyThrowsAnException() { 
    Thread.currentThread().stop(new Exception()); 
} 

또는 당신의 목표는 예외

public void methodThatSecretlyThrowsAnException() { 
    try { 
     methodThatAdmitsItThrowsAnException(); 
    } catch(final Exception e) { 
     Thread.currentThread().stop(e); 
    } 
} 

(., 당신이 말할 필요도없이 수행해서는 안)이

1

단지를 선언 않는 기존의 방법을 포장하는 경우 예외를 잡아서 아무 것도하지 말고, 그대로두고 특정 예외를 알지 못하는 경우 일반적인 예외를 잡으십시오.

try{ 
//Your logic goes here 
} 
catch(Exception e)//Exception is generic 
{ 
//do nothing 
} 
0

어떤 상황에서도 실패하지 않을 것이라는 확신이 들더라도 빈 catch 블록에서 예외를 피하는 것은 바람직하지 않습니다. 때로는 인간의 요소를 알지 못합니다.

예외가 발생할 가능성이 거의 없다면 (불가능하지는 않은 경우) 자신의 예외를 만들고 예상치 못한 예외를 감싸 야합니다.예를 들어

:

private class UnlikelyException extends RuntimeException { 
    public UnlikelyException (Exception e){ 
     super (e); 
    } 
} 

그런 다음, 시도-catch 블록에 코드를 포장하고

try { 
    // Your code 
} catch (Exception e) { 
    throw new UnlikelyException(e); 
} 
관련 문제