28

throwsJavaでは、チェックしないステートメントを持つメソッドを作成することは可能ですか?

例えば:

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
    }
}
4

10 に答える 10

55

あなたはそれについて何もしようとすることができません:

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 */ }
}

実生活では、これは非常に賢明ではないことに注意てください。これにより、エラーが隠され、問題が実際には猫 (ch) であるにもかかわらず、1 週間犬を探し続けることができます。(さあ、少なくともSystem.err.println()そこに置いてください-@BaileySが示唆しているように、ここではロギングがベストプラクティスです。)

Java の非チェック例外はクラスを拡張しRuntimeExceptionます。それらを投げてもcatch、クライアントからの要求はありません:

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

拡張するクラスも宣言をRuntimeException必要としません。throws

そしてそれについてオラクルから一言

肝心なガイドラインは次のとおりです。クライアントが例外から回復することが合理的に期待できる場合は、それをチェック済み例外にします。クライアントが例外から回復するために何もできない場合は、それを非チェック例外にします。

于 2013-05-24T02:34:14.557 に答える
4

できることは 3 つあります。

  • a (または, などのRuntimeExceptiona を拡張するもの) をスローします。これらはチェックされていない例外であるため、これらをキャッチする必要はありません。RuntimeExceptionNullPointerExceptionIllegalArgumentException

  • 例外をキャッチして何もしない (非推奨) :

    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
    }
    
于 2013-05-24T02:48:28.347 に答える
3

Java には、Checked Exceptions と Unchecked Exceptionsの 2 種類のExceptionsがあります。

  • 例外はチェック済み例外であり、キャッチまたはスローする必要があります。
  • NullPointerExceptionRuntimeException です(コンパイラは throws 節で宣言することを強制しません) 無視できますが、それでもRuntimeで発生する可能性があり、アプリケーションがクラッシュします。

例外のドキュメントから:

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

RuntimeExceptionのドキュメントから:

RuntimeException は、Java 仮想マシンの通常の操作中にスローされる例外のスーパークラスです。

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

于 2013-05-24T02:38:14.277 に答える
1

RuntimeExceptionまたは から派生した例外をスローしRuntimeExceptionます。その後、コンパイラはそれをキャッチすることを強制しません。

于 2013-05-24T02:41:03.420 に答える
1

私が知っているように、それは不可能です。チェックされていない例外のみ、コンパイラはチェックをスキップできます。ランタイム例外など。

于 2013-05-24T02:35:45.640 に答える
1

例外をキャッチするだけで、それに対して何もせず、そのままにして、特定の例外に気付いていない場合に備えて一般的な例外をキャッチします

try{
//Your logic goes here
}
catch(Exception e)//Exception is generic
{
//do nothing
}
于 2013-05-24T05:29:49.443 に答える
1

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

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

または、例外を宣言する既存のメソッドをラップすることが目標の場合

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

(言うまでもなく、これを行うべきではありません。)

于 2013-05-24T04:56:06.927 に答える