这是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";
答案 0 :(得分:2)
在Javadoc中的“常规”格式类别(包括%s
)下是:
精度是要写入输出的最大字符数。精度在宽度之前应用,因此即使宽度大于精度,输出也会被截断为精确字符。如果未指定精度,则字符数没有明确限制。
我有根据的猜测是,当格式化程序看到null时,它会将f
转换切换为s
,因为将字符串null
格式化为float是没有意义的。然后它解释该上下文中的宽度和精度。字段宽度仍为4,但最大输出长度为2,右对齐,给出您看到的结果。
稍后在Javadoc就是:
除非另有说明,否则将null参数传递给此类中的任何方法或构造函数都将导致抛出NullPointerException。
所以我说有一个很好的案例可以向Oracle提交一个错误,因为规范明确指出你的案例需要NPE。