Java作业异常捕获问题:大于判定被误判为大于等于
修复Rectangle类的异常判定逻辑问题
看起来你遇到的问题很明确——条件判断的边界值写错了,导致本该被捕获的非法数值(比如-0.5、20.5)没被检测到,反而只抓了更极端的数值。咱们一步步来解决:
问题分析
你提到程序现在只能捕获-1及以下或21及以上的数值,但需求是捕获小于0或大于20的数值。这说明你的setWidth和setHeight方法里的条件判断用错了边界运算符:
- 原本应该判断
width < 0(小于0就非法),但你可能写成了width <= -1; - 原本应该判断
width > 20(大于20就非法),但你可能写成了width >= 21;
或者更常见的是,你在判断合法范围时混淆了运算符,比如误把非法条件写成了只捕获极端值的范围,漏掉了0到-1、20到21之间的非法数值。
修正后的代码示例
咱们直接用Java标准的IllegalArgumentException(专门处理非法参数的异常,比自定义异常更符合规范),同时修正核心的条件判断逻辑:
public class Rectangle { private double width; private double height; // 构造方法,调用set方法做参数校验 public Rectangle(double width, double height) { setWidth(width); setHeight(height); } // 修正宽度的异常判定逻辑 public void setWidth(double width) { // 正确判定:小于0 或者 大于20 就抛出异常 if (width < 0 || width > 20) { throw new IllegalArgumentException("宽度必须在0到20之间(包含0和20)"); } this.width = width; } // 同理修正高度的判定 public void setHeight(double height) { if (height < 0 || height > 20) { throw new IllegalArgumentException("高度必须在0到20之间(包含0和20)"); } this.height = height; } // 可选:添加get方法用于测试 public double getWidth() { return width; } public double getHeight() { return height; } }
测试异常捕获的示例代码
在调用方代码里,用try-catch块来捕获并处理异常:
public class Main { public static void main(String[] args) { // 测试小于0的非法宽度 try { Rectangle badRect1 = new Rectangle(-0.5, 10); } catch (IllegalArgumentException e) { System.out.println("捕获到异常:" + e.getMessage()); } // 测试大于20的非法高度 try { Rectangle badRect2 = new Rectangle(10, 20.5); } catch (IllegalArgumentException e) { System.out.println("捕获到异常:" + e.getMessage()); } // 测试合法数值 try { Rectangle goodRect = new Rectangle(5, 15); System.out.println("矩形创建成功,宽:" + goodRect.getWidth() + ",高:" + goodRect.getHeight()); } catch (IllegalArgumentException e) { System.out.println("捕获到异常:" + e.getMessage()); } } }
关键注意点
- 边界值要精准:需求是“小于0或大于20”非法,所以条件必须是
width < 0 || width > 20,这样0和20会被判定为合法,-0.5、20.5这类临界非法值也能被正确捕获; - 异常信息要清晰:抛出异常时给出明确的提示,方便调试时快速定位问题;
- 复用校验逻辑:构造方法直接调用
set方法,避免重复写校验代码,保持代码简洁。
内容的提问来源于stack exchange,提问作者GregP
相关产品推荐
相关产品推荐

