6

这是 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";
4

1 回答 1

2

%s在Javadoc 中的“一般”格式类别(包括)下是:

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

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

稍后在 Javadoc 中是这样的:

除非另有说明,否则将 null 参数传递给此类中的任何方法或构造函数将导致抛出 NullPointerException。

因此,我认为向 Oracle 提交错误是一个很好的案例,因为规范明确指出您的案例需要 NPE。

于 2013-10-03T07:20:03.953 回答