C#异常使用问题:输入矩形长宽负值程序仍可执行故障排查
问题原因分析
- 核心问题1:你定义的
Checksides校验方法从未被调用,你给width和length字段赋值后直接计算面积,整个流程没有触发校验逻辑,自然不会抛出异常拦截负值输入。 - 核心问题2:当前校验逻辑和字段赋值流程完全分离,即使后续补充调用校验方法,也很容易因为遗漏调用出现校验失效的问题,不符合面向对象的封装原则。
修复方案
你可以选择以下任意一种方式调整代码:
方案1:手动调用校验方法(快速修复)
只需要在计算面积前补充调用Checksides方法即可触发异常校验:
public static void Main(String[] args) { Program obj = new(); obj.width = double.Parse(Console.ReadLine()); obj.length = double.Parse(Console.ReadLine()); // 补充调用校验方法,传入赋值后的长宽 obj.Checksides(obj.width, obj.length); double area = obj.width * obj.length; Console.WriteLine(area); }
方案2:属性封装自动校验(更规范的面向对象实现)
把长宽字段封装为属性,赋值时自动触发校验,避免遗漏调用的问题:
using System; namespace Rectangle_OOP { public class Program { // 私有字段,禁止外部直接修改 private double width = 1; private double length = 1; public Program() { } // 宽度属性,赋值时自动校验 public double Width { get => width; set { if(value < 0) throw new Exception("矩形宽度不能为负值"); width = value; } } // 长度属性,赋值时自动校验 public double Length { get => length; set { if(value < 0) throw new Exception("矩形长度不能为负值"); length = value; } } public static void Main(String[] args) { Program obj = new(); // 给属性赋值自动触发校验,负值直接抛出异常 obj.Width = double.Parse(Console.ReadLine()); obj.Length = double.Parse(Console.ReadLine()); double area = obj.Width * obj.Length; Console.WriteLine(area); } } }
注意:如果需要程序捕获异常后不崩溃、给用户友好提示,可以在赋值逻辑外层加
try-catch块捕获抛出的异常做自定义处理。
内容的提问来源于stack exchange,提问作者Alice
相关产品推荐
相关产品推荐

