次のコードが可能な場合:
Integer a = null;
int b = a;
null
整数の可能な値を返す関数が悪い習慣であることを意味しますか?
編集 1: これらの回答にはいくつかの異なる意見があります。どちらかを選ぶ自信がありません。
次のコードが可能な場合:
Integer a = null;
int b = a;
null
整数の可能な値を返す関数が悪い習慣であることを意味しますか?
編集 1: これらの回答にはいくつかの異なる意見があります。どちらかを選ぶ自信がありません。
そのコードは、NullPointerException
実行すると a を返します。基本的には次と同等です。
Integer a = null;
int b = a.intValue();
...これは、実際に失敗することをより明確にします。
実際には null 値をに割り当てているわけではありませんint
-試行して失敗しています。
;null
の値として使用しても問題ありません。Integer
実際、「nullable の同等物」として正確にInteger
使用されるのではなく、頻繁に使用されます。int
それは不可能。あなたは得るでしょうNullPointerException
それは NullPointerException をスローします。
この理由は、整数値の int プリミティブ型への自動ボックス化解除に依存しているためです。.intValue()
Java は、null である Object を内部的に呼び出すことによってこれを行います。
それが良い習慣であるかどうかについて...コードがあなただけによって使用され、あなたが非常に行儀が良い場合を除き、そのようなメソッドの戻り値のみを整数値に割り当てることを確認してください。 、int ではありません。
あなたのコードが他の人が使用するライブラリに含まれる場合、それは安全ではありません。私はむしろ明示的に例外をスローし、十分に文書化して、呼び出し元側で防御的なコーディングを許可したいと考えています。
もちろん、null を int に代入することはできません。ただし、状況によっては null を返すことが理にかなっています。Null は、値が設定されていないことを意味する場合があります。典型的な例は DB 列です。
コードはNullPointerException
可能ですが、ボックス化解除のために実行時にスローされます。それにかんする
整数に対して可能な null 値を返す関数は悪い習慣であるということですか?
はい、そうです。Integer
a で十分な場合にan を返すのは無意味で危険です (ご覧のとおり) int
。オブジェクトは null になる可能性がありますが、プリミティブは null にならないためです。Integer
パラメータ化された型のように、必要な場合にのみ使用する必要があります -List<Integer>
それは確かにうまくいくでしょう。
Integer a = null;
Integer b = a;
しかし、エラーが発生した場合に返すために、範囲外の int 値 (数値がすべて正の場合は -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)
これは、Java オートボクシングの試合です。
Integer a = null;
int b = a;
このコードは a を b に代入しますが、実際にはコンパイラが int b=a.intValue() を実行するため、この行は NullPointerException をスローします。
コード :
Integer a = 1;
実際にこれを行います: Integer a = Integer.valueOf(1);
javapを使用して、コンパイルされた仮想マシンの命令を表示できます。</p>