Java使用%.4f格式化输出球体表面积与体积时抛MissingFormatArgumentException错误
问题定位与修正
异常触发原因
java.util.MissingFormatArgumentException是printf方法的典型格式参数不匹配异常:方法会解析第一个传入的格式字符串,识别其中需要传入值替换的格式占位符(比如你用到的%.4f),并要求格式字符串之后必须传入和占位符数量、类型完全匹配的填充参数,否则就会抛出该异常。
你代码中的核心写法错误如下:
- 你用字符串拼接的方式,把待输出的数值变量直接通过
+连接到了格式字符串末尾,再整体作为printf的入参:
这种逻辑下,// 错误写法 System.out.printf("The Surface Area is: %.4f" + SA);printf实际收到的只有一个拼接完成的字符串,这个字符串里仍然保留着%.4f占位符,但方法拿到的参数列表里根本没有用来填充这个占位符的数值,自然会抛出异常。
隐藏的计算逻辑错误
除了格式写法的问题,你的代码还存在两处非异常报错但影响结果正确性的问题:
- 体积计算存在精度偏差:代码中
double V = 4/3 * 3.14 * r * r * r;这一行的4和3都是整数类型,Java中整数做除法会直接舍弃小数部分取整,4/3的运算结果为1,而非球体体积公式需要的约1.333,最终计算出的体积值会比正确值小约3倍。 - 代码中定义的
helper_SA变量没有被任何逻辑使用,属于冗余代码。
修正后的可运行代码
import java.util.Scanner; public class VolumeAndSurfaceArea { public static void main(String[] args) { Scanner sc = new Scanner(System.in); // 读取输入的半径 double r = sc.nextDouble(); // 计算表面积 double SA = 4.0 * 3.14 * r * r; // 计算体积:将4改为浮点数,避免整数除法精度损失 double V = 4.0 / 3 * 3.14 * r * r * r; // 正确的printf传参:格式字符串为第一个入参,待填充的变量依次放在后续参数位置 System.out.printf("The Surface Area is: %.4f%n", SA); System.out.printf("The Volume is: %.4f%n", V); } }
补充说明:格式串里的
%n是跨平台兼容的换行符,相比手写\n能保证在不同操作系统下都输出正确的换行效果。
内容的提问来源于stack exchange,提问作者Hardik Paudyal
相关产品推荐
相关产品推荐

