如何捕获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;
}
}