2013-05-24 13 views
25

Javaでは、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)の間、1週間に一度犬を探し続けることができます。 (そこ少なくとも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

いいえ、それはコンパイラエラーを発生させます。チェックされた例外であるため、あなたのメソッドを潜在的にスローすると宣言することによって、その例外をキャッチしたり、伝播したりする必要があります。 thisthisを確認してください。

+0

をキャッチする必要はありませんあなたの例外を投げるが、あなたの答えは少し不完全です、@ tarrsalahを考慮して、あなたは回答 –

+3

を見つけるかもしれませんどちらもdownvoterではありませんが、それはまた、リンクされた文書がある場合でも答えが独自に立つことができるように移動したり消えたりする。 –

+0

注意してください。ありがとう。 – LexLythius

1

私は知っているので、その場合は不可能です。未チェックの例外のみ、コンパイラはスキップしてチェックできます。 RuntimeExceptionのようなものです。

+0

この回答は自己矛盾しています。最初はあなたが不可能だと言う、それから、あなたはそれがどのように可能かを説明します。それはどれでしょうか? –

+0

私はちょうど私の答えを更新した、それは事件(ユーザーの場合)で不可能です。そして、ユーザーが本当に捕捉できない例外をスローしたいのかどうかを説明してください。チェックされていない例外しか使用できません。 – Stony

3

Javaでは、Exceptionsのチェック例外とチェックされていない例外の2種類があります。

  • は、チェックされた例外です。キャッチまたはスローする必要があります。
  • NullPointerExceptionは、あなたが、それを無視することができますが、それはまだランタイムに発生する可能性があり、かつ、アプリケーションがクラッシュします(コンパイラがクラウスをスローで宣言するためにそれらを強制しない)、RuntimeExceptionです。 Exceptionドキュメントから

クラスExceptionとも のRuntimeExceptionのサブクラスではありません任意のサブクラスは、例外をチェックされます。メソッドまたはコンストラクタの実行によって がスローされ、メソッドまたはコンストラクタの境界の外側に を伝播できる場合、チェックされた例外はメソッドまたはコンストラクタのthrows句で宣言された である必要があります。

RuntimeExceptionドキュメントから:

RuntimeExceptionは、Java仮想マシンの通常動作中に スローすることができる各種の例外のスーパークラスです。

RuntimeExceptionとそのサブクラスはチェックされていない例外です。 メソッドまたはコンストラクタの コンストラクタのthrows句が、 のメソッドまたはコンストラクタの実行によってスローされ、メソッドまたはコンストラクタ境界の外側に伝播される場合は、未チェックの例外を宣言する必要はありません。

+1

もちろん、NullPointerException(または例外)を無視すると(キャッチしてスローするのではなく)、アプリケーションがクラッシュします。 –

1

RuntimeExceptionを投げるか、RuntimeExceptionから派生した例外を投げてください。それでコンパイラはあなたにそれをキャッチするよう強制しません。

3

あなたがすることができる3つの事があります。

  • は、あなたは彼らがそうであるようにこれらをキャッチする必要はありません(NullPointerExceptionIllegalArgumentException、...のように、または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

メソッドがチェック例外をスローすると宣言されても、特定の呼び出しがスローされないと予想される場合、チェックされた例外をキャッチして、 'RuntimeException'のようなものにラップすることをお勧めします。実際、コールを行うメソッドがある種の状況でその例外をスローすることが予想される場合(おそらく*特に*の場合)でも、私はそのような動作を適切と考えます。 'LoadDocument(string filename)'が 'FileNotFoundException'をスローすると、' filename'が見つからなかったことを示すはずです。テンプレートのような他の必要なファイルが利用できないということではありません。 – supercat

1

他の回答は、彼らが正しくあなたを伝えることで、正しいです何となりますが、で、実際に宣言されていないチェック例外をスローすることができます。これを行うにはいくつかの方法があります。最も簡単なものは次のとおりです。

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

空のキャッチブロックで例外を回避することは、いかなる状況でも失敗しないことを完全に確信していても、避けることはお勧めしません。時々、我々は人間の要因を認識していません。

例外が発生する可能性は非常に低い(不可能ではない場合)場合は、独自の例外を作成し、予期しない例外をその中にラップする必要があります。例えば

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

その後、私はダウン有権者ないですtry-catchブロックでコードをラップし、あなたが

try { 
    // Your code 
} catch (Exception e) { 
    throw new UnlikelyException(e); 
}