首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >getIdentifier()返回无效的资源ID

getIdentifier()返回无效的资源ID
EN

Stack Overflow用户
提问于 2019-11-14 14:34:19
回答 1查看 296关注 0票数 0

考虑以下代码:

代码语言:javascript
运行
复制
protected String getStringResourceByName(String aString) {
    String r = null;
    if (aString != null) {
        String packageName = getPackageName();
        int resId = getResources().getIdentifier(aString, "string", packageName);
        if (resId == 0) {
            r = aString;
        } else {
            r = getString(resId);
        }
    }

    return r;
}


public void btnOnClick(View view) {
    String txt = getStringResourceByName("notexists");

    Log.d("test", "notexists: "+txt);

    txt = getStringResourceByName("app_name");

    Log.d("test", "app_name: "+txt);

    txt = getStringResourceByName("12345");

    Log.d("test", "12345:"+ txt);
}

输出:

代码语言:javascript
运行
复制
2019-11-14 15:28:59.462 19822-19822/nl.tbwb.rnd.bixolontest D/test: notexists: notexists
2019-11-14 15:28:59.463 19822-19822/nl.tbwb.rnd.bixolontest D/test: app_name: My App Name
...
Caused by: android.content.res.Resources$NotFoundException: String resource ID #0x3039

(0x3039是12345的十六进制)

这会在最后一次调用getStringResourceByName()时崩溃,因为getResources().getIdentifier()12345作为资源ID返回,而资源ID并不存在。

文档中没有提到任何异常。我做错了什么吗?

更新我知道标识符不能以数字开头,但是当使用12345A作为标识符时,它确实有效。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-11-14 14:54:00

在检查了内部类之后,我发现了一些有趣的东西。

ResourcesImpl.java (内包android.content.res)

代码语言:javascript
运行
复制
int getIdentifier(String name, String defType, String defPackage) {
    if (name == null) {
        throw new NullPointerException("name is null");
    }
    try {
        return Integer.parseInt(name);
    } catch (Exception e) {
        // Ignore
    }
    return mAssets.getResourceIdentifier(name, defType, defPackage);
}

在此方法中,它首先尝试将名称解析为Integer,如果它是Integer,则只返回值。但如果没有,那就在路上再检查一下。

当您传递一个整数(它无论如何都不是一个有效的资源名称)时,它只返回值。但是这个资源实际上根本不存在!还有砰!这就是为什么坠机。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/58859215

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档