You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Java程序报UnknownFormatConversionException错误:Conversion='-'求助

问题排查与修复

核心错误原因

你遇到的UnknownFormatConversionException由两个格式字符串问题直接导致:

  1. 格式说明符笔误:所有%.of都是拼写错误,应写成%.0f(是数字0,不是字母o)。JVM解析无效的%.of时,会将后续字符误判为非法转换符,触发异常。
  2. 参数数量不匹配:在r == 0的分支中,格式字符串包含4个%占位符,但仅传入a, b, c三个参数,缺少对应最后一个占位符的r,导致解析逻辑混乱。

此外代码还有两个潜在问题需要修复:

  • 重复计算判别式:多次重复计算Math.pow(b,2) - (4 * a * c),冗余且影响性能。
  • 负数开根号异常:当判别式为负时,调用Math.sqrt()会抛出IllegalArgumentException,需提前判断规避。

修复后的完整代码

import java.util.Scanner;

public class RootsTestHamer {
    public static void main(String[] args) {
        // 声明变量
        double a, b, c;
        double r1, r2;
        
        Scanner input = new Scanner(System.in);
        
        // 提示用户输入系数A、B、C
        System.out.print("Enter the A coefficent:");
        a = input.nextDouble();
        System.out.print("Enter the B coefficent:");
        b = input.nextDouble();
        System.out.print("Enter the C coefficent:");
        c = input.nextDouble();

        // 仅计算一次判别式,复用结果
        double discriminant = Math.pow(b, 2) - 4 * a * c;
        double rootCount = roots(a, b, c);

        // 仅当判别式非负时计算根,避免负数开根号报错
        if (discriminant >= 0) {
            r1 = (-b + Math.sqrt(discriminant)) / (2 * a);
            r2 = (-b - Math.sqrt(discriminant)) / (2 * a);
        } else {
            r1 = r2 = Double.NaN; // 用NaN标记无实根
        }

        // 结果输出逻辑
        if (rootCount > 1) {
            System.out.printf("%.0f, %.0f, and %.0f coefficients have %.0f real roots:\n", a, b, c, rootCount);
            System.out.printf("\tR1 = %.2f\n", r1);
            System.out.printf("\tR2 = %.2f\n", r2); // 修正笔误:将重复的R1改为R2
        } else if (rootCount == 1) {
            System.out.printf("%.0f, %.0f, and %.0f coefficients have %.0f real roots:\n", a, b, c, rootCount);
            System.out.printf("\tR1 = %.2f\n", r1);
        } else if (rootCount == 0) {
            System.out.printf("%.0f, %.0f, and %.0f coefficients have %.0f real roots:\n", a, b, c, rootCount);
        }
        
        input.close(); // 关闭Scanner资源
    }

    // 自定义方法:判断实根数量
    public static double roots(double a, double b, double c) {
        double discriminant = Math.pow(b, 2) - 4 * a * c;
        if (discriminant > 0) {
            return 2;
        } else if (discriminant == 0) {
            return 1;
        } else {
            return 0;
        }
    }
}

关键修复点说明

  • 修正所有%.of为%.0f,确保格式说明符合法。
  • 补全r == 0分支中缺失的r参数,保证占位符与参数数量匹配。
  • 将判别式计算提取为单独变量,避免重复计算,提升代码可读性与性能。
  • 增加判别式非负判断,用Double.NaN标记无实根的情况,避免负数开根号异常。
  • 修正输出笔误:将重复的R1改为R2,避免结果混淆。
  • 添加Scanner资源关闭操作,符合Java资源管理规范。

内容的提问来源于stack exchange,提问作者Brando

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.13 20:45:54