You need to enable JavaScript to run this app. Java使用%.4f格式化输出球体表面积与体积时抛MissingFormatArgumentException错误
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.31 11:45:06