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

主应用Setter方法无法抛出自定义异常问题及相关疑问

问题分析与解决方案

咱们一步步拆解你的问题,逐个解决:

1. 为什么try-catch没捕获异常?核心逻辑错误!

你在setThesisMark方法里的条件判断完全写反了:

// 错误的条件:任何整数都会满足这个判断!
if (markInput>0 || markInput<100) {

这个逻辑意味着所有输入都会进入赋值分支——比如-75小于100,所以直接赋值,根本不会进入else块抛出异常。这就是你看不到异常信息的原因,因为异常压根没被触发!

修正后的setThesisMark方法

把条件改成判断输入是否在合法范围(0-100,包含边界):

public void setThesisMark(int markInput) throws StudentException {
    // 正确的合法范围判断
    if (markInput >= 0 && markInput <= 100) {
        thesisMark = markInput;
    } else {
        throw new StudentException("Invalid thesis mark: " + markInput + ". Must be between 0 and 100.");
    }
}

2. 解决编译错误:未报告的StudentException

StudentException是检查型异常(继承自Exception而非RuntimeException),所以调用声明了throws StudentException的方法时,必须做以下两件事之一:

  • 用try-catch块捕获并处理异常;
  • 在调用方法(比如main)上声明throws StudentException,把异常向上抛出。

修正后的Main.java代码

下面是用try-catch捕获异常的正确写法:

class Main {
    public static void main(String[] args) {
        PostGradStudent pgs = new PostGradStudent( "Jack", "Bauer", 70);
        System.out.println("Before change:");
        System.out.println(pgs.getThesisMark());
        
        // 用try-catch包裹非法赋值操作,捕获异常
        try {
            pgs.setThesisMark(-75);
            System.out.println("After change:");
            System.out.println(pgs.getThesisMark());
        } catch (StudentException e) {
            // 打印异常信息
            System.out.println("Error: " + e.getMessage());
        }
    }
}

运行这段代码后,你会看到预期的异常输出:

Error: Invalid thesis mark: -75. Must be between 0 and 100.

3. 是否适合为所有Setter方法添加异常处理?

不是所有Setter都需要加异常处理,要根据属性的约束场景来判断:

适合添加异常的场景

  • 属性有严格的合法性规则(比如分数、年龄、金额等);
  • 非法输入会导致对象处于无效状态,必须让调用者明确处理这个错误;
  • 团队规范要求使用检查型异常来强制调用者关注合法性问题。

不适合添加异常的场景

  • 属性没有严格约束(比如普通字符串、可选的描述字段);
  • 非法输入可以通过默认值或自动修正处理(比如输入null时设置为空字符串,输入负数年龄时设为0);
  • 你希望用更轻量的方式处理(比如抛出IllegalArgumentException这类运行时异常,不需要强制try-catch,但要注意团队规范)。

总的来说,异常处理的核心是:只在必须让调用者知晓并处理错误的场景下使用,避免过度设计导致代码冗余。

内容的提问来源于stack exchange,提问作者j.hall

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.09 21:02:29