方法调用'extras'可能会产生NullPointerException

时间:2015-11-21 22:04:40

标签: java android

为什么会导致错误?

if (extras != null) {
    if (extras.getString("ActionBar") != null) {
        if (extras.getString("ActionBar").equals("NO")) {
            if (bar != null) bar.setDisplayHomeAsUpEnabled(false);
        }
    }
}

我检查以确保它首先不为空。

2 个答案:

答案 0 :(得分:1)

您收到警告,因为您可能未收到任何bundle(来自发件人activity),因为您未在当前上下文中初始化它(或activity)。因此,在这种情况下,如果您不检查extras是否为null(并且extras的行为等于null),则此行:

if (extras.getString("ActionBar") != null)

会抛出NullPointerException。因此,您必须先检查extras是否为空,以避免任何潜在的崩溃。

答案 1 :(得分:1)

您正在拨打extras.getString("ActionBar") 两次。检查return ed值对null(但从不使用它),一旦您使用它而不检查null。现在,可能该函数的契约表示如果使用相同的参数调用它,它将始终return相同的值,但不一定是这种情况,您的IDE可能不会知道。

您应该将return值存储在(最好是final)变量中,然后警告就会消失。

if (extras != null) {
    final String actbar = extras.getString("ActionBar");
    if (actbar != null) {
        if (actbar.equals("NO")) {
            // ...
        }
    }
}

这也可能是一种性能优势,因为您不需要两次getString的工作。

无论如何,如果您的代码中包含if (o != null) { … }个大量的<div class="container-fluid mt100 mr5 ml5"> <div class="row"> <table class='table s12'> <tr style="background: #e4e9eb;"> <td>Name</td> <td>Address</td> <td>City</td> <td>Edit</td> <td></td> </tr> <tr ng-repeat="listItem in Items"> <td> {{listItem.name}} </td> <td> {{listItem.address}} </td> <td> {{listItem.city}} </td> <td> <a class="dropdown-toggle" ng-click="isCollapsed = !isCollapsed" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> <span class="caret"></span> </a> </td> </tr> <tr> <td colspan="3" class="hiddenRow"> <div class="collapse" collapse="isCollapsed"> <table class="table display" style="border-collapse:collapse;"> <thead> <tr class='pix2' style="background: #e4e9eb;"> <th>First</th> <th>Second</th> <th>Third</th> </tr> </thead> <tbody> <tr ng-repeat='item in listItem.subItems'> <td>{{item.first}}</td> <td>{{item.second}}</td> <td>{{item.third}}</td> </tr> </tbody> </table> </div> </td> </tr> </table> </div> </div> 检查,这可能表示code smell