ICode9

精准搜索请尝试: 精确搜索
首页 > 编程语言> 文章详细

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

2019-07-24 19:02:23  阅读:1684  来源: 互联网

标签:java android-studio nullpointerexception


我在Android工作室发出了这个警告,告诉我:

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中收回警告,因为我很确定它不应该因为它是否为null,我现在正在处理它.

这是我的问题,两个解决方案中的哪一个在技术上更有效,如果它是尝试捕获解决方案为什么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");
    }
}

解决方法:

你不应该捕获NullPointerException – 事实上应该捕获很少的RuntimeExceptions.

NullPointerException表示代码存在问题,其中变量是在(或访问其字段)时调用的方法,而引用实际上具有空值.

这基本上要求检查空值.

这就是Android Studio在这种情况下似乎迂回主动的地方:当然你可以通过链接对象的方法调用来获得NPE,如果你不能保证对象不是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")
    ...

这种变化很乏味并且增加了混乱,但只要您的方法调用不会改变任何对象(否则,只需在检查空值之前分配给变量),就性能而言几乎不重要.

似乎有一些方法可以根据您从IDE获得的警告来参数化Android Studio.

有关总体方向,请参阅this问题.

注意/延迟编辑

这是一个古老的答案,关于Java 8的Optional.

>可选项旨在传达可能存在或不存在的数据概念,例如引用对象的实例.
>换句话说,可选< T>是一个T实例的容器,它的存在我们不确定.
>可选类具有许多方法来处理这种不确定性,而不是繁琐地执行空检查,或者有些人可能会争辩,而不是必须首先处理指针的概念,如前所述.可怕的NullPointerExceptions.
>在Java 8的流API中大量使用了可选项.
>最后,从Oracle自己的角度来看,here是Optionals的一个很好的起点.

标签:java,android-studio,nullpointerexception
来源: https://codeday.me/bug/20190724/1525182.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有