我有一个非常简单的方法:
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;
}
}
答案 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 {
...
}
因此,您应首先确保正确初始化对象的私有成员。如果是,并且事实证明game
有null
的有效用例,那么您需要进行明确的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;
}
}
不要进行重复的空检查。