0.0
はタイプdouble
、ないDouble
であるので、それは起こります。条件演算子への第2の2つのオペランドが同じ型でなければならないので、オートボクシング/アンボクシングはそれに来て、コンパイラは、その中にコードを回し:次にためa.getY()
戻りnull
、およびスローどの...
x = Double.valueOf(a == null ? 0.0 : a.getY().doubleValue());
// -^^^^^^^^^^^^^^^--------------------------^^^^^^^^^^^^^^
コードdoubleValue
をnull
に呼び出しようとします。
我々はコードを逆コンパイルするjavap -c Example
を実行した場合、我々は(私が太字に入れました)これらの呼び出しを見ることができます:IF-THEN-ELSEある
public class Example {
public Example();
Code:
0: aload_0
1: invokespecial #1 // Method java/lang/Object."":()V
4: dconst_0
5: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
8: astore_1
9: new #3 // class Example$A
12: dup
13: aload_0
14: invokespecial #4 // Method Example$A."":(LExample;)V
17: astore_2
18: aload_2
19: ifnonnull 26
22: dconst_0
23: goto 33
26: aload_2
27: invokestatic #5 // Method Example$A.access$000:(LExample$A;)Ljava/lang/Double;
30: invokevirtual #6 // Method java/lang/Double.doubleValue:()D
33: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;
36: astore_1
37: getstatic #7 // Field java/lang/System.out:Ljava/io/PrintStream;
40: aload_1
41: invokevirtual #8 // Method java/io/PrintStream.println:(Ljava/lang/Object;)V
44: return
public static void main(java.lang.String[]);
Code:
0: new #9 // class Example
3: dup
4: invokespecial #10 // Method "":()V
7: pop
8: return
}
? –
そこに 'if-then-else'文がありません。あなたは*三項演算子*を持っています。 – Andreas
NPEの重要な質問です! –