Java 异常命名规范

24
在Java中,使用“Illegal”(例如IllegalArgumentException)和“Invalid”(例如javax.activity.InvalidActivityException)是否有语义上的区别?
在编写IllegalArgumentException子类来表示一系列无法标记化的输入字符时,想知道是使用InvalidTokenException还是IllegalTokenException是常规做法。
到目前为止,我能找到的唯一区别是java.lang通常使用“Illegal”,而javax.*则更喜欢使用“Invalid”。然而,也有java.security.InvalidParameterExceptionIllegalArgumentException的子类。
4个回答

13

你可以在使用API时合法,但仍然可能存在无效数据;这完全是语义问题。


2
但是IllegalArgumentException似乎涵盖了非法API使用和无效数据两种情况。 - ehdv

2
javax.activity.InvalidActivityException是从java.rmi.RemoteException继承而来的,你可能不想依赖它。有关详细信息,请参见Javadoc
编辑:Invalid和Illegal在语义上没有区别,只是上面提到的技术问题。
编辑:来自Postgres文档第45.3.14节。要避免的棘手单词: Illegal。 "非法"表示违反法律,其余部分为"无效"。最好说明为什么是无效的。

1
他在谈论名称,而不是扩展InvalidActivityException。 - Bart van Heukelom

0
我刚刚在思考同样的问题。据我所知,没有任何文件解释“非法”和“无效”之间的区别。如果我试图推敲一些语义,也许“非法”可以被认为是一个更广泛的类别,意味着“不允许”,而“无效”表示某个值不符合某些验证约束或未被识别。
因此,在那些旧的文本冒险游戏中,turn("qwerty")将传递一个既非法又无效的值,因为"qwerty"不是一个有效的转向方向。然而,turn("left")代表一个有效的值,这可能是一个“合法”的转向方向,取决于当前玩家位置左侧是否有墙壁。
从这个角度来看,IllegalArgumentException表示任何由于任何原因而不被允许的参数,无论该值本身是否有效。
我强调,这个解释完全是我自己的推理,可能或可能不反映已经确立的惯例。但在有人提出更好的概念之前,这是我在我的库中采取的方法。
参见illegal vs invalid的讨论,该讨论暂时做出了与我刚才所做的类似的区分。它还指出,那些选择现有用法的人“并不总是对意义的细微差别敏感”。因此,我想在许多情况下,“非法”和“无效”是可以互换使用的。

-1
据我所知,IllegalArgumentException应该只在您想要表示API方法调用的错误使用时使用。根据您所描述的情况,似乎是API被错误地使用了,因此我认为IllegalArgumentException会是更好的选择。

你是不是想说第二个 "IllegalArgumentException" 应该是 IllegalStateException?如果不是,我真的很困惑... - ehdv
1
据我所知,这不是原帖作者所问的。 - Daniel Rikowski
@DR - 你说得对。顺便感谢你的格式改进。 - ehdv

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接