潜在的空指针访问

2024-01-17

我遇到了一个目前我不太清楚的奇怪情况:

当有潜在的空指针访问在 Eclipse 中启用警告,我收到如下警告(警告位于相应注释之前的行):

protected Item findItemByName(String itemName, Items items) {
    boolean isItemNameMissing = null == itemName || itemName.isEmpty();
    boolean isItemsMissing = null == items || null == items.getItems() || items.getItems().isEmpty();

    if (isItemNameMissing || isItemsMissing) {
        return null;
    }
    // potential null pointer access: the variable items might be null at this location
    for (Item item : items.getItems()) {
        // potential null pointer access: the variable itemName might be null at this location
        if (itemName.equals(item.getName())) {
            return item;
        }
    }

    return null;
}

如果我检查,也会发生同样的情况null使用 Guava 的先决条件,例如

Preconditions.checkArgument(argument != null, "argument must not be null");

我可以理解,在后一种情况下,进行流量分析以检查何时IllegalArgumentException将会发生的可能太困难/昂贵甚至不可能,我反过来也不明白为什么编译器会发出警告(如果我删除检查它们就会消失)。

有人可以解释一下潜在的空指针访问是如何完成的以及为什么在这两种情况下都会引发它吗?或者至少给我指明方向。

与此同时,我看看我自己是否发现了......

Addendum

我已经把它分解到了案件的核心部分。给定以下类,警告仅显示在方法中sample2(正如评论再次指出的那样)。请注意该方法sample3也不会触发警告。

public class PotentialNullPointerAccess {

    public void sample1(final String aString) {

        if (aString == null) {
            return;
        }

        System.out.println(aString.length());
    }

    public void sample2(final String aString) {

        boolean stringIsNull = null == aString;

        if (stringIsNull) {
            return;
        }

        // Potential null pointer access: The variable aString might be null at this location
        System.out.println(aString.length());

    }


    public void sample3(final String aString) {

        System.out.println(aString.length());
    }
}

我认为 Ed Merks 在这个论坛帖子中以某种方式回答了这个问题:

http://www.eclipse.org/forums/index.php/t/278687/ http://www.eclipse.org/forums/index.php/t/278687/

据我了解,一旦您假设某个变量可能是,Eclipse 就会发出警告null在前面的代码中。您只需检查即可做到这一点null(等于或不等于) - 但你必须将它作为变量分开,而不仅仅是作为if的唯一表达。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

潜在的空指针访问 的相关文章

随机推荐

  • 将 csv 文件导入 Excel 时,文本会转换为数字

    我使用如下方式将 CSV 文件导入到 Excel 2010 电子表格中 Set wb Workbooks Open Filename myFile ReadOnly True Notify False Set ws wb Worksheet
  • Numpy 相邻元素之间的差异

    我有纯Python中相邻元素之间差异的计算算法 a range 1000000 it s numpy array in my case prev a 0 b 0 for i in a 1 b append i prev prev i 有没有
  • 数据表scrollX水平不起作用

    我有以下表格 其中包含 10 多列 我正在使用数据表来显示数据 我使用水平滚动 因为我有很多列 但卷轴没有显示出来 请帮忙 这是我的桌子的屏幕截图 滚动不起作用 https i stack imgur com HBGF9 png table
  • 静态成员函数的模板特化;如何?

    我正在尝试使用模板专业化以不同的方式实现带有 void 句柄的模板函数 以下代码为我提供了 gcc 中的 非命名空间范围内的显式专业化 template
  • XNA 在运行时在 Texture2D 上绘制/绘制

    早安 如果你所在的地方是早上的话 我一直在环顾四周 但没有找到令人满意的方法 所以我想我会四处询问 理想的世界我希望能够生成一个透明的Texture2D对象 将其绘制到屏幕上我希望能够 绘制 它 即当鼠标左键按下时 光标所在的任何像素都应设
  • 在 AngularJS 服务中编写函数

    我想在 angularjs 服务中编写一个函数 并且我想在我的所有服务中重用它 控制器 var mod angular module myapp eventFilters highlight event dayfilter Services
  • 数字在数组中出现的次数

    我在一本 C 书中找到了一个练习 上面写着 编写一个函数来计算一个数字在数组中出现的次数 一切都很好 程序正在运行 但练习还表明该函数应该是递归的 我怎样才能使递归函数像这样工作 include
  • 是否定义了两个 NULL 指针相减的行为?

    如果两个非 void 指针变量都是定义的 根据 C99 和 或 C 98 它们之间的区别是NULL valued 例如 假设我有一个如下所示的缓冲区结构 struct buf char buf char pwrite char pread
  • 函数式反应式编程语言规范

    我正在考虑在某个时候创建 一个功能性反应框架 我已经阅读了很多相关内容并看到了一些示例 但我想清楚地了解这个框架必须做什么才能被视为 FRP 扩展 dsl 我并不真正关心实施问题或细节等 但更关心完美世界情况下需要什么 理想的函数式反应式编
  • Zapier频繁10.01秒超时

    我从 Zap 获取数据 从中构造一个 http 请求的 xml 正文 并将该 http 请求发送到基于 SOAP CRM 的外部服务器 该脚本通常会成功运行 但偶尔会出现错误 Traceback most recent call last
  • 为什么 getElementsByTagName() 总是返回一个数组?

    为什么如果我只有一个h1文档中的元素 我还必须使用索引来访问吗 就像下面这样不行 document getElementsByTagName h1 innerHTML SHUSHAN 但如果我这样做 document getElements
  • 使用 Workbench 创建新的 MySQL 数据库

    我只是想用一些简单的表创建一个新的 MySQL 数据库 我在 Workbench 中创建了一个新的 EER 模型 因此我对我想要的数据库进行了建模 其中包含我需要的所有表 字段 我没有看到任何方法可以采用模型并从中创建实际的数据库 现在它刚
  • R - trunc() 函数对于具有大量小数的浮点数不一致?

    我有 R 版本 4 1 2 2021 11 01 它似乎trunc 当输入数字有大量小数值时 函数不一致 trunc 3 99999999999999977799999999999999999999900 1 4 trunc 3 99999
  • 在非 UI 线程上实例化视图

    我知道 UI 元素 视图层次结构 只能从 UI 线程进行操作 对于后台操作 可以使用 AsyncTask 它提供事件处理程序来到达 UI 线程 简而言之 是否允许实例化视图 绑定到getApplicationContext 在非 UI 线程
  • 离线时本地存储数据的最佳方法

    我正在编写一个小程序 更多的是与 2010 相比进行实验 尽管是一个实验 但它对我们当地的体育俱乐部有一些实际用途 我的想法是访问数据库 当前在线 以下载当前会员并本地存储在笔记本电脑上 这是一个 MS sql 表 用于为俱乐部网站提供支持
  • 如何在R中的列表中组合不同长度的向量?

    我在组合列表中包含的以下向量时遇到问题 x lt list as numeric c 1 4 as numeric c 3 19 11 names x 1 lt c species A species C names x 2 lt c sp
  • 在 MVC2 中使用不同的端口与 RequireHttps 过滤器

    是否可以使用 RequireHttps 使用 443 以外的其他端口进行过滤 我找不到太多关于它的文档 史蒂夫 桑德森的方法 http blog stevensanderson com 2008 08 05 adding httpsssl
  • 简单的 Scala 序列化?

    我想在 Scala 中进行序列化 我见过类似的sjson https github com debasishg sjson和 serialized 注释 然而 我一直无法看到如何让它们处理 1 个主要障碍 库中的类型擦除和泛型 以Scala
  • Android L 设备不向 Android Wear 智能手表发送通知卡

    我正在尝试在单击按钮时向 Android Wear 智能手表发送通知 它适用于我测试过的所有设备 除了 Android L 的设备 有谁知道可能是什么问题吗 我什至将这些设备与 Android Wear SmartWatch 模拟器配对 但
  • 潜在的空指针访问

    我遇到了一个目前我不太清楚的奇怪情况 当有潜在的空指针访问在 Eclipse 中启用警告 我收到如下警告 警告位于相应注释之前的行 protected Item findItemByName String itemName Items it