通过像
这样的方式处理空指针异常是否有意义private void doWork(Object object) {
if (object == null) {
try {
throw new IllegalArgumentException();
} catch (Exception e) {
e.printStackTrace();
}
} else {
...
}
}
答案 0 :(得分:10)
不,这没有用。
不要抓住异常。只是做
if (object == null)
throw new IllegalArgumentException("Argument object may not equal null");
根据您的建议,该方法将为文件
根据参数
object
做一些工作。如果object
为null
,它会在标准输出上打印一些垃圾而不执行任何操作。
作为旁注,因为你还在学习Java,你的try-catch块:
try {
throw new IllegalArgumentException();
} catch (Exception e) {
e.printStackTrace();
}
......等同于......
new IllegalArgumentException().printStackTrace();
答案 1 :(得分:4)
如果null
是异常状态,则抛出异常是好的,但try / catch没有多大意义:throw
new IllegalArgumentException();
,catch
之后,打印一个stacktrace继续。
如果您可以处理null
案例并且只想报告,那么您应该将其写入日志文件:
if (object == null) {
log.warn("method doWork has been called with a null argument");
}
// continue in the method
否则该方法应该将异常抛回到它的调用者
if (object == null) {
throw new IllegalArgumentException("Hey stupid, RTFJD, NO calls with null!");
}
(用有意义的东西替换异常消息;))
答案 2 :(得分:2)
首先,该代码可以更简单地编写为:
private void doWork(Object object) {
if (object == null) {
new IllegalArgumentException().printStackTrace();
} else {
}
}
或(几乎等同地)为
private void doWork(Object object) {
if (object == null) {
Thread.dumpStack();
} else {
}
}
其次,它是否在做一些有用的事情?是的,打印是当前线程的堆栈跟踪。
第三,这是个好主意吗? IMO,绝对不是。
它正在向标准错误发送内容,这可能会发送到控制台(如果没有人在观看,可能会丢失)或/dev/null
。应使用首选的日志记录子系统正确记录错误。
它看起来像它正在压缩可能的错误条件(即程序被破坏,因为此方法已被非法参数调用)然后继续。如果这确实是一个错误条件,那么代码可能应该挽救。如果不是,则堆栈跟踪是噪声。
简而言之,这看起来像某个问题的“绑定”解决方案。正确的解决方案是删除此代码(或用简单抛出IllegalArgumentException
的代码替换它),并在发生异常时找出它来自哪里并修复根问题。< / p>
答案 3 :(得分:1)
替代:
private void throwIfNull(Object object, String message) throws NullPointerException {
if (object == null) {
throw new NullPointerException(message);
}
}
然后你可以指定你的方法将异常抛回给调用者,就像这样
private void doWork(Object object) throws Exception {
throwIfNull(object, "Object is null");
//Other work....
doWorkInternal(object);
}
在这种情况下,您知道如果调用doWorkInternal()
方法,则对象从不为空。
答案 4 :(得分:0)
最简单的方法是
if (object != null) {
doWork();
} else {
}
答案 5 :(得分:0)
如果您不想捕获函数内部的异常并让一些调用函数来处理它,
做得更好:
public void doWork(Object object) throws NullPointerException {
//code that might result NullPointerException.
//no handling of exception by yourself
}
但是如果想要/应该在你的方法定义中处理异常, 你的代码很好。
答案 6 :(得分:-3)
当对象变为null时,它将自动抛出空指针异常。但你没有处理它,并且你试图抛出“IllegalArgumentException()”,这是不可能的。
if(object == null) 这一行本身抛出一个异常,它不会执行该行的其余部分。