【问题标题】:Java exception when checking if Integer value is null检查整数值是否为空时的Java异常
【发布时间】:2014-03-21 14:45:14
【问题描述】:

以下代码 sn-p 导致我的程序抛出空指针异常,我正在努力确定原因:

private void ...(){
    HierarchyForm hForm = (HierarchyForm)
    Integer id = hForm.getId();
    if (id != null && id.intValue() > 0){ <-- exception thrown here
        ...
    }
    .
    .
    .
}

当它崩溃时,“id”的值为空。我知道这可能很简单,但我不明白为什么。

编辑:这是一个显示失败的简短程序。 .intValue 比较似乎有问题http://ideone.com/e.js/H0Mjaf

编辑:我正在为 java 1.6.0_45 构建

【问题讨论】:

  • 你确定在这一行抛出异常吗?这是不可能的。
  • 如果hForm变量为空,它会抛出一个空指针试图访问变量的.getId()方法。
  • @lakshman 如果是这样的话,代码不会掉下来,因为它会评估 if != null...
  • 请展示一个简短但完整的程序来说明问题。从您发布的内容看来不太可能...
  • hform 本身不为空。只是 hform id 值。整数 id 设置正确。

标签: java null nullpointerexception integer


【解决方案1】:

如果 id 为 null,则该行不应抛出 NPE。

如果 && 的第一个操作数为假,则不计算第二个操作数,结果为假。

请再次检查您的代码,并确保您在评估 id.intValue() 时在此行获得 NPE。

【讨论】:

  • 这是我的想法,但我只测试了“if (id.intValue() > 0)”,仍然得到异常
  • @pythonicate 如果id 为空,那么if (id.intValue() &gt; 0) 抛出NPE 是正常的。但是,如果您的真实代码是 if (id != null &amp;&amp; id.intValue() &gt; 0),那么这是不可能的。
  • 没错。这就是为什么我很困惑,即使使用 id !=null 检查它也失败了。
  • @pythonicate 不能。这是不可能的。
  • @pythonicate 看起来您没有执行您看到的代码,或者问题出在其他地方。再次发布堆栈跟踪。
【解决方案2】:

使用此格式并找到正确的解决方案:

String id = request.getParameter("id");

        if(id!=null && !id.toString().equalsIgnoreCase(""))
        {
            user.setId(Integer.parseInt(id));
            dao.updateUser(user);
        }
        else
        {
            dao.addUser(user);
        }

如果使用另一种类型的格式:

String id = request.getParameter("id");

        if(id == null || id.isEmpty())
        {
            dao.addUser(user);
        }
        else
        {
            user.setId(Integer.parseInt(id));
            dao.updateUser(user);
        }

很简单,放一个空检查!用 if 语句包围你的对象,比如

Object mayBeNullObj = getTheObjectItMayReturnNull();

if (mayBeNullObj != null) 
   { 
     mayBeNullObj.workOnIt(); // to avoid NullPointerException
   }

但是,所有这些都给出了相同的结果。

【讨论】:

    【解决方案3】:

    此行导致 NPE 的唯一方法是在 null 元素上执行 id.intValue()

    如果id != null 为假,Java 将不会执行id.intValue(),因为&amp;&amp; 是执行的捷径。

    我怀疑你的代码实际上是这样的:

    if (id != null & id.intValue() > 0) {
    

    而它应该是这样的:

    if (id != null && id.intValue() > 0) {
    

    【讨论】:

      【解决方案4】:

      你需要这样写:

      private void ...(){
        HierarchyForm hForm = (HierarchyForm)
        Integer id = hForm.getId();
        if (id != null)
           if (id.intValue() > 0){ <-- exception thrown here
           ...
           }
        }
        . 
        .
        .
      }
      

      好吧,我没有想到 java 中的“&&”有这种行为来解决第一个表达式,而第二个只有在“true”时才解决。

      当然,在这种情况下,我同意同事的回答,并且假设您已正确发布代码,我的猜测它是否与并发访问同一对象有关hForm,某些方法可能会为 hForm 或 id 分配“null”。

      【讨论】:

        猜你喜欢
        • 2015-07-15
        • 1970-01-01
        • 2023-04-08
        • 2013-04-02
        • 1970-01-01
        • 2013-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多