围绕Integervs int在Java中进行了讨论.前者的默认值是null后者的默认值0.Booleanvs boolean?怎么样?
我的应用程序中的变量可以有0/ 1值.我想使用boolean/ Boolean而不想使用int.我可以使用Boolean/ boolean代替吗?
我对条件运算符有点疑惑.请考虑以下两行:
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
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) 我在下面的一个实例中得到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相反,它输出null的withIfElse,然后失败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) 请考虑以下代码段:
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能告诉我),变量testMin和verwachtMin应该是等价的.
正如您所料,我宁愿写最后两行而不是前七行.但是,当我将3个空值传递给此方法时,我得到一个NPE来计算verwachtMin变量.
有谁知道这会怎么样?三元运算符是否评估第二部分,即使条件不是true?
(Java版本1.6.0_21)
当我写这样的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中的实用工具方法它转换Boolean成boolean和自动处理空引用Boolean假?
为什么下面的代码行产生了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)
不会产生异常.
为什么这个很好,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,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),但为什么呢?为什么更改三元运算符中的另一个表达式(如第二个示例中)修复它?任何人都可以提供某种形式的叙述,确切地知道两个例子中的内容何时,什么以及为何被盒装和取消装箱?
为什么以下抛出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) 以下代码使用简单的条件运算符.
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)
这段代码编译得很好.所有表达式最终试图向null到Integer输入变量exp1,exp2并exp3分别.
前两种情况不会抛出任何异常并产生exp1 = null exp2 …
我刚刚注意到的一种好奇心,而不是一个问题.
我不被允许写
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.)