Java数值统计程序输入负数触发ArithmeticException除零异常求助
代码问题排查与修复
直接触发异常的根因
报错栈指向的/ by zero异常,来自代码第29行的平均值计算语句。该位置的count变量在整个程序流程中从未执行自增操作,分母始终为初始值0,直接触发整数除零异常。
全部逻辑错位问题梳理
- 循环终止判断逻辑完全失效:
读取输入值后,代码额外执行了next++操作才判断值是否为负数。原本的终止规则是“输入负数即停止”,这步自增会篡改输入值:比如用户输入-1作为终止标记,自增后变成0,永远无法满足<0的判断条件,循环永远不会正常终止;如果用户输入-2作为终止标记,自增后变成-1,不仅篡改了用户输入的统计值,判断逻辑也完全偏离设计初衷。 - 统计逻辑位置完全错位:
有效数字的计数、最值更新本该在循环内每读一个数时实时执行,原代码将最值判断、重复累加求和的逻辑全部放到循环外部,导致所有正常输入的数字根本不会被统计,最后只会拿循环退出时的最后一个输入值做比较,结果完全错误。 - 统计范围包含无效值:
用来终止循环的负数本不该参与总和、最大值、最小值的计算,原代码在循环外重复将该负数累加到总和中,还拿它参与最值比较,哪怕解决了除零问题,输出的统计结果也是错的。
修正后的可运行代码
import java.util.*; public class AverageMinMax { public static void main(String[] args) { Scanner keyboard = new Scanner(System.in); double average; int count = 0, sum = 0, next; int max = Integer.MIN_VALUE; int min = Integer.MAX_VALUE; System.out.println("Please enter the numbers you wish to evaluate:"); System.out.println("Followed by a negative number to stop input"); do { next = keyboard.nextInt(); // 碰到负数直接终止循环,不参与统计 if (next < 0) { break; } // 有效数字实时统计 count++; sum += next; if (next > max) { max = next; } if (next < min) { min = next; } } while (true); // 处理无有效输入的边界,避免再次除零 if (count == 0) { System.out.println("未输入有效数字,无法计算统计结果"); return; } average = (double) sum / count; System.out.println("Your average is: " + average); System.out.println("Your maximum number is: " + max); System.out.println("Your minimum number is: " + min); } }
修正点说明
- 删除了无意义的
next++篡改输入值的操作,将负数判断前置,碰到终止值直接跳出循环,不进入后续统计流程 - 将计数、求和、最值更新逻辑全部移到循环内部,每读取一个有效数字就实时更新统计值
- 增加了无有效输入的边界判断,避免用户启动程序后直接输入负数时再次触发除零异常
- 移除了绕弯的
areMore布尔判断,直接用break实现终止逻辑,减少逻辑错位的可能
内容的提问来源于stack exchange,提问作者Condor mitnick
相关产品推荐
相关产品推荐

