Java中throws关键字作用疑惑:移除后程序运行无差异
关于Java中throws关键字的作用,我来给你掰扯清楚!
兄弟我太懂你的困惑了!刚学Java的时候我也盯着这个throws看半天——明明去掉它程序照样跑,那这玩意儿到底是干嘛用的?咱们一步步来拆解:
首先,你得搞懂「受检异常」和「非受检异常」的区别
你例子里的NumberFormatException属于非受检异常(RuntimeException的子类),这类异常Java编译器是「放养」的:它不会强制要求你用try-catch捕获,也不会强制要求你用throws声明。所以你去掉throws NumberFormatException之后,程序该跑还是跑,异常照样会被上层的catch块抓住——这就是为啥你觉得没用的原因!
但如果换成受检异常(比如IOException、SQLException这类不是RuntimeException子类的异常),throws的作用立刻就显现了!比如下面这个读文件的例子:
import java.io.FileReader; import java.io.IOException; public class CheckedDemo { // 这里必须加throws IOException,不然编译器直接报错! private static void readFile() throws IOException { FileReader reader = new FileReader("test.txt"); reader.read(); } public static void main(String[] args) { try { readFile(); } catch (IOException e) { System.out.println("文件读崩了:" + e.getMessage()); } } }
要是你把readFile方法里的throws IOException删掉,Eclipse肯定会给你飘红叉——因为受检异常必须被「处理」:要么自己用try-catch抓,要么用throws甩给上层调用者处理。这时候throws就是必须的了!
其次,就算是非受检异常,throws也有它的意义
哪怕是像NumberFormatException这种非受检异常,加上throws声明也不是没用:
- 给调用者提个醒:相当于在方法签名里写了个「警告牌」——「我这个方法可能会抛出数字格式异常哦,你调用的时候最好留意一下」。你看Java官方API里,很多方法哪怕抛的是非受检异常,也会加
throws,就是为了文档化,让开发者一眼就知道这个方法的风险点。 - 明确异常传递链条:有时候你不想在当前方法处理异常,想把锅甩给上层业务逻辑去处理,
throws就是干这个的。比如你写了个工具方法专门做字符串转数字,你不想在工具方法里处理转换失败的情况,就可以throws NumberFormatException,让调用这个工具方法的业务代码去捕获并处理(比如给用户提示输入错误),这样职责划分更清晰。
回到你的例子总结一下
你去掉throws后程序能正常运行,只是因为你用的是非受检异常,Java允许你「偷偷摸摸」地抛而不声明。但throws的核心作用是:
- 处理受检异常的强制要求——编译器逼着你要么抓要么甩;
- 作为代码文档,明确告知调用者方法可能抛出的异常;
- 传递异常,让上层代码来处理,实现职责分离。
以后遇到受检异常的时候,你就能深刻体会到throws的必要性啦!
内容的提问来源于stack exchange,提问作者Tricolor
相关产品推荐
相关产品推荐

