处理空指针异常

时间:2014-10-09 11:23:51

标签: java oop nullpointerexception

因此,通过几个基于Java的Web应用程序,我在几乎大多数Web应用程序中实现了一个常见的事情。他们中的大多数往往运行良好,直到你遇到Null Pointer Exception.面对面是下面是返回错误的方法之一:

public Map getWebSiteObjects(String path, LightWeightNode root, Integer versionId, Site site) {


        Map webSiteObjects = new HashMap();

        // refresh site
        site = (Site)getObject(Site.class, site.getId());

        webSiteObjects.put("site", site); ...... /* Dont worry about the rest */

场景:此方法在我的应用程序上生成一个树,但是,它在运行时给出了一个空指针异常:

2014-10-09 12:00:18,674 ERROR org.springframework.web.servlet.DispatcherServlet - Could not complete request
java.lang.NullPointerException  at com.bsdeurope.xmlcms.service.impl.TreeManagerImpl.getWebSiteObjects(TreeManagerImpl.java:159)

现在我对一些Java主体(基础)很新,我解决这个问题的想法是初始化方法中传递的4个变量,因此有:

path = null;
root =null;
versionId = null;
site = null;

getWebSiteObjects方法中的任何说明之前。现在我知道这可能不是唯一的解决方案,但我的问题是:

1)在防止Java Null Pointer Exceptions方面有什么好的做法?
2)如果有程序你会怎么做呢?

通常在处理很多类时,尤其是代码编写错误的应用程序时,如果左,右和中间有大量的空指针异常,最终会撞到墙上。

4 个答案:

答案 0 :(得分:2)

空检查通常就足够了。

    // refresh site
    if(site!=null){
        site = (Site)getObject(Site.class, site.getId());
        webSiteObjects.put("site", site); ...... /* Dont worry about the rest */
    }else{
        // Print an error message, or do the error handling here...
    }

请注意,只有在表达式求值为null.someFunction()时才会出现NullPointerException。在此示例中,site.getId()。因此,只检查site!=null就足够了。如果您有更多object.someFunction(),那么您可能需要执行类似

的操作
if(obj1!=null && obj2!=null){
    // Safe to call 
    obj1.function();
    obj2.function();
}

答案 1 :(得分:2)

有两种思想流派。

一所学校,对null进行测试并做一些事情,然后做好事#34;例如,将其替换为其他内容,忽略它,编写日志消息等等。

另一所学校是一个意外的null是一个BUG,正确的做法是允许 NullPointerException被抛出。然后你允许NPE传播并(理想情况下)导致程序崩溃......或者更好的是,在应用程序的日志文件中记录NPE堆栈跟踪后,优雅地失败。

然后由程序员使用堆栈跟踪中的信息(和#34;那些小的灰色单元"引用一个着名的虚构的比利时侦探)来找出意外的{{1}来自,并解决问题的根本原因。 通常这需要查找字段或数组元素或未正确初始化的任何内容,null调用返回get以指示(软)失败,或其他任何内容。此修复可能涉及测试null,或者可能涉及初始化某些内容,或传递某些内容,或更正某些逻辑,或者在程序的早期添加null测试。

IMO,为null添加防御性测试的做法是一个坏主意。它倾向于用另一种通常难以追踪的bug(NPE)来代替它。


所以我的答案是:

  

1)在防止Java空指针异常方面有什么好的做法?

良好做法是不避免 NPE。相反,让它们发生,并找到/修复引入虚假null值的内容。

  

2)如果有程序你会怎么做呢?

不,没有。当然,没有>> I<<<<会使用。

我唯一要做的就是尝试让我的代码抛出NPE 之前的,以便null不会从原来的那里传递很长时间资源。 (这样可以更容易地找到并解决问题的根本原因。)

答案 2 :(得分:1)

对于你这个程序是一个简单的空检查:

public Map getWebSiteObjects(String path, LightWeightNode root, Integer versionId, Site site) {


        Map webSiteObjects = new HashMap();
       if(null!=Site){
        // refresh site
        site = (Site)getObject(Site.class, site.getId());

        webSiteObjects.put("site", site); ...... /* Dont worry about the rest */
      }
  //Similarly while using other arguments do similar null check
   (if null!=path){
   /* 
     Your code here...
      */
  }
}

有关避免NPE的最佳做法,请查看以下链接:NPE practices

答案 3 :(得分:1)

您可以将任何方法的所有业务逻辑放在try块

try{
 Map webSiteObjects = new HashMap();
 // refresh site
 site = (Site)getObject(Site.class, site.getId());
 webSiteObjects.put("site", site); ...... /* Dont worry about the rest */
}catch(NullPointerException e){
 // error occured
 e.printStackTrace();
}