更好的方法来测试捆绑中的价值存在?

时间:2016-03-28 01:33:58

标签: java android android-activity android-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。但是,Android Studio会抛出软警告......

  

变量'GameNumberToResume'已分配但从未访问过。

...因为在我需要恢复游戏的价值时,在决策树的各个部分,我通过bundle.getInt("GameToResume")从捆绑中直接拉出来。

所以这是我的问题:我应该做些什么?我可以通过引用变量GameNumberToResume下游而不是从捆绑中拉出它来使警告消失,但在我看来,这似乎不会改变任何东西。警告的目的是指出我在浪费内存,如果我这样做,我仍然有两个范围内的东西都包含相同的值。

  • 有没有办法检测“GameToResume”的缺席或存在 没有在try / catch循环中进行变量赋值的bundle?
  • 如果我在循环的try部分内移动声明,那么 在循环的System.gc();部分之后触发catch, 它会释放变量GameNumberToResume使用的内容吗?

我知道在这个特定的情况下它可能并不重要,但是它很简单,并且说明了我对如何有效编码Android的一般性漏洞。

3 个答案:

答案 0 :(得分:3)

结帐

bundle.containsKey ("GameToResume");
  

它将返回该密钥是否存在于捆绑包中。

答案 1 :(得分:1)

请勿在此处使用try-catch。您可以将游戏编号初始化为int GameNumberToResume=Integer.MAX_VALUE。然后删除try-catch。只需使用if(xx==Integer.MAX_VALUE)
在我看来,try-catch只能用于未知错误或不可预测的情况。在这里,你知道一切。

答案 2 :(得分:1)

您可以使用getInt第二个参数来设置默认值,就像这样。

int