我有一个玩游戏的活动。用户可以从保存状态恢复或开始新的游戏。如果恢复,则将要恢复的游戏的标识符传递给捆绑包中的活动。如果这是一个新游戏,那么捆绑包的这一部分不会通过,因此是null
。我目前实现如下。。。
Bundle bundle = this.getIntent().getExtras();
int GameNumberToResume;
boolean StartNewGame = false;
try
{
GameNumberToResume = bundle.getInt("GameToResume");
}
catch (Exception e)
{
System.out.println("Exception Catch, so we start a new game.");
StartNewGame = true;
System.out.println((e.toString()));
}
它是有效的。如果我们正在启动新的游戏或恢复已保存的游戏,StartNewGame
将驱动决策树,如果我们正在恢复,GameNumberToResume
将具有要恢复的游戏ID。然而,安卓工作室抛出了软警告。。。
变量"GameNumberToResume"已分配,但从未访问过。
因为在决策树的部分中,当我需要恢复游戏的值时,我会通过bundle.getInt("GameToResume")
直接从捆绑包中提取它。
所以我的问题是:我应该做什么不同?我可以通过在下游引用变量GameNumberToResume
而不是从捆绑包中提取它来消除警告,但在我看来这不会改变任何事情。警告的目的是指出我在浪费内存,如果我这样做,我的作用域中仍然有两个东西都包含相同的值。
- 是否有方法检测中是否存在"GameToResume"在try/catch循环中不进行变量赋值的bundle
- 如果我在循环的
try
部分中移动声明,那么在循环的CCD_ 8部分之后激发CCD_,它会释放变量GameNumberToResume
使用的内容吗
我知道在这种特定的情况下,这可能并不重要,但它足够简单,并说明了我对如何有效地编码Android的理解中的一个普遍漏洞。
结账
bundle.containsKey ("GameToResume");
它将返回该密钥是否在捆绑包中。
此处不要使用try-catch
。您可以初始化游戏编号,如int GameNumberToResume=Integer.MAX_VALUE
。然后卸下try-catch
。只需使用if(xx==Integer.MAX_VALUE)
在我看来,try-catch
只能用于未知错误或不可预测的情况。在这里,你什么都知道。
您可以使用getInt第二个参数来设置默认值,如下所示。
Bundle bundle = this.getIntent().getExtras();
// Don't forget NullPointerException
if(bundle != null){
final int IMPOSSIBLE_VALUE = -1; // default value
boolean startNewGame = false;
int gameNumberToResume = bundle.getInt("GameToResume", IMPOSSIBLE_VALUE);
if(gameNumberToResume != IMPOSSIBLE_VALUE){
startNewGame = true;
// continue ..
}
}