在Android Studio中抑制潜在的NullPointerException

min*_*pif 31 java android intellij-idea android-studio

这个:

@Nullable
Item[] mItems;

public Item getItem(int position) {
    return mItems[position];
}
Run Code Online (Sandbox Code Playgroud)

产生警告:

Array access 'mItems[position]' may produce NullPointerException
Run Code Online (Sandbox Code Playgroud)

我想压制这个警告(我知道getItem()如果mItems为null 则不会被调用).

我尝试过使用以下注释:

  • @SuppressWarnings({"NullableProblems"})
  • @SuppressWarnings({"null"})

以及//noinspection符号,但他们都没有工作.

使用@SuppressWarnings({"all"})作品,但显然不是我想要的.

当我点击alt+时enter,Android Studio不提供任何抑制选项,只是添加(无用)空检查的选项.

小智 48

这对我有用,但不确定为什么AS会想要使用常数条件作为抑制器.我认为它与skip null检查有关,因为它是一个常量条件(即,它总是不为null).

@Nullable
Item[] mItems;

@SuppressWarnings("ConstantConditions")
public Item getItem(int position) {
    return mItems[position];
}
Run Code Online (Sandbox Code Playgroud)

  • 不知道哪个更糟糕,添加了一堆不必要的断言,或者带有误导性条款的SuppressWarnings.叹. (4认同)

sam*_*sam 16

如果您希望防止Android Studio在将这些警告保留在编译器中时使用这些警告,只需转到设置 - >编辑器 - >检查 - >常量条件和例外,然后取消选中它.

如果您想完全删除它,请使用其他答案建议的正确SuppressWarnings:

@SuppressWarnings("ConstantConditions")
Run Code Online (Sandbox Code Playgroud)


小智 6

对我来说@SuppressWarnings没有用.我只是assert在警告之前添加声明以使其消失.

您的代码应如下所示:

@Nullable
Item[] mItems;

public Item getItem(int position) {
    assert mItems != null;
    return mItems[position];
}   
Run Code Online (Sandbox Code Playgroud)

我知道你说你确定getItem()如果mItems是的话不会被召唤null.但是,检查员在调用函数之前不会考虑您已经检查过,因此警告.

或者你可以离开它,因为mItems = null永远不会发生.但是你的代码看起来有点混乱,对我来说这很烦人.


小智 5

@SuppressWarnings("ConstantConditions") 对我有用。