测试捆绑包中某个值是否存在的更好方法?
Better Way to Test Presence of a Value in a Bundle?
我有一个activity玩游戏。用户可能正在从保存的状态恢复或开始新游戏。如果要恢复,则要恢复的游戏的标识符将传递到包中的 activity。如果是新游戏,捆绑包的那部分不会通过,因此是 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 抛出软警告...
Variable 'GameNumberToResume' is assigned but never accessed.
...因为在决策树的部分,当我需要恢复游戏的价值时,我直接通过 bundle.getInt("GameToResume")
从捆绑包中提取它。
所以这是我的问题:我应该做些什么不同的事情?我可以通过在下游引用变量 GameNumberToResume
而不是将其从包中拉出来使警告消失,但在我看来这不会改变任何东西。警告的目的是指出我在浪费内存,如果我这样做,我仍然有两件事在范围内,它们都包含相同的值。
- 有没有办法检测 "GameToResume" 在
没有在 try/catch 循环中进行变量赋值的包?
- 如果我将声明移到循环的
try
部分内,那么
在循环的 catch
部分之后触发 System.gc();
,
它会释放变量 GameNumberToResume
使用的内容吗?
我知道在这种特定情况下它可能无关紧要,但它很简单,可以遵循并说明我对如何高效编码的理解存在一个普遍漏洞 Android。
这里不要使用try-catch
。你可以像 int GameNumberToResume=Integer.MAX_VALUE
这样初始化游戏号码。然后删除try-catch
。只需使用 if(xx==Integer.MAX_VALUE)
.
在我看来,try-catch
只能用于未知错误或不可预测的情况。在这里,你什么都知道。
结帐
bundle.containsKey ("GameToResume");
it will return whether this key is there or not in bundle.
你可以利用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 ..
}
}
我有一个activity玩游戏。用户可能正在从保存的状态恢复或开始新游戏。如果要恢复,则要恢复的游戏的标识符将传递到包中的 activity。如果是新游戏,捆绑包的那部分不会通过,因此是 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 抛出软警告...
Variable 'GameNumberToResume' is assigned but never accessed.
...因为在决策树的部分,当我需要恢复游戏的价值时,我直接通过 bundle.getInt("GameToResume")
从捆绑包中提取它。
所以这是我的问题:我应该做些什么不同的事情?我可以通过在下游引用变量 GameNumberToResume
而不是将其从包中拉出来使警告消失,但在我看来这不会改变任何东西。警告的目的是指出我在浪费内存,如果我这样做,我仍然有两件事在范围内,它们都包含相同的值。
- 有没有办法检测 "GameToResume" 在 没有在 try/catch 循环中进行变量赋值的包?
- 如果我将声明移到循环的
try
部分内,那么 在循环的catch
部分之后触发System.gc();
, 它会释放变量GameNumberToResume
使用的内容吗?
我知道在这种特定情况下它可能无关紧要,但它很简单,可以遵循并说明我对如何高效编码的理解存在一个普遍漏洞 Android。
这里不要使用try-catch
。你可以像 int GameNumberToResume=Integer.MAX_VALUE
这样初始化游戏号码。然后删除try-catch
。只需使用 if(xx==Integer.MAX_VALUE)
.
在我看来,try-catch
只能用于未知错误或不可预测的情况。在这里,你什么都知道。
结帐
bundle.containsKey ("GameToResume");
it will return whether this key is there or not in bundle.
你可以利用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 ..
}
}