登录
首页 >  文章 >  java教程

Java中throw与throws的区别详解

时间:2026-04-06 09:19:12 430浏览 收藏

在Java异常处理机制中,throw与throws虽仅一字之差,却承担着截然不同的职责:throw是方法内部“亲手抛出”一个具体异常对象的执行动作,一旦触发即中断当前流程;throws则是方法声明处的“风险预告”,用异常类名提前告知调用者可能遭遇的受检异常,实现责任上移。二者常协同工作——方法内用throw主动拦截问题(如参数校验失败),方法头用throws明确契约边界,而“有new用throw,无new用throws”这一口诀,正是快速区分二者的关键心法。

java 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 上抛。

  • 比如读文件方法:内部检测到文件不存在,throw new FileNotFoundException();方法声明就得写 public void readFile() throws FileNotFoundException
  • 又比如校验年龄:方法体内 if (age ;因为是运行时异常,方法头可不写 throws,但加了更清晰

基本上就这些。记牢一点:throw 后面是 new 出来的对象,throws 后面是类名——看有没有 new,就知道该用谁。

以上就是本文的全部内容了,是否有顺利帮助你解决问题?若是能给你带来学习上的帮助,请大家多多支持golang学习网!更多关于文章的相关知识,也可关注golang学习网公众号。

资料下载
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>