相关疑难解决方法(0)

Java中的布尔与布尔值

围绕Integervs int在Java中进行了讨论.前者的默认值是null后者的默认值0.Booleanvs boolean?怎么样?

我的应用程序中的变量可以有0/ 1值.我想使用boolean/ Boolean而不想使用int.我可以使用Boolean/ boolean代替吗?

java boolean

173
推荐指数
6
解决办法
27万
查看次数

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万
查看次数

为什么这个任务会导致NPE?

public class Npe {
    static class Thing {
        long value;
    }

    public static Map<Thing, Long> map;

    public static void main(String[] args) {
        Thing thing = new Thing();
        method(null); // returns -1
        method(thing); // returns 0
        map = new HashMap<Thing, Long>();
        method(null); // returns -1
        method(thing); // NullPointerException thrown inside this method call
    }

    public static long method(Thing thing) {
        if (thing == null) {
            return -1;
        }
        Long v = (map == null) ? thing.value : map.get(thing); // NPE here …
Run Code Online (Sandbox Code Playgroud)

java ternary-operator nullpointerexception

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

为什么三元运算给出了nullpointer而ifelse对应的呢?

我在下面的一个实例中得到NullPointerException,而它的对应运行顺利.

public static void main(String[] args){
    System.out.println(withTernary(null, null)); //Null Pointer
    System.out.println(withIfElse(null, null));  //No Exception
}

private static Boolean withTernary(String val, Boolean defVal){
    return val == null ? defVal : "true".equalsIgnoreCase(val);
}

private static Boolean withIfElse(String val, Boolean defVal){
    if (val == null) return defVal;
    else return "true".equalsIgnoreCase(val);
}
Run Code Online (Sandbox Code Playgroud)

在线版

在线版本中的台词main相反,它输出nullwithIfElse,然后失败withTernary.

我正在使用以下java版本

java version "1.6.0_65"
Java(TM) SE Runtime Environment (build 1.6.0_65-b14-462-11M4609)
Java HotSpot(TM) 64-Bit Server VM (build 20.65-b04-462, mixed mode)
Run Code Online (Sandbox Code Playgroud)

java ternary-operator nullpointerexception

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

java:三元运算符中的怪异NullPointerException(?:)

请考虑以下代码段:

private static void doSomething(Double avg, Double min, Double sd) {
    final Double testMin;
    if (avg != null) {
        testMin = Math.max(min, avg - 3 * sd);
    } else {
        testMin = min;
    }
    System.out.println("testMin=" + testMin);

    final Double verwachtMin = avg != null ? Math.max(min, avg - 3 * sd) : min;
    System.out.println("verwachtMin=" + verwachtMin);
}
Run Code Online (Sandbox Code Playgroud)

据我所知(出于什么我的IDE能告诉我),变量testMinverwachtMin应该是等价的.

正如您所料,我宁愿写最后两行而不是前七行.但是,当我将3个空值传递给此方法时,我得到一个NPE来计算verwachtMin变量.

有谁知道这会怎么样?三元运算符是否评估第二部分,即使条件不是true

(Java版本1.6.0_21)

java ternary-operator nullpointerexception

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

使用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
查看次数

将Boolean转换为boolean并在Java中处理null的实用方法

有没有在Java中的实用工具方法它转换Booleanboolean和自动处理空引用Boolean假?

java boolean utility-method

12
推荐指数
2
解决办法
6126
查看次数

具有null Long的三元表达式中的NullPointerException

为什么下面的代码行产生了NullPointerException

Long v = 1 == 2 ? Long.MAX_VALUE : (Long) null;
Run Code Online (Sandbox Code Playgroud)

我知道正在进行拆箱null,但为什么呢?

注意

Long v = (Long) null;
Run Code Online (Sandbox Code Playgroud)

不会产生异常.

java nullpointerexception

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

双三元整数启动会导致空指针

为什么这个很好,x被设置为null:

boolean condition1 = false;
Integer x = condition1 ? 1 : null;
Run Code Online (Sandbox Code Playgroud)

这个很好,x被设置为2:

boolean condition1 = false, condition2 = true;
Integer x = condition1 ? 1 : condition2? 2 : null;
Run Code Online (Sandbox Code Playgroud)

但是,x应该设置为null会导致java.lang.NullPointerException

boolean condition1 = false, condition2 = false;
Integer x = condition1 ? 1 : condition2 ? 2 : null;
Run Code Online (Sandbox Code Playgroud)

解决方案是使用:

Integer x = condition1 ? (Integer)1 : condition2 ? 2 : null;
Run Code Online (Sandbox Code Playgroud)

但我不清楚为什么单个三元运算符工作正常,但不是双精度运算符.

java

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

Java自动拳击/拆箱wierdness

可能重复:
布尔值,条件运算符和自动装箱
Java,Google Collections Library; AbstractIterator有问题吗?

下面的代码产生一个NPE:

Integer test = null;
Integer test2 = true ? test : 0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)

要正确打印出"null"而无异常,需要以下代码:

Integer test = null;
Integer test2 = true ? test : (Integer)0;
System.out.println(test2);
Run Code Online (Sandbox Code Playgroud)

在第一个例子中显而易见的是,"test"被取消装箱(转换为原生int),但为什么呢?为什么更改三元运算符中的另一个表达式(如第二个示例中)修复它?任何人都可以提供某种形式的叙述,确切地知道两个例子中的内容何时,什么以及为何被盒装和取消装箱?

java autoboxing

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

返回类型Object的方法中的NullPointerException

为什么以下抛出NullPointerException?:

public static Object myTest() { 
    boolean x = false; 
    boolean y = false; 
    return x && y ? new Object() : x ? x : y ? y : null;
}

public static void main(String [ ] args) {
    myTest(); 
}
Run Code Online (Sandbox Code Playgroud)

我知道如果我执行以下任一操作,代码将不会抛出NullPointerException:

一个)

public static Object myTest() { 
    boolean x = false; 
    boolean y = false; 
    return x && y ? new Object() : x ? x : y ? y : (Object) null;
}

public static void main(String …
Run Code Online (Sandbox Code Playgroud)

java nullpointerexception

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

Java中的条件运算符会抛出意外的NullPointerException

可能重复:
通过Java三元运算符的自动装箱行为的NullPointerException

以下代码使用简单的条件运算符.

public class Main
{
    public static void main(String[] args)
    {
        Integer exp1 = true ? null : 5;
        Integer exp2 = true ? null : true ? null : 50;

        System.out.println("exp1 = " +exp1+" exp2 = "+exp2);

        Integer exp3 = false ?  5 : true ? null: 50; //Causes the NullPointerException to be thrown.

        System.out.println("exp3 = "+exp3);
    }
}
Run Code Online (Sandbox Code Playgroud)

这段代码编译得很好.所有表达式最终试图向nullInteger输入变量exp1,exp2exp3分别.

前两种情况不会抛出任何异常并产生exp1 = null exp2 …

java nullpointerexception conditional-operator

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

作为三元运算符编译的结果,为什么返回null(需要布尔值)?

我刚刚注意到的一种好奇心,而不是一个问题.

我不被允许写

public boolean x() {
  return null;
}
Run Code Online (Sandbox Code Playgroud)

或这个:

public boolean x() {
  if (DEBUG) {
    return true;
  } else {
    return null;
  }
}
Run Code Online (Sandbox Code Playgroud)

但我被允许写

public boolean x() {
  return DEBUG ? true : null;
}
Run Code Online (Sandbox Code Playgroud)

为什么是这样?(如果采用"else"分支,它似乎会抛出NPE.)

java ternary-operator

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