应用程序引发异常



我的情况不是那么普遍(因为给定的ID确实存在)。我问这个问题自己回答。

请在下面的答案中查看为什么会发生这种情况以及为什么会发生在我身上。

最佳答案

当您尝试将一些整数设置为字符串时,您可能已经发现此错误发生:
在代码some_variable的某处被声明为int,并且您想显示其值,因此您尝试使用some_textview方法将其设置为setText():

int some_variable = 0;
TextView txtView = (TextView) findViewById(R.id.someTextView);
... some code/calculations etc...
txtView.setText(some_variable); // exception! some_variable is an int value

也可能是任何返回int结果的方法所返回的结果,例如:
txtView.setText(someString.length());// exception! String.length() returns an int value
txtView.setText(someSet.size());// exception! Set.size() returns an int value

ETC。

这些会导致Resources$NotFoundException cuz没有编号(id)的String资源。您很可能在每次构建时都知道在build文件夹中创建了一个R.java文件。该文件包含静态变量,其中在string.xml String中声明的每个变量都有其自己的唯一ID,该ID具有一些int值,并且您在代码中将其用作R.string.id。这是出现异常的原因-系统将尝试查找与给定值相对应的R.string.id字符串,但显然在大多数情况下会失败。这也是为什么setText()接受整数值并且IDE不会警告您的原因。
在某些情况下,您的some_variable可能会偶然具有一个与某些ID相对应的值。这些是棘手的情况,因为不会引发任何异常,并且您会看到一些意外的文本(实际上对应于R.string.id)而不是变量值。
解决此问题的方法很简单(如果必须显示some_variable的值):
txtView.setText(String.valueOf(some_variable));

也有许多人试图以与int消息相同的方式设置Toast值,例如:
int some_variable = 0;
... some code/calculations etc...
Toast.makeText(this, some_variable, Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), someSet.size(), Toast.LENGTH_LONG).show();

解决方法是相同的:
int some_variable = 0;
... some code/calculations etc...
Toast.makeText(this, String.valueOf(some_variable), Toast.LENGTH_LONG).show();
Toast.makeText(getBaseContext(), String.valueOf(some_Set.size()), Toast.LENGTH_LONG).show();

您可能遇到了使用Integer(some_variable).toString()方法的方法。不算太差。但这意味着将应用1个额外的操作(将int值包装到Integer中),并且只能使用整数值(否则将抛出NumberFormatException),而对于String.valueOf(some_variable)值类型而言则无关紧要,它适用于任何类型的值,包括所有原语(浮点型, double 型,字节型,长型等),并且永远不会抛出任何异常。
另外还有一些其他情况-rare cases are described here,重点是在IDE中清理项目。
如果您确定自己没有以上述方式传递任何整数,而且这种情况发生在已发布的应用程序中,并且在开发时未发生,可能是Locale的情况。如果您的应用程序具有Locale依赖于String的资源,并且当您对其进行测试时,您可能使用了您所在地区的Locale设备,因此未发现任何问题。但是,(请记住!)在这种情况下,您必须提供位于项目的strings.xml文件夹中的默认res\values,并且如果确实错过了这种情况。假设某个用户来自德国(设备默认Locale为DE的用户)尝试运行这样的应用程序,该应用程序在strings.xmlvalues-en文件夹中仅包含values-it(但strings.xmlvalues文件夹中都没有values-de)。在这种情况下,应用程序将尝试首先定位values-de\strings.xml但失败,然后它将尝试使用默认的values\strings.xml并再次失败,因此抛出Resources$NotFoundException时将崩溃。
如前所述,此问题的解决方法是在项目的strings.xml文件夹中提供默认的res\values,因此对于任何不受支持的语言环境,都将使用默认的en(通常为英语)。另一种方法是,如果应用程序在不受支持的语言环境的设备上运行,则在运行时为应用程序设置适当的默认语言环境(例如,在应用程序扩展类中),例如(假设您默认情况下要使用ojit_code语言环境):
    Locale locale = getAppLocale(context);
    String localeLang = locale.getLanguage();
    // default locale is EN but available are EN and RU
    if (!localeLang.equalsIgnoreCase("en") && !localeLang.equalsIgnoreCase("ru")) {
        locale = new Locale("en");
    Configuration config = new Configuration();
    config.locale = locale;

    context.getResources().updateConfiguration(config, context.getResources().getDisplayMetrics());
    }

09-11 20:18
查看更多