gpt4 book ai didi

java - 防止 NullPointerException 警告的最佳方法?

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:07:26 25 4
gpt4 key购买 nike

我在 Android-studio 中收到此警告,告诉我:

Method invocation 'data.getExtras().get("address").toString()' may produce 'java.lang.NullPointerException'

所以我更改了我的代码以消除该警告。

// Function to read the result from newly created activity
@Override
protected void onActivityResult(int requestCode,
int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100 && data.getExtras().get("x") != null &&
data.getExtras().get("y") != null && data.getExtras().get("address") != null) {
String sX = data.getExtras().get("x").toString();
String sY = data.getExtras().get("y").toString();
String sAddress = data.getExtras().get("address").toString();
double dX = Double.parseDouble(sX);
double dY = Double.parseDouble(sY);
ShowSearch(dX, dY, sAddress);
}
else{
Log.d("onActivityResult()", "Something went wrong, either the result code is wrong or the data is null");
}
}

转念一想,我选择了试钓。

// Function to read the result from newly created activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100) {
try {
String sX = data.getExtras().get("x").toString();
String sY = data.getExtras().get("y").toString();
String sAddress = data.getExtras().get("address").toString();
double dX = Double.parseDouble(sX);
double dY = Double.parseDouble(sY);
ShowSearch(dX, dY, sAddress);
} catch (java.lang.NullPointerException e){
Log.d("onActivityResult()", "Something went wrong, some data is null");
}
}
}

但是使用 try catch 会在 android-studio 中带回警告,因为我很确定它不应该因为它是否为空,我现在正在处理它。

这是我的问题,这两种解决方案中哪一种在技术上更有效,如果是 try catch 解决方案为什么 Android Studio 一直给我警告?

(安卓工作室 2.1.1)

更新:在尝试了多种解决方案之后,我意识到 android studio 即使在第一个示例中也会给我一个警告,所以我仍然有那个警告,但它不再困扰我了。

对于那些感兴趣的人,这是我决定使用的新解决方案:(我仍然收到警告)

// Function to read the result from newly created activity
@Override
protected void onActivityResult(int requestCode, int resultCode, Intent data) {
super.onActivityResult(requestCode, resultCode, data);
if (resultCode == 100 && data != null) {
if (data.hasExtra("x") && data.hasExtra("y")
&& data.hasExtra("address")) {
if (data.getExtras().get("x") != null && data.getExtras().get("y") != null
&& data.getExtras().get("address") != null) {
String sX = data.getExtras().get("x").toString();
String sY = data.getExtras().get("y").toString();
String sAddress = data.getExtras().get("address").toString();
double dX = Double.parseDouble(sX);
double dY = Double.parseDouble(sY);
ShowSearch(dX, dY, sAddress);
} else {
Toast.makeText(this, "Error in location", Toast.LENGTH_SHORT).show();
Log.d("onActivityResult()", "Something went wrong, some extra data is null");
}
} else {
Toast.makeText(this, "Error in location", Toast.LENGTH_SHORT).show();
Log.d("onActivityResult()", "Something went wrong, some extra data doesn't exist");
}
} else{
Toast.makeText(this, "No Location found", Toast.LENGTH_SHORT).show();
Log.d("onActivityResult()", "Something went wrong, either the result code is wrong or the data is null");
}
}

最佳答案

你不应该 catch NullPointerException - 事实上很少RuntimeException s应该被捕获。

A NullPointerException表示您的代码有问题,其中变量被调用方法(或其字段被访问),而引用实际上有一个 null值(value)。

这基本上要求检查 null值。

这就是 Android Studio 在这种情况下似乎迂腐主动的地方:当然,您可能会通过对对象的链式方法调用获得 NPE,如果您不能保证对象不会 null , 你应该检查 null值。

例如:

if (resultCode == 100 
&& data.getExtras().get("x") != null
&& data.getExtras().get("y") != null
&& data.getExtras().get("address") != null) { ...

...会变得乏味:

if (resultCode == 100 
&& data != null // unlikely
&& data.getExtras() != null
&& data.getExtras().get("x") != null
...

...或者更确切地说,在这种情况下:

if (resultCode == 100 
&& data != null // unlikely
&& data.hasExtra("x")
...

这种变化很乏味并且增加了困惑,但它在性能方面几乎没有关系,只要您的方法调用不改变任何对象(否则,只需在检查 null 值之前分配给一个变量)。

关于您从 IDE 收到的警告,似乎有一些方法可以对 Android Studio 进行参数化。

参见 this大方向的问题。

注释/后期编辑

因为这是一个旧的答案,关于 Java 8 的 Optional 的一句话.

  • Optional s 旨在传达可能存在或不存在的数据的概念,例如引用对象的实例。
  • 换句话说,一个 Optional<T>T 实例的容器我们不确定谁的存在。
  • Optional类具有许多方法来处理这种不确定性,比必须繁琐地执行 null 更优雅很多检查,或者有些人可能会争论,而不是首先必须处理指针的概念,正如可怕的 Null 所传达的那样。 指针 Exception秒。
  • Optional s 在 Java 8 的流中大量使用 API .
  • 最后,hereOptional 上是一个很好的起点这是来自 Oracle 自己的观点。

关于java - 防止 NullPointerException 警告的最佳方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37278674/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com