You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.23 14:36:03