Java空双对象格式

Java空双对象格式,java,string-formatting,Java,String Formatting,对于Java来说,这是正确的行为吗 public static void main(String[] args) { String floatFormat = "%4.2f\n"; Double d = null; String s = String.format("%4f\n" + floatFormat, d, d); System.out.print(s); } 输出: null nu 我的解决办法是硬编码“null”这个词,这很烦人 String

对于Java来说,这是正确的行为吗

public static void main(String[] args) {
    String floatFormat = "%4.2f\n";
    Double d = null;
    String s = String.format("%4f\n" + floatFormat, d, d);
    System.out.print(s);
}
输出:

null
  nu
我的解决办法是硬编码“null”这个词,这很烦人

String thing = (d != null) ? String.format(floatFormat, d) : "null\n";
在Javadoc中的“常规”格式类别(包括
%s
)下是:

精度是要写入输出的最大字符数。精度在宽度之前应用,因此即使宽度大于精度,输出也将被截断为精度字符。如果未指定精度,则字符数没有明确限制

我有经验的猜测是,当格式化程序看到空值时,它会将
f
转换切换到
s
,因为将字符串
null
格式化为浮点数是没有意义的。然后在该上下文中解释宽度和精度。字段宽度仍然是4,但最大输出长度是2,右对齐,给出您看到的结果

Javadoc后面的内容是:

除非另有规定,否则将null参数传递给此类中的任何方法或构造函数将导致引发NullPointerException


因此,我想说,有一个很好的案例可以向Oracle提交一个bug,因为规范明确指出您的案例需要NPE。

以上是Java 6,update 45中观察到的。在这种情况下,“MyConsole”是什么?它应该与String.format相同。对不起,代码不是通用的。我将重写它,因为Java指定:“null参数的行为取决于”True,但是指定了某些转换的null行为,但是对于
%f
它没有指定。我认为这就是本文结尾处的全面NPE要求的目的。