在执行以下代码时,我得到一个NullPointerException在线:
value = condition ? getDouble() : 1.0;
Run Code Online (Sandbox Code Playgroud)
在早期的行中,当我使用null而不是getDouble()一切都有效时,这很奇怪.
public class Test {
static Double getDouble() {
return null;
}
public static void main(String[] args) {
boolean condition = true;
Double value;
value = condition ? null : 1.0; //works fine
System.out.println(value); //prints null
value = condition ? getDouble() : 1.0; //throws NPE
System.out.println(value);
}
}
Run Code Online (Sandbox Code Playgroud)
有人能帮我理解这种行为吗?
我对条件运算符有点疑惑.请考虑以下两行:
Float f1 = false? 1.0f: null;
Float f2 = false? 1.0f: false? 1.0f: null;
Run Code Online (Sandbox Code Playgroud)
为什么f1变为null而第二个语句抛出NullPointerException?
Langspec-3.0 para 15.25 sais:
否则,第二和第三操作数分别是S1和S2类型.设T1是将拳击转换应用于S1所产生的类型,让T2为应用到S2的装箱转换所产生的类型.条件表达式的类型是将捕获转换(第5.1.10节)应用于lub(T1,T2)(第15.12.2.7节)的结果.
所以对于false?1.0f:nullT1是Float而T2是null类型.但结果是lub(T1,T2)什么?第15.12.2.7段只是有点太多了......
顺便说一句,我在Windows上使用1.6.0_18.
PS:我知道Float f2 = false? (Float) 1.0f: false? (Float) 1.0f: null;不会抛出NPE.
java type-conversion nullpointerexception conditional-operator
运行以下Java代码:
boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;
Run Code Online (Sandbox Code Playgroud)
为什么会出现NullPointerException?
今天早上我遇到了一个非常奇怪的NPE,并将其简化为一个简单的例子.这是JVM错误还是正确的行为?
public class Test1 {
class Item {
Integer id = null;
public Integer getId() {return id;}
}
public Integer f() {
Item item = new Item();
// this works:
//return item == null ? new Integer(1) : item.getId();
// NPE??
return item == null ? 1 : item.getId();
}
public static void main(String[] args) {
Test1 t = new Test1();
System.out.println("id is: " + String.valueOf(t.f()));
}
}
Run Code Online (Sandbox Code Playgroud)
编译和运行的输出:
$ javac Test1.java
$ java Test1
Exception in thread "main" java.lang.NullPointerException …Run Code Online (Sandbox Code Playgroud) 前NullPointerException几天我在三元运算符中意外地进行了类型转换,这让我感到非常奇怪.鉴于此(无用的示例)功能:
Integer getNumber() {
return null;
}
Run Code Online (Sandbox Code Playgroud)
我希望编译后以下两个代码段完全相同:
Integer number;
if (condition) {
number = getNumber();
} else {
number = 0;
}
Run Code Online (Sandbox Code Playgroud)
与
Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)
.
事实证明,如果condition是true,if-statement工作正常,而第二个代码段中的三元操作抛出一个NullPointerException.似乎三元操作决定int在将结果自动装箱之前将两种选择都输入到一个Integer!?!事实上,如果我明确地转换0为Integer,则异常消失.换一种说法:
Integer number = (condition) ? getNumber() : 0;
Run Code Online (Sandbox Code Playgroud)
是不一样的:
Integer number = (condition) ? getNumber() : (Integer) 0;
Run Code Online (Sandbox Code Playgroud)
.
因此,似乎三元运算符和等效if-else语句之间存在字节码差异(我没想到的事情).这提出了三个问题:为什么会有差异?这是三元实现中的错误还是有类型转换的原因?鉴于存在差异,三元运算的性能是否与等效的if陈述相比或多或少(我知道,差异不是很大,但仍然存在)?
当我写这样的java代码时:
Map<String, Long> map = new HashMap<>()
Long number =null;
if(map == null)
number = (long) 0;
else
number = map.get("non-existent key");
Run Code Online (Sandbox Code Playgroud)
应用程序按预期运行但是当我这样做时:
Map<String, Long> map = new HashMap<>();
Long number= (map == null) ? (long)0 : map.get("non-existent key");
Run Code Online (Sandbox Code Playgroud)
我在第二行得到一个NullPointerException.调试指针从第二行跳转到java.lang.Thread类中的this方法:
/**
* Dispatch an uncaught exception to the handler. This method is
* intended to be called only by the JVM.
*/
private void dispatchUncaughtException(Throwable e) {
getUncaughtExceptionHandler().uncaughtException(this, e);
}
Run Code Online (Sandbox Code Playgroud)
这里发生了什么?这两个代码路径都完全等价不是吗?
编辑
我使用的是Java 1.7 U25
我有一部分代码像这样:
public static void main(String[] args) throws Exception {
String trueValue = Boolean.TRUE.toString();
String fieldValue = null;
Boolean defaultValue = null;
Boolean value = (fieldValue != null ? trueValue.equalsIgnoreCase(fieldValue) : defaultValue);
System.out.println(value);
}
Run Code Online (Sandbox Code Playgroud)
当defaultValue不等于null代码工作正常,但如果defaultValue是null在JVM抛出一个NullPointerException.此代码使用jdk 1.6.45编译.
为什么我得到这个例外?
有人可以解释一下为什么在第一种情况下检测到空指针,而在另一种情况下却没有吗?
也许他总是看第一种,但是为什么他只在条件为假的情况下才看。
@Test
public void test1() {
final Integer a = null;
final Integer b = false ? 0 : a;
//===> NULL POINTER EXCEPTION
}
@Test
public void test2() {
final Integer b = false ? 0 : null;
//===>NOT NULL POINTER EXCEPTION
}
@Test
public void test3() {
final Integer a = null;
final Integer b = true ? 0 : a;
//===>NOT NULL POINTER EXCEPTION
}
@Test
public void test4() {
final Integer a = null;
final …Run Code Online (Sandbox Code Playgroud) 谁能告诉我为什么Java会在NullPointerException这里抛出一个?
Float x = <some condition> ? myObject.getSomeFloat() : 0.0f;
Run Code Online (Sandbox Code Playgroud)
getSomeFloat返回Float.0.0f到new Float(0)工作正常.