throw new exception是实际抛出异常对象,必须在方法体内执行;throws是声明可能抛出的异常类型,写在方法签名后,不执行抛出动作。

关键就看“谁在动”——throw new Exception 是真抛出一个异常对象,throws 是提前打招呼说“我可能会抛”。一个在方法里面执行,一个写在方法头上声明;一个动手,一个预告。
throw new Exception:真刀真枪抛异常
这是实际触发异常的动作,必须出现在方法体内部,而且后面跟的是一个已经创建好的异常对象(用 new 构造出来的)。
- 每次只能抛一个异常对象,比如
throw new IOException("文件读取失败") - 一旦执行到这行,当前方法立刻停止,异常向上一层调用者传递
- 如果抛的是受检异常(checked exception,比如
IOException、SQLException),而方法里又没用try-catch捕获,就必须在方法声明处用throws声明,否则编译不通过 - 常用于业务校验失败时主动报错,比如年龄为负、金额非法、配置文件缺失等
throws:只声明,不执行
它不抛任何东西,只是在方法签名末尾写个“免责声明”,告诉调用者:“我这个方法有可能抛出这些异常,请你负责处理。”
- 写在方法名后面、参数列表之后,比如
public void save() throws IOException, SQLException - 后面跟的是异常类型名(类名),不是对象;可以列多个,用逗号隔开
- 它本身不产生异常,也不影响程序流程;即使方法里没写
throw,只要声明了throws,调用方也得按规矩处理 - 主要针对受检异常;运行时异常(如
NullPointerException、IllegalArgumentException)默认不用声明
典型配合场景
两者经常一起用:方法内部用 throw 抛,方法声明用 throws 告诉别人“我可能抛这个”。
- 比如读文件:方法里检测到文件不存在,就
throw new FileNotFoundException(...) - 但这个异常是受检的,所以方法声明必须加上
throws FileNotFoundException - 调用这个方法的人,要么用
try-catch接住,要么自己也加throws往上传
容易混淆的点
记住两个硬规则:
-
throw后面一定是new XxxException(...)或已有异常变量,绝不能写类名 -
throws后面只能是异常类名,绝不能带new,也不能写异常消息 - 语法写错(比如把
throw写成throws),编译器直接报错,根本跑不起来
Java免费学习笔记:立即使用
解锁 Java 大师之旅:从入门到精通的终极指南











