我正在使用Android Studio / IntelliJ IDEA进行开发。
我启用了名为“恒定条件和例外”的检查检查,如果我冒着NPE的风险,则显示警告,例如:
String foo = foo.bar(); // Foo#bar() is @nullable
if (foo.contains("bar")) { // I'm living dangerously
...
}
我的代码中有以下内容:
String encoding = contentEncoding == null ? null : contentEncoding.getValue();
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
inputStream = new GZIPInputStream(entity.getContent());
} else {
inputStream = entity.getContent();
}
以下是TextUtils#isEmpty(String)
的源代码:
/**
* Returns true if the string is null or 0-length.
* @param str the string to be examined
* @return true if str is null or zero length
*/
public static boolean isEmpty(CharSequence str) {
if (str == null || str.length() == 0)
return true;
else
return false;
}
我没有冒任何NPE的风险,因为TextUtils#isEmpty(String)
将返回true null
指针。
但是我仍然收到小Method invocation 'encoding.equalsIgnoreCase("gzip")' may produce 'java.lang.NullPointerException'
警告,这可能很烦人。
是否可以更智能地进行此检查,如果已经进行了空检查,则忽略NPE警告?
答案 0 :(得分:18)
你可以查看Peter Gromov在answer中提到的链接。
创建了一些类似于您的设置的简单类:
带有@Nullable
注释方法的类:
TextUtil
类及其isEmpty
方法:
最后调用TextUtil#isEmpty
的主类:
现在,如果您输入File -> Settings...
并转到Inspections ->Constant conditions & exceptions
部分,则可以更改Configure Assert/Check Methods
以适应您的isEmpty
方法:
添加新的IsNull
检查方法:
输入TextUtil
类,isEmpty
方法和CharSequence
参数:
这会给出Assert/Check Method Configuration
窗口:
再次按Ok
,然后按Ok
返回编辑器视图,您会看到检查消失:
您实际上是在告诉IntelliJ isEmpty
方法正在对str
参数进行空检查。
答案 1 :(得分:9)
您可以使用//noinspection ConstantConditions
删除以下行的NPE警告,如下所示:
String encoding = contentEncoding == null ? null : contentEncoding.getValue();
//noinspection ConstantConditions
if (!TextUtils.isEmpty(encoding) && encoding.equalsIgnoreCase("gzip")) {
inputStream = new GZIPInputStream(entity.getContent());
} else {
inputStream = entity.getContent();
}
答案 2 :(得分:4)
您可以使用@SuppressWarnings("ConstantConditions")
注释
@SuppressWarnings("ConstantConditions")
@Override
public RecyclerView.ViewHolder onCreateViewHolder(ViewGroup parent, int indexViewType) {
if (inflater == null) {
inflater = LayoutInflater.from(parent.getContext());
}
ItemViewProvider provider = getProviderByIndex(indexViewType);
provider.adapter = MultiTypeAdapter.this;
return provider.onCreateViewHolder(inflater, parent);
}
答案 3 :(得分:1)
有关IDEA 12,请参阅http://www.jetbrains.com/idea/webhelp/configuring-check-assert-methods.html。 在IDEA 13 EAP中,您可以添加方法合同:http://youtrack.jetbrains.com/issue/IDEA-93372
答案 4 :(得分:0)
不幸的是,标记为“正确答案”的解决方案已过时。但是我找到了对我合适的解决方案。
IDE的新版本可与静态方法正常配合使用。因此问题中的示例不再发出警告。
TextUtils#isEmpty(String);
public static boolean isEmpty(CharSequence str) {
// your checks
}
答案 5 :(得分:0)
请检查详细信息here