java—测试捆绑包中是否存在值的更好方法?

pdsfdshx  于 2021-07-13  发布在  Java
关注(0)|答案(3)|浏览(360)

我有个活动要玩游戏。用户可能正在从保存状态恢复或启动新游戏。如果继续,则将要继续的游戏的标识符传递给包中的活动。如果它是一个新游戏,那么包的这部分就不会被传递,因此是 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 顺流而下,而不是把它从包里拉出来,但在我看来,这不会改变什么。警告的目的是指出我在浪费内存,如果我这样做,我的作用域中仍然有两个包含相同值的东西。
有没有一种方法可以在不在try/catch循环中进行变量赋值的情况下检测包中是否存在“gametoresume”?
如果我把声明移到 try 循环的一部分,然后发射一个 System.gc(); 之后 catch 循环的一部分,它会释放变量所使用的内容吗 GameNumberToResume ?
我知道在这个特定的例子中,这可能并不重要,但是它足够简单,并且说明了我在理解如何有效地编写android代码方面的一个普遍漏洞。

yi0zb3m4

yi0zb3m41#

结帐

bundle.containsKey ("GameToResume");

它将返回此密钥是否在包中。

7fyelxc5

7fyelxc52#

不要使用 try-catch 在这里。你可以初始化游戏号码 int GameNumberToResume=Integer.MAX_VALUE . 然后拆下 try-catch . 只是使用 if(xx==Integer.MAX_VALUE) .
在我看来, try-catch 只能用于未知错误或不可预知的情况。在这里,你什么都知道。

mspsb9vt

mspsb9vt3#

您可以使用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 ..
    }    
}

相关问题