Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何捕获Java中缺少对象导致的异常?_Java_Null_Nullpointerexception_Try Catch_Return - Fatal编程技术网

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

如何捕获Java中缺少对象导致的异常?,java,null,nullpointerexception,try-catch,return,Java,Null,Nullpointerexception,Try Catch,Return,我有一个非常简单的方法: public int getScore() { return game.gameWindow.userBestScore; } 问题是,game对象或gameWindow可能不存在。我不想得到空指针异常。怎样才能正确地抓住它?我可以这样做吗: public int getScore() { try{ return game.gameWindow.userBestScore; } catch(

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

public int getScore() {
    return game.gameWindow.userBestScore;
}
问题是,
game
对象或
gameWindow
可能不存在。我不想得到空指针异常。怎样才能正确地抓住它?我可以这样做吗:

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

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


你应该问的真正问题是:为什么一个对象会有私有数据成员的空引用?您没有正确构造对象。对象应该正确初始化,并在创建后100%准备就绪。否则,您将不得不在代码中进行不必要的防御。

您可以这样做。在尝试访问userBestScore之前,您还可以检查game和gameWindow是否为空

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

不要捕获
NullPointerException

NullPointerException
表示您的代码没有遵守某些约定。如果
game
可能为
null
,则需要进行明确测试:

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

else {
   ...
}
如果
game
不应为空,则可以使用
assert
确保代码的正确性

assert game != null;
...
更令人担忧的是,
game
似乎是你们班的私人成员。在这种情况下,
game
可能不应为
null
(尽管有时会发生这种情况)。您是否在构造函数中正确初始化它?我想说的是,您应该做的第一件事是确保
game
正确初始化。否则,您的代码最终将充斥着不必要的
null
-检查。例如,如果
Game
类中的
gameWindow
没有正确初始化该怎么办?您需要另一个
null
-检查:

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

else {
   ...
}

因此,您应该首先确保对象的私有成员已正确初始化。如果它们是,并且
game
null
存在一个有效的用例,那么您需要一个显式的
null-
检查。测试
null
总是比捕获
NullPointerException
要好。除了不应使用异常来控制业务逻辑流之外,如果在链的某个位置生成了有效的
NullPointerException
(由于编程错误),该怎么办?现在你的
捕获
会捕获它,而你不会知道它;这可能会导致一些非常严重且难以发现的错误。

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

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

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

在某些情况下,您必须执行空检查。可能在调用getScore()方法之前,因为如果游戏或gameWindow为null,那么调用该方法没有意义

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


不要重复执行空检查。

请检查:是否有理由不只是测试
null
?过多使用空检查可能会很快导致代码库的可读性问题。也就是说,有时在某些情况下检查null是合适的。这是一个笼统的概括。一个对象可能有空的私有成员引用有很多原因。您同意列表中会有不正确的初始化吗?如果是,请列出其他一些,因为我没有看到“负载”。我会不费吹灰之力地想象不到半打。你的陈述更为笼统,证据更少。事实上,你已经从“到底为什么……”变成了十几个理由,足以证明我的观点。顺便说一句,我并不想冒犯你,我很喜欢你的回答;)半打不是一打。我没有生气——我是在表达意见。
if (game != null && gameWindow != null)
{
    int score = getScore();
}
public int getScore() 
{
    if (game != null && gameWindow != null)
    {
       return game.gameWindow.userBestScore;
    }
    else
    {
        return -1;
    }
}