Java程序报UnknownFormatConversionException错误:Conversion='-'求助
问题排查与修复
核心错误原因
你遇到的UnknownFormatConversionException由两个格式字符串问题直接导致:
- 格式说明符笔误:所有
%.of都是拼写错误,应写成%.0f(是数字0,不是字母o)。JVM解析无效的%.of时,会将后续字符误判为非法转换符,触发异常。 - 参数数量不匹配:在
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
相关产品推荐
相关产品推荐

