24

次のコードが可能な場合:

Integer a = null;
int b = a;

null整数の可能な値を返す関数が悪い習慣であることを意味しますか?

編集 1: これらの回答にはいくつかの異なる意見があります。どちらかを選ぶ自信がありません。

4

10 に答える 10

49

そのコードは、NullPointerException実行すると a を返します。基本的には次と同等です。

Integer a = null;
int b = a.intValue();

...これは、実際に失敗することをより明確にします。

実際には null 値をに割り当てているわけではありませint-試行して失敗しています。

;nullの値として使用しても問題ありません。Integer実際、「nullable の同等物」として正確にInteger使用されるのではなく、頻繁に使用されます。int

于 2012-12-17T12:39:12.720 に答える
14

それは不可能。あなたは得るでしょうNullPointerException

于 2012-12-17T12:38:50.600 に答える
6

それは NullPointerException をスローします。

この理由は、整数値の int プリミティブ型への自動ボックス化解除に依存しているためです。.intValue()Java は、null である Object を内部的に呼び出すことによってこれを行います。

それが良い習慣であるかどうかについて...コードがあなただけによって使用され、あなたが非常に行儀が良い場合を除き、そのようなメソッドの戻り値のみを整数値に割り当てることを確認してください。 、int ではありません。

あなたのコードが他の人が使用するライブラリに含まれる場合、それは安全ではありません。私はむしろ明示的に例外をスローし、十分に文書化して、呼び出し元側で防御的なコーディングを許可したいと考えています。

于 2012-12-17T12:39:18.743 に答える
2

もちろん、null を int に代入することはできません。ただし、状況によっては null を返すことが理にかなっています。Null は、値が設定されていないことを意味する場合があります。典型的な例は DB 列です。

于 2012-12-17T12:42:34.597 に答える
2

コードNullPointerException可能ですが、ボックス化解除のために実行時にスローされます。それにかんする

整数に対して可能な null 値を返す関数は悪い習慣であるということですか?

はい、そうです。Integera で十分な場合にan を返すのは無意味で危険です (ご覧のとおり) int。オブジェクトは null になる可能性がありますが、プリミティブは null にならないためです。Integerパラメータ化された型のように、必要な場合にのみ使用する必要があります -List<Integer>

于 2012-12-17T12:42:52.963 に答える
1

それは確かにうまくいくでしょう。

Integer a = null;
Integer b = a;

しかし、エラーが発生した場合に返すために、範囲外の int 値 (数値がすべて正の場合は -1) を使用したいと思います。

于 2012-12-17T12:43:18.963 に答える
1

簡単なテストを書くことができます:

public class Test {
    public static void main(String[] args){
        Integer a = null;
        int b = a;

        System.out.println(b);
    }
}

出力は NullPointerException ですint b = a;

Exception in thread "main" java.lang.NullPointerException
    at Test.main(Test.java:11)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:601)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:120)
于 2012-12-19T20:15:17.930 に答える
1

これは、Java オートボクシングの試合です。

Integer a = null;
int b = a;

このコードは a を b に代入しますが、実際にはコンパイラが int b=a.intValue() を実行するため、この行は NullPointerException をスローします。

コード :

Integer a = 1;

実際にこれを行います: Integer a = Integer.valueOf(1);

javapを使用して、コンパイルされた仮想マシンの命令を表示できます。</p>

于 2012-12-17T13:01:16.060 に答える