3

如何解决这个问题呢

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,那么就会出现这个问题。

4

5 回答 5

6

这将永远失败:

 double dbl = (Double) null;

您不能将 null 分配给基元(小写双精度)。如果将其更改为大写 Double,则分配将起作用,但 Double.toString(dbl) 会失败,因为它不能为空。为了防止这种情况,您可以将代码更改为之前建议的代码(假设 db1 是 Double 而不是 double):

String str = dbl != null ? Double.toString(dbl) : "null";

这将始终打印“null”,因为 db1 将始终为空。

于 2012-10-31T12:48:30.430 回答
3

如果您有一个返回 null 的方法,如下所示:

Double d = myMethod();

然后你可以像这样进行 Double 到 String 的转换:

String str = "";

if (d != null)
   str = d.toString();
于 2012-10-31T12:53:01.963 回答
2

From JLS #5.1.8. Unboxing Conversion

  • 如果 r 是 type 的引用Double,则拆箱转换将 r 转换为r.doubleValue()
  • 如果 r 是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.valueOfwhich 已经处理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);

}
于 2012-10-31T13:12:42.120 回答
0

线

 double dbl = (Double) null; 

是这里的问题,但它实际上与从 null 到 Double 的转换有关。你会得到一个Nullpointerexception由于这里的演员,而不是因为分配。

将对象自动拆箱到对象为空的原语会出现类似的问题:

Double myDouble = null;
double dbl = myDouble;
于 2012-10-31T12:58:53.903 回答
0

Double 有一个 toString 方法,理想情况下应该处理转换本身。

由于 Double 也可以为 null,因此您可能希望自己处理它或让 toString 将其返回为“null”。

String str = (dblVariable == null)? {custom-code-here} : dblVariable.toString();

于 2012-10-31T12:59:49.427 回答