如何捕获Java中缺少对象导致的异常?

时间:2011-09-30 13:34:05

标签: java null nullpointerexception try-catch return

我有一个非常简单的方法:

public int getScore() {
    return game.gameWindow.userBestScore;
}

问题是game对象或gameWindow不存在。我不想得到Null Pointer Exception。怎么能以正确的方式捕获它?我可以这样做吗:

   public int getScore() {
         try{
             return game.gameWindow.userBestScore;
          } catch(NullPointerException e){
              return -1;
          }
   }

6 个答案:

答案 0 :(得分:12)

请勿抓住NullPointerException

NullPointerException表示您的代码没有遵守某些合同。如果game可能是null,那么您需要进行明确的测试:

if(game != null) {
   ...
}

else {
   ...
}

如果game不应该为空,那么您可以使用assert确保代码的正确性。

assert game != null;
...

更令人担忧的是game似乎是你班级的私人成员。在这种情况下,game可能不应该是null(尽管有时可以发生)。你在构造函数中正确初始化它吗?我要说的是,您应该首先确保正确初始化game。否则,您的代码最终会被不必要的null - 检查所困扰。例如,如果gameWindow类中的Game未正确初始化,该怎么办?您需要另外null - 检查一下:

if(game !== null && game.gameWindow != null) {
   ...
}

else {
   ...
}

因此,您应首先确保正确初始化对象的私有成员。如果是,并且事实证明gamenull的有效用例,那么您需要进行明确的null-检查。测试null比抓住NullPointerException更好。除了不应该使用异常来控制业务逻辑流程这一事实之外,如果在链的某个位置生成了有效的NullPointerException(由于编程错误),该怎么办?现在你的catch会抓住它,你不会知道它;这可能导致一些非常讨厌和难以发现的错误。

答案 1 :(得分:2)

你可以做到这一点。在尝试访问userBestScore之前,您还可以检查game和gameWindow是否为null。

if(game != null && game.gameWindow != null)
    return game.gameWindow.userBestScore

答案 2 :(得分:2)

检查变量是否为null,如下所示:

public int getScore() {
    if(game == null || game.gameWindow == null){
        return -1;
    }
    return game.gameWindow.userBestScore;
}

答案 3 :(得分:2)

public int getScore() {
    return ((game == null || game.gameWindow == null) ? -1 : game.gameWindow.userBestScore);
}

答案 4 :(得分:1)

你可以做到这一点。或者,您可以在取消引用这些对象之前检查null,并在不抛出异常的情况下采取适当的操作。那会更有效率。

你应该问的真正问题是:为什么一个对象对私有数据成员有空引用?您没有正确构建对象。应该正确初始化对象,并在创建后100%准备好。否则,您最终必须在代码中采取不必要的防御措施。

答案 5 :(得分:0)

尽可能避免抛出异常。处理已知问题比抛出异常更好。

在某些地方你必须进行空检查。可能在调用getScore()方法之前,因为如果游戏或gameWindow为null,则无法调用该方法。

if (game != null && gameWindow != null)
{
    int score = getScore();
}

OR

public int getScore() 
{
    if (game != null && gameWindow != null)
    {
       return game.gameWindow.userBestScore;
    }
    else
    {
        return -1;
    }
}

不要进行重复的空检查。