有没有办法通过这种方式处理nullpointer异常?

时间:2011-08-22 09:08:53

标签: java android

通过像

这样的方式处理空指针异常是否有意义
private void doWork(Object object) {
    if (object == null) {
        try {
            throw new IllegalArgumentException();
        } catch (Exception e) {
            e.printStackTrace();
        }
    } else {
        ...
    }
}

7 个答案:

答案 0 :(得分:10)

不,这没有用。

不要抓住异常。只是做

if (object == null)
    throw new IllegalArgumentException("Argument object may not equal null");

根据您的建议,该方法将为文件

  

根据参数object做一些工作。如果objectnull,它会在标准输出上打印一些垃圾而不执行任何操作。


作为旁注,因为你还在学习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) 这一行本身抛出一个异常,它不会执行该行的其余部分。