我有一个简单的属性设置方法,对于这个特定的属性,null
是不合适的。在这种情况下,我一直很犹豫:是抛出 IllegalArgumentException
,还是抛出 NullPointerException
?从 javadocs 中来看,两者似乎都可以。是否有某种明确的标准?或者这只是其中一种情况,你应该按照自己的喜好去做,而且两种做法都是正确的呢?
我有一个简单的属性设置方法,对于这个特定的属性,null
是不合适的。在这种情况下,我一直很犹豫:是抛出 IllegalArgumentException
,还是抛出 NullPointerException
?从 javadocs 中来看,两者似乎都可以。是否有某种明确的标准?或者这只是其中一种情况,你应该按照自己的喜好去做,而且两种做法都是正确的呢?
理想情况下,应该避免抛出运行时异常。针对您的情况应创建一个已检查的异常(业务异常)。因为如果抛出并记录了其中任何一种异常,会在开发人员阅读日志时给他们带来误导。相反,业务异常不会引起恐慌,通常在故障排除日志中被忽略。
上面两个异常链接中的定义如下:
IllegalArgumentException:表示方法已传递了非法或不适当的参数。
NullPointerException:在应用程序试图在需要对象的情况下使用null时抛出。
这里的重大区别是,IllegalArgumentException 应该在检查方法参数是否有效时使用。而 NullPointerException 应该在对象为 null 时被“使用”时使用。
希望这有助于更好地理解这两个异常。
如果是“setter”,或者我在获取稍后使用的成员变量时,我倾向于使用IllegalArgumentException。
如果是我要立即在方法中使用(解引用)的内容,我会主动抛出NullPointerException。我喜欢这种方式胜过让运行时来处理,因为我可以提供有用的信息(似乎运行时也可以做到这一点,但这是另一个话题)。
如果我正在重写一个方法,我会使用被重写方法所使用的异常类型。
你应该抛出IllegalArgumentException异常,因为这会让程序员明显地意识到他已经做了一些无效的操作。开发人员习惯于看到虚拟机抛出NPE异常,以至于任何程序员都不会立即意识到自己的错误,并且会开始随意查找,或者更糟糕的是,指责你的代码存在“漏洞”。
如果你选择抛出NPE并且在你的方法中使用了该参数,那么显式检查null可能是多余和昂贵的。我认为虚拟机已经为你做了这件事。
NPE
中发言,而程序员则在虚拟机之前用 IAE
发言。 - Jin Kwon