android java.lang.NoSuchFieldError: R$id.xxx

本文探讨了在Android开发中使用自定义控件时遇到的NoSuchFieldError问题,详细介绍了两种常见原因及解决方案:一是修改XML命名空间,二是避免主项目与库项目XML冲突。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

第一种情况 参考自http://www.shangxueba.com/jingyan/1856083.html


    将引用的自定义控件的xml文件中的最外层布局上面添加xmlns:sat=“http://schemas.Android.com/apk/res/控件所在位置的包名”可是在运行时就会报java.lang.NoSuchFieldError:包.R$id.xxx错。同时还会出现no resource identifier found for attribute 的错误。

    将xmlns:sat=“http://schemas.android.com/apk/res/控件所在位置的包名”更改为

    http://schemas.android.com/apk/res-auto 就不会报错了


第二种 参考:http://www.hankcs.com/program/mobiledev/e-androidruntime-fatal-exception-main-java-lang-nosuchfielderror.html


这个问题是由于主项目覆盖了库项目的xml所致,如果主项目中的某个xml里定义了一个跟库项目中的xml同名的xml,那么库中的xml将会被覆盖。这里的覆盖意思是,编译后只有主项目中的xml以及R.id,完全没有库项目的影子。所以才会有NoSuchFieldError的错误。

这个错误不会在编译的时候提示,算得上一个陷阱了。

解决方法很简单,删除主项目中的xml,整个项目只保留一份xml即可。

### Java 编译时出现 `java.lang.NoSuchFieldError` 错误的解决方案 当项目从 JDK 17 升级至 JDK 21 后,可能会遇到如下错误: ``` java: java.lang.NoSuchFieldError: Class com.sun.tools.javac.tree.JCTree$JCImport does not have member field 'com.sun.tools.javac.tree.JCTree qualid' ``` 此问题的根本原因是,在 JDK 21 中,`qualid` 字段的类型发生了变更,从 `JCTree` 更改为 `JCFieldAccess`[^4]。这种类型的更改使得 Lombok 或其他工具无法正确访问该字段,进而引发 `NoSuchFieldError`。 以下是解决问题的具体方法: #### 方法一:升级 Spring Boot 版本 如果当前使用的 Spring Boot 是较低版本(如 3.1.2),建议将其升级到 **3.1.4** 或更高版本。Spring Boot 的新版本修复了与此问题相关的兼容性缺陷[^5]。 可以通过修改项目的 `pom.xml` 文件来完成升级操作: ```xml <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>3.1.4</version> <!-- 至少为 3.1.4 --> </parent> ``` #### 方法二:更新 Lombok 版本 Lombok 工具可能未适配 JDK 21 的内部 API 变更。因此,需确保使用最新版 Lombok 来解决此类问题。可以在 `pom.xml` 中指定最新的 Lombok 版本号: ```xml <dependency> <groupId>org.projectlombok</groupId> <artifactId>lombok</artifactId> <version>1.18.30</version> <!-- 使用最新稳定版本 --> <scope>provided</scope> </dependency> ``` #### 方法三:禁用特定功能以绕过问题 作为临时措施,可以尝试通过配置文件禁用某些可能导致冲突的功能。例如,关闭 Lombok 的代理生成器或其他高级特性。在 `lombok.config` 文件中添加以下内容: ```properties lombok.addJacksonAnnotations=false lombok.anyConstructor.suppressConstructorProperties=true ``` #### 方法四:回退 JDK 版本 如果上述方法均不可行,可考虑暂时将 JDK 回滚至较旧版本(如 JDK 17)。虽然这不是长久之计,但在紧急情况下可以帮助恢复服务运行。 --- ### 总结 为了彻底解决 `java.lang.NoSuchFieldError` 错误,推荐优先执行以下两项操作: 1. 将 Spring Boot 升级至 **3.1.4** 或以上版本; 2. 更新 Lombok 到其最新稳定版本。 这些调整能够有效应对因 JDK 内部结构变更而导致的不兼容问题。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值