因此,通过几个基于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)如果有程序你会怎么做呢?
通常在处理很多类时,尤其是代码编写错误的应用程序时,如果左,右和中间有大量的空指针异常,最终会撞到墙上。
答案 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();
}