使用HashMap的NullPointerException

时间:2014-01-07 11:27:38

标签: java nullpointerexception hashmap

我试图通过使用if语句检查HashMap是否为Null来过滤此异常。如果HashMap为null,则运行一个用值加载它的方法,但似乎if语句也给出了NullPointerException。

如何重组?

sqldata是Hashmap并且它正在其他地方加载但是它可能没有任何值(根据设计)在这种情况下我试图检查(如果HashMap为空/ null )并使用下面的代码片段重新加载它:

if (sqldata.isEmpty()||sqldata.equals(null)) {
  sqldata = fileloader.dbhealthload();
}

8 个答案:

答案 0 :(得分:1)

sqldata.equals正在运行sqldata的方法equals。在sqldata为null的情况下,它没有任何方法,因此java找不到它并抛出NullPointerException。您应该使用==

进行检查
if (sqldata == null || sqldata.isEmpty()) {
  sqldata = fileloader.dbhealthload();
}

答案 1 :(得分:1)

你不应该以这种方式检查null,

// Invokes method on null when sqldata is null. so, this shouldn't be done

    if (sqldata.isEmpty()||sqldata.equals(null)) { 
      sqldata = fileloader.dbhealthload();
    }

相反,您需要像这样检查null

if(sqldata == null || sqldata.isEmpty()){
  sqldata = fileloader.dbhealthload();
 }

答案 2 :(得分:1)

你应该使用:

if (sqldata == null || sqldata.isEmpty()) {
  sqldata = fileloader.dbhealthload();
}

首先,您应该检查sqldata是否为null。之后你应该检查空虚。

答案 3 :(得分:1)

空引用没有方法。因此,您无法使用equals测试null - 相反,您应该使用==运算符对其进行测试。

将您的代码更改为

if(sqldata == null || sqldata.isEmpty())

答案 4 :(得分:1)

首先,您需要检查sqldata是否为null,然后您可以继续检查HashMap是否为空。按照给定的方法。

   if (sqldata==null||sqldata.isEmpty())
         {
           sqldata = fileloader.dbhealthload();
         }  

如果sqldatanull且使用第一sqldata.isEmpty() in if则会抛出NullPointerException

答案 5 :(得分:1)

空指针异常的原因可能是您从未实例化HashMap。解决此问题的一种方法是确保始终实例化HashMap,然后按以下方式重构代码:

if(!sqldata.isEmpty()) { 
   do operations ... 
} else { 
   reload ... 
}

建议使用上述编程习惯。但是,如果您不想强制实例化HashMap对象,那么您需要检查它是否为null,一旦检查完毕,您应该继续检查它是否为空。那种情况下的代码是:

if(!(sqldata == null)) {
   if(!sqldata.isEmpty()) {
      do operations ...
   }
} else {
   reload or instantiate ... 
   then do operations ...
}

你也可以写另一种方式。

答案 6 :(得分:1)

在Java中null不是一个对象,只是一个void引用,所以你不应该在可以为null的变量上调用.equals。唯一正确的方法是将其与参考比较进行比较:

sqldata == null

另一件事是||是懒惰的,这意味着一旦它找到第一个(从左到右)真值,它就不会评估其他操作数。因此,一个非常常见的模式:

sqldata == null || sqldata.isEmpty()

你应该使用它。运算符&&也很懒,所以类似:

sqldata != null && sqldata.doStuff()

是可能的。

这同样适用于任何变量,例如String变量。

s == null || s.isEmpty()

在将字符串与文字进行比较时,应使用另一种常用模式:

"a value".equals( s )

它有效且安全,因为:

  • 如果s为null .equals可以处理它,只是没有等于null
  • "一个值"是一个字符串文字,所以它永远不会为空

作为指导原则,不要反过来比较字符串:

s.equals("a value")

并且不使用参考比较:

s == "a value"

字符串变量有时可以指向与文字相同的对象,但并不总是!

答案 7 :(得分:0)

当您尝试使用指向内存中没有位置的引用时,通常NullPointerException抛出(null)。在null引用上调用方法或尝试访问空引用的字段将触发NullPointerExecption

在您的代码中,您尝试使用HashMap对象的空引用来调用方法isEmpty()

在检查任何其他条件或使用对象引用访问方法之前,始终检查null。

例如:

HashMap sqldata = new HashMap();  
if(sqldata!=null && sqldata.isEmpty())   
{
   sqldata = fileloader.dbhealthload();
}