相关疑难解决方法(0)

在三元运算符中获取不需要的NullPointerException - 为什么?

在执行以下代码时,我得到一个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)

有人能帮我理解这种行为吗?

java double nullpointerexception conditional-operator

48
推荐指数
2
解决办法
2623
查看次数

Java条件运算符?:结果类型

我对条件运算符有点疑惑.请考虑以下两行:

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

36
推荐指数
1
解决办法
1万
查看次数

NullPointerException,在三元表达式中具有自动装箱功能

运行以下Java代码:

boolean b = false;
Double d1 = 0d;
Double d2 = null;
Double d = b ? d1.doubleValue() : d2;
Run Code Online (Sandbox Code Playgroud)

为什么会出现NullPointerException?

java autoboxing nullpointerexception

23
推荐指数
2
解决办法
6343
查看次数

具有自动装箱功能的三元运算符中的Java NPE?

今天早上我遇到了一个非常奇怪的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)

java nullpointerexception

20
推荐指数
1
解决办法
1669
查看次数

NullPointerException通过Java三元运算符的自动装箱行为

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)

.

事实证明,如果conditiontrue,if-statement工作正常,而第二个代码段中的三元操作抛出一个NullPointerException.似乎三元操作决定int在将结果自动装箱之前将两种选择都输入到一个Integer!?!事实上,如果我明确地转换0Integer,则异常消失.换一种说法:

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 autoboxing nullpointerexception ternary

15
推荐指数
2
解决办法
1896
查看次数

使用Java三元运算符时的奇怪行为

当我写这样的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

java ternary-operator nullpointerexception

12
推荐指数
1
解决办法
1580
查看次数

为什么将三元语句中的空值赋给布尔变量会抛出NPE?

我有一部分代码像这样:

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代码工作正常,但如果defaultValuenull在JVM抛出一个NullPointerException.此代码使用jdk 1.6.45编译.

为什么我得到这个例外?

java ternary-operator nullpointerexception

11
推荐指数
3
解决办法
1592
查看次数

Java三元条件奇怪的空指针异常

有人可以解释一下为什么在第一种情况下检测到空指针,而在另一种情况下却没有吗?

也许他总是看第一种,但是为什么他只在条件为假的情况下才看。

@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 ternary-operator nullpointerexception

5
推荐指数
1
解决办法
375
查看次数

三元条件表达式中的奇怪NullPointerException

谁能告诉我为什么Java会在NullPointerException这里抛出一个?

Float x = <some condition> ? myObject.getSomeFloat() : 0.0f;
Run Code Online (Sandbox Code Playgroud)
  • 该方法getSomeFloat返回Float.
  • 更改0.0fnew Float(0)工作正常.

java nullpointerexception conditional-statements

1
推荐指数
1
解决办法
83
查看次数