如何解决这个问题
public class DoubleTest {
public static void main(String[] args) {
double dbl = (Double) null;
String str = Double.toString(dbl);
System.out.println(str);
}
}
错误:
Exception in thread "main" java.lang.NullPointerException
at test.java.DoubleTest.main(DoubleTest.java:6)
请问好吗?
我问这个是因为我有一个返回Double的方法,我必须再次转换为String。
如果我的方法返回 null ,则会出现此问题。
答案 0 :(得分:6)
这总是会失败:
double dbl = (Double) null;
您不能将null分配给基元(小写双精度型)。 如果将其更改为大写Double,则赋值将起作用,但Double.toString(dbl)将失败,因为它不能为空。为了防止这种情况,您可以将代码更改为之前建议的(假设db1是Double而不是double):
String str = dbl != null ? Double.toString(dbl) : "null";
这将始终打印“null”,因为db1将始终为null。
答案 1 :(得分:3)
如果你有一个像这样返回null的方法:
Double d = myMethod();
然后你可以像这样进行Double to String转换:
String str = "";
if (d != null)
str = d.toString();
答案 2 :(得分:1)
From JLS #5.1.8. Unboxing Conversion
Double
类型的引用,则取消装箱转换会转换
进入r.doubleValue()
null
,则拆箱转化会引发NullPointerException
以下是为您的程序生成的字节代码
0 aconst_null
1 invokevirtual java.lang.Double.doubleValue() : double [16]
4 dstore_1 [dbl]
5 dload_1 [dbl]
6 invokestatic java.lang.Double.toString(double) : java.lang.String [22]
9 astore_3 [str]
10 getstatic java.lang.System.out : java.io.PrintStream [26]
13 aload_3 [str]
14 invokevirtual java.io.PrintStream.println(java.lang.String) : void [32]
17 return
适当的解决方案是使用已经处理String.valueOf
案例的null
。
public static void main(String[] args) {
Double dbl = null;
String str = String.valueOf(dbl);//Str will have `null` value
System.out.println(str);
}
第二种方法
public static void main(String[] args) {
Double dbl = null;
String str = null;
if (dbl != null) {
str = String.valueOf(dbl);// <--This is dead code currently but it
// is useful if you are checking
// against null
}
System.out.println(str);
}
答案 3 :(得分:0)
该行
double dbl = (Double) null;
是这里的问题,但它实际上与从null到Double的转换有关。由于此处的演员,您将获得Nullpointerexception
,而不是因为作业。
将对象Autounboxing为对象为null的原语时会出现类似的问题:
Double myDouble = null;
double dbl = myDouble;
答案 4 :(得分:0)
Double有一个toString方法,理想情况下应该处理转换本身。
由于Double也可以为null,您可能希望自己处理它或让toString将其作为“null”返回。
String str = (dblVariable == null)? {custom-code-here} : dblVariable.toString();