【问题标题】:Missing Java error on conditional expression?条件表达式上缺少 Java 错误?
【发布时间】:2011-02-28 12:44:27
【问题描述】:

使用方法test1()test2(),我得到一个类型不匹配错误:无法从null 转换为int,这是正确的;但是为什么我在方法test3() 中没有得到相同的结果?在这种情况下,Java 如何以不同的方式评估条件表达式? (显然,NullPointerException 将在运行时上升)。是缺少错误吗?

public class Test {

    public int test1(int param) {
        return null;
    }

    public int test2(int param) {
        if (param > 0)
            return param;
        return null;
    }

    public int test3(int param) {
        return (param > 0 ? param : null);
    }

}

提前致谢!

【问题讨论】:

    标签: java null if-statement conditional-operator implicit-conversion


    【解决方案1】:

    混合运算符类型时,条件运算符非常棘手;这是许多Java Puzzlers 的主题。

    这是一个经典的例子:

    System.out.println(true ? Integer.valueOf(1) : Double.valueOf(2));
    // prints "1.0"!!!
    

    还有一个:

    System.out.println(true ? '*' : 0);     // prints "*"
    int zero = 0;
    System.out.println(true ? '*' : zero);  // prints "42"
    

    而且,正如您刚刚发现的那样:

    System.out.println(true  ? 1 : null);   // prints "1"
    System.out.println(false ? 1 : null);   // prints "null"
    

    理解条件运算符?: 的所有复杂性可能非常困难。最好的建议是不要在第二个和第三个操作数中混合类型。

    以下引用摘自Java Puzzlers, Puzzle 8: Dos Equis的课程:

    综上所述,条件表达式中的第二个和第三个操作数一般最好使用相同的类型。否则,您和您的程序的读者必须对这些表达式行为的复杂规范有透彻的了解。

    JLS 参考

    【讨论】:

    • 很好的解释!看起来使用 if 语句更安全。感谢您的宝贵时间!
    【解决方案2】:

    查看this 问题的答案。基本上,编译器将尝试自动拆箱空值(并抛出空指针异常)。我认为这是您遇到问题的语法:

    public int test3(int param) { 
        return (param > 0 ? param : null); 
    } 
    

    【讨论】:

    • 是的,这是正确的语法。这是我写问题时的错误。感谢您的链接,非常有趣!
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多