C#计算器try-catch中除零返回Infinite未触发对应异常问题求助
问题根因
C# 中对 double/float 这类浮点数执行除零操作时,不会抛出 DivideByZeroException 异常,只会返回 Double.PositiveInfinity(正无穷)、Double.NegativeInfinity(负无穷)或者 Double.NaN(非数字)这类特殊值,只有对整数类型执行除零操作时才会自动触发除零异常。
你代码中把 num1、num2 都定义为了 double 类型,所以4/0的场景不会进入catch分支,只会直接输出 Infinite。
解决方案
你可以任选以下一种方式修复问题:
方案1:手动在除法逻辑中抛出异常
修改 Calculator 类的 Division 方法,主动判断除数为0的场景并抛出异常,即可被外层catch块捕获:
public double Division(double num1, double num2) { this.number1 = num1; this.number2 = num2; // 手动判断除数为0的情况 if (num2 == 0) { throw new DivideByZeroException(); } this.res = num1 / num2; return res; }
方案2:将运算数改为整数类型
如果你当前的计算器只需要支持整数运算,可以直接把 num1、num2 的类型从 double 改为 int,此时除零操作会自动触发 DivideByZeroException:
// 修改变量定义部分 int num1 = Convert.ToInt32(Console.ReadLine()); Console.Write("\nnumber1: " + num1); int num2 = Convert.ToInt32(Console.ReadLine()); Console.Write("\nnumber2: " + num2);
同时同步修改 Calculator 类中四个方法的入参、成员变量类型为 int 即可。
完整修改示例(基于方案1)
class Program { static void Main(string[] args) { Calculator calc = new Calculator(); try{ double num1 = Convert.ToInt32(Console.ReadLine()); Console.Write("\nnumber1: " + num1); double num2 = Convert.ToInt32(Console.ReadLine()); Console.Write("\nnumber2: " + num2); string operand = Console.ReadLine(); Console.Write("\noperator: " + operand); Console.Write("\nresult: "); if(operand == "+"){ Console.WriteLine(calc.Addition(num1, num2)); } else if(operand == "-"){ Console.WriteLine(calc.Subtraction(num1, num2)); } else if(operand == "*"){ Console.WriteLine(calc.Multiplication(num1, num2)); } else{ Console.WriteLine(calc.Division(num1, num2)); } } catch(DivideByZeroException){ Console.WriteLine("can't divide by zero"); } catch(Exception e){ Console.WriteLine("An error occurred. Only integers are allowed!"); } } } class Calculator{ private double number1; private double number2; private double res; public double Addition(double num1, double num2){ this.number1 = num1; this.number2 = num2; this.res = num1 + num2; return res; } public double Subtraction(double num1, double num2){ this.number1 = num1; this.number2 = num2; this.res = num1 - num2; return res; } public double Multiplication(double num1, double num2){ this.number1 = num1; this.number2 = num2; this.res = num1 * num2; return res; } public double Division(double num1, double num2){ this.number1 = num1; this.number2 = num2; if (num2 == 0) { throw new DivideByZeroException(); } this.res = num1 / num2; return res; } }
内容的提问来源于stack exchange,提问作者codingwizard
相关产品推荐
相关产品推荐

