2011-08-12 23 views
0

我有这样的代码来控制,如果EditTextPreference为空或不是:无法解析“”为整数[FC]

case R.id.prochain_vidange: 
       settings = PreferenceManager.getDefaultSharedPreferences(getBaseContext()); 
       String choix_huile = settings.getString("listPref_huile_moteur", "0"); 
       km = settings.getString("km", ""); 
       Log.d("TAG",km); 
       int x= Integer.valueOf(km); 
       if (km != "") 
{ 
       if (Integer.valueOf(choix_huile) == 0) { 
    ............ 

的问题是在这条线:

int x= Integer.valueOf(km); 

有什么事情是问题吗? 谢谢。

回答

1

如果您给Integer.valueOf(String s)一个不是有效数字的字符串,则会抛出NumberFormatException。默认值更改为0:

km = settings.getString("km", "0"); 

或者,您可以捕获该异常,并设置x0

km = settings.getString("km", ""); 
int x; 
try { 
    x = Integer.valueOf(km); 
} catch(NumberFormatException e) { 
    x = 0; 
} 
+1

是的好点,但他可以将值保存为整数在第一位。 – Michele

+0

@Michele - 这是一个很好的观点,通常我打算让代码尽可能地接近原始代码,但在这种情况下你可能是正确的。 – MByD

+0

第二个选项完美运作。谢谢 :)。 – androniennn

1

Integer.valueOf改掉,以与.parseInteger一个新的整数(一个String ),“”不能被解析为一个有效的数字,所以你得到一个NumberFormatException

你可以用try catch块来捕获它,或者你可以简单地不要尝试用String来做一个Integer“”。

前:

int x= Integer.valueOf(km); 
if (km != "") { 

后:

if (km != "") { 
int x= Integer.valueOf(km); 
1

可以抛出一个异常,如果该km字符串不能被解析为整数。

但是,将其封装在try { } catch()块中并不是我推荐的方法。

SharedPreferencesgetString()方法的缺省值的全部用途是,如果首选项不存在,则可以有一个默认值。所以更好的办法来解决,这是修改settings.getString(...)调用是这样的:

km = settings.getString("km", "0"); 

然后你到后续调用不会有空白时失败。

输入字符串是否来自用户可以输入任何值的空白文本字段?如果是这样,那么您可以验证用户输入的值。通过尽早验证输入,您不需要将检查/验证机制分散到代码的其他区域。