You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Java中何时抛出IllegalStateException与IllegalArgumentException?

区分 IllegalStateException 和 IllegalArgumentException 这俩Java异常

先从官方Javadoc的定义入手:

IllegalStateException表示方法在非法或不适当的时机被调用,换言之,Java环境或Java应用处于不适合执行请求操作的状态。
IllegalArgumentException用于表明方法被传入了非法或不适当的参数。

但实际开发里,这俩的边界有时候没那么绝对,咱们拿一个解析调用者提供的文件的场景来聊聊:

假设我们有个方法 parseFile(String filePath),负责解析指定路径的文件:

  • 如果调用者传入的是一个格式完全不合法的路径字符串(比如包含系统不允许的特殊字符,或者根本不符合路径格式),这时候抛出 IllegalArgumentException 就很合理——问题出在参数本身,不管应用处于什么状态,这个参数都是无效的。
  • 但如果调用者传入的路径格式是对的,但文件不存在,或者当前应用没有读取该文件的权限,这时候就该抛 IllegalStateException 了——参数本身是合法的,但当前系统/应用的状态不允许执行这个操作。

再举个常见场景:比如一个初始化方法 initialize(),如果用户在已经初始化过之后又调用了一次,这时候抛出 IllegalStateException 就对了——当前对象的状态已经是初始化完成,不适合再执行初始化操作,和参数完全无关。

最后给你提炼下核心区别:

  • IllegalArgumentException:锅在参数本身,参数从根上就不合法,和应用状态无关。
  • IllegalStateException:参数没问题,但当前系统/对象的状态不支持执行这个操作

内容的提问来源于stack exchange,提问作者Abhijit Sarkar

火山引擎 最新活动