0

私はJavaを初めて使用し、「System.out」を明確にするために、関連するJavaソースコードを読んでから、理解できないものを見つけます。まず、「System.out」のソースコード:

public final static PrintStream out = nullPrintStream(); 

それから私は行きましたnullPrintStream

private static PrintStream nullPrintStream() throws NullPointerException { 
    if (currentTimeMillis() > 0) { 
        return null; 
    } 
    throw new NullPointerException(); 
    } 

私の質問は次のとおりです。プログラムはNullPointerException関数nullPrintStream()にaをスローする可能性があり、例外をキャッチする必要はありませんpublic final static PrintStream out = nullPrintStream();か?それを明確にするために、私はEclipseで次のようにいくつかのテストコードを書きました。

package MainPackage;

public class Src {
    private static int throwException() throws Exception{
        int m = 1;
        if(m == 0) {
            throw new Exception();
        }
        return 0;
    }
    public static final int aTestObject = throwException();  <==Here i got an error
    public static void main(String args[]) {

    }
}

私が思うように、未処理の例外タイプExceptionSystem.outというエラーが発生しましたが、?を使用せずにOKなのはなぜNullPointerExceptionですか?

4

3 に答える 3

3

Javaには、 RuntimeExceptionsと呼ばれる特別なクラスの例外があります。それらはすべてオブジェクトを拡張し、RuntimeExceptionオブジェクトはオブジェクトを拡張しExceptionます。(通常の例外とは対照的に)RuntimeExceptionの特別な点は、明示的にスローする必要がないことです。IllegalArgumentExceptionなど、いくつかの異なる例外がこのカテゴリに当てはまりIllegalStateExceptionます。

コーディング時にRTEを使用する利点は、特に例外が非常にまれでありそうもないと予想される場合に、多くのtry / catch/throwsステートメントでコードをカバーする必要がないことです。さらに、RTEをキャッチするための一般的なメカニズムが整っている場合、これはアプリが期待条件をきれいに処理することを確認するのにも役立ちます。

そうは言っても、特定のクラスまたはメソッドがそのタイプの例外をスローすることはシグニチャから明らかではないため、RTEの処理ははるかに困難になる可能性があります。したがって、十分に文書化されていない限り、APIにとって常に良いアイデアとは限りません。

NullPointerExceptionはRuntimeExceptionであるため、メソッドシグネチャで明示的に宣言する必要はありません。

于 2012-01-29T05:56:49.047 に答える
1

NullPointerExceptionRuntimeException-明示的にキャッチする必要はありません。

メソッドにこれを行わせると、コンパイル時に爆弾が発生しません。

private static int throwException() throws Exception{
    int m = 1;
    if(m == 0) {
        throw new RuntimeException();
    }
    return 0;
}
于 2012-01-29T05:44:27.170 に答える
1

private static int throwException()でthrow Exception()を順守する場合、public static final int aTestObject = throwException();をどのように変更する必要がありますか。

静的ブロックで値を初期化し、そこで例外をキャッチする必要があります。

public static final int aTestObject;
static {
  try {
    aTestObject = throwException();  <==Here i got an error
  } catch (Exception e) {
    throw new AssertionError(e);
  }
}
于 2012-01-29T08:58:30.963 に答える