Java中BufferedReader引发NumberFormatException问题求助
解决Java二次方程程序的NumberFormatException: null错误
错误原因
java.lang.NumberFormatException: null 这个异常是因为 BufferedReader.readLine() 返回了 null,而 Integer.parseInt() 无法将 null 解析为整数。通常触发这个问题的场景是:
- 控制台输入时提前终止了输入流(比如Windows按
Ctrl+Z,Linux/macOS按Ctrl+D) - 没有输入任何内容就结束了输入
修复方案
针对初学者,我们可以从输入校验、明确提示、异常捕获三个方面优化代码,提升程序健壮性:
- 给每个输入添加明确提示,让用户清楚当前需要输入哪个参数(a、b还是c)
- 先校验输入内容再解析,判断输入是否为
null或空字符串 - 捕获异常并提示用户重新输入,避免程序直接崩溃
修改后的完整代码
import java.io.*; public class Main { public static void main(String args[]) { InputStreamReader reader = new InputStreamReader(System.in); BufferedReader in = new BufferedReader(reader); int a = 0, b = 0, c = 0; double discriminant = 0; // 读取二次项系数a,带校验和异常处理 while (true) { System.out.print("请输入二次项系数a: "); try { String input = in.readLine(); if (input == null || input.trim().isEmpty()) { System.out.println("输入不能为空,请重新输入"); continue; } a = Integer.parseInt(input.trim()); // 二次项系数不能为0,否则不是二次方程 if (a == 0) { System.out.println("a不能为0,否则不是二次方程,请重新输入"); continue; } break; } catch (IOException e) { System.out.println("读取输入时出错,请重新输入"); } catch (NumberFormatException e) { System.out.println("请输入有效的整数"); } } // 读取一次项系数b while (true) { System.out.print("请输入一次项系数b: "); try { String input = in.readLine(); if (input == null || input.trim().isEmpty()) { System.out.println("输入不能为空,请重新输入"); continue; } b = Integer.parseInt(input.trim()); break; } catch (IOException e) { System.out.println("读取输入时出错,请重新输入"); } catch (NumberFormatException e) { System.out.println("请输入有效的整数"); } } // 读取常数项c while (true) { System.out.print("请输入常数项c: "); try { String input = in.readLine(); if (input == null || input.trim().isEmpty()) { System.out.println("输入不能为空,请重新输入"); continue; } c = Integer.parseInt(input.trim()); break; } catch (IOException e) { System.out.println("读取输入时出错,请重新输入"); } catch (NumberFormatException e) { System.out.println("请输入有效的整数"); } } // 计算判别式并判断根的情况 discriminant = b * b - 4 * a * c; if (discriminant > 0) { System.out.println("根是实数且不相等"); } else if (discriminant == 0) { System.out.println("根是实数且相等"); } else { System.out.println("根是虚数且不相等"); } } }
额外说明
- 新增了二次项系数
a不能为0的校验,符合二次方程的数学定义 - 每个输入用循环处理,直到用户输入正确内容,提升程序友好性
- 移除了
main方法的throws IOException,改为内部捕获异常,更适合初学者理解异常逻辑
内容的提问来源于stack exchange,提问作者user3771062
相关产品推荐
相关产品推荐

