【发布时间】:2016-09-13 16:54:05
【问题描述】:
我在 Android-studio 中收到了这个警告,告诉我:
方法调用 'data.getExtras().get("address").toString()' 可能会产生 '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");
}
}
然后再三考虑,我选择了 try catch。
// 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 一直给我警告?
(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");
}
}
【问题讨论】:
-
好的,我会相应地编辑。
-
“为什么 Android Studio 总是在 try catch 代码上给我一个警告” 我能看到的唯一答案是:Android Studio 没有对知道您正在处理它的代码;或者设计它的警告系统的人不在乎你是否处理它。
-
关于效率:重要的可能性非常、非常、非常、非常低。从维护的角度来看,做任何你认为最清晰、最干净的事情。在您的第一个示例中,任何体面的 JIT 都会很好地优化空检查(我不知道 Dalvik 的 JIT 有多好)。
-
不确定哪个更有效,但我不会捕获 NullPointerExceptions。当抛出 NullPointerException 时,它应该是程序员的错误。作为程序员,我们确保它们不会被抛出(通过空检查)。不确定这只是我个人的偏好还是被其他人广泛接受,但我个人认为捕获 NullPointerExceptions 是不好的做法,应尽可能避免。
-
还有一点未勾选:
getExtras()可以返回null。使用Intent#hasExtra(String name)可以解决这个问题,如果nullcheck 知道这一点,我想知道。
标签: java android-studio nullpointerexception