Java中何时抛出IllegalStateException与IllegalArgumentException?
区分 IllegalStateException 和 IllegalArgumentException 这俩Java异常
先从官方Javadoc的定义入手:
IllegalStateException表示方法在非法或不适当的时机被调用,换言之,Java环境或Java应用处于不适合执行请求操作的状态。
IllegalArgumentException用于表明方法被传入了非法或不适当的参数。
但实际开发里,这俩的边界有时候没那么绝对,咱们拿一个解析调用者提供的文件的场景来聊聊:
假设我们有个方法 parseFile(String filePath),负责解析指定路径的文件:
- 如果调用者传入的是一个格式完全不合法的路径字符串(比如包含系统不允许的特殊字符,或者根本不符合路径格式),这时候抛出
IllegalArgumentException就很合理——问题出在参数本身,不管应用处于什么状态,这个参数都是无效的。 - 但如果调用者传入的路径格式是对的,但文件不存在,或者当前应用没有读取该文件的权限,这时候就该抛
IllegalStateException了——参数本身是合法的,但当前系统/应用的状态不允许执行这个操作。
再举个常见场景:比如一个初始化方法 initialize(),如果用户在已经初始化过之后又调用了一次,这时候抛出 IllegalStateException 就对了——当前对象的状态已经是初始化完成,不适合再执行初始化操作,和参数完全无关。
最后给你提炼下核心区别:
- IllegalArgumentException:锅在参数本身,参数从根上就不合法,和应用状态无关。
- IllegalStateException:参数没问题,但当前系统/对象的状态不支持执行这个操作。
内容的提问来源于stack exchange,提问作者Abhijit Sarkar




