throw用于方法内抛出异常对象,立即中断执行;throws用于方法声明处声明可能抛出的异常类型,仅作提醒。前者抛一个异常,后者可声明多个,且只对受检异常有强制约束。

throw 和 throws 看起来像一对“兄弟”,但分工很明确:一个负责“动手抛”,一个负责“提前打招呼”。
throw 是实际抛出异常的动作
它出现在方法内部,后面必须跟一个 真实的异常对象(用 new 创建),一执行就中断当前流程,把异常交上去。
- 只能抛一个异常,比如
throw new IllegalArgumentException("用户名不能为空") - 抛出后,这行代码后面的语句不会执行
- 常用于参数校验失败、业务规则不满足等主动拦截场景
- 可以抛运行时异常(RuntimeException 及其子类),不用强制处理;但抛受检异常(如 IOException)时,必须配合 try-catch 或 throws,否则编译不通过
throws 是在方法头上“声明风险”
它写在方法签名末尾,后面跟的是 异常类型名(不是对象),不抛异常,只是提醒调用者:“我这个方法可能会出这些错,你得管好。”
- 可以声明多个异常,用逗号分隔,比如
throws IOException, SQLException - 只对受检异常(Checked Exception)有强制约束;运行时异常加不加 throws 都不影响编译
- 本质是把异常处理责任转移给上层调用者
- 子类重写父类方法时,throws 声明的异常不能比父类更宽(只能更具体,或不声明)
典型配合方式
它们经常一起出现:方法里用 throw 抛异常,方法头用 throws 告诉别人“我会抛”,调用方再决定是 try-catch 捕获,还是继续 throws 上抛。
专业级别的大型网站建站产品,JAVA技术的CMS管理系统,ospod提供上百套专业模板供您选择,包括审批工作流,流量统计和流行网络应用,是公司企业建设专业网站的首选产品,也使用于专业建站人士完成复杂网站项目。管理地址cmsadmin登陆用户名:ospod 密码:ospod1234
立即学习“Java免费学习笔记(深入)”;
- 比如读文件方法:内部检测到文件不存在,
throw new FileNotFoundException();方法声明就得写public void readFile() throws FileNotFoundException - 又比如校验年龄:方法体内
if (age ;因为是运行时异常,方法头可不写 throws,但加了更清晰
基本上就这些。记牢一点:throw 后面是 new 出来的对象,throws 后面是类名——看有没有 new,就知道该用谁。










