测试bundle中是否存在值的更好方法



我有一个玩游戏的活动。用户可以从保存状态恢复或开始新的游戏。如果恢复,则将要恢复的游戏的标识符传递给捆绑包中的活动。如果这是一个新游戏,那么捆绑包的这一部分不会通过,因此是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 ..
    }    
}

相关内容

  • 没有找到相关文章

最新更新