java.lang.NoSuchMethodError: No static method onPullDistance(Landroid/widget/EdgeEffect;FF)F in clas

AndroidNoSuchMethodError:EdgeEffectCompat方法在RecyclerView版本升级中的问题解决
文章讲述了作者在升级RecyclerView版本后遇到`NoSuchMethodError`,发现是由于EdgeEffectCompat方法的变化。通过将RecyclerView的版本降级或禁用边缘效果解决了这个问题。

记录一下学习中最近偶遇两次这个错误:

java.lang.NoSuchMethodError: No static method onPullDistance(Landroid/widget/EdgeEffect;FF)F in class Landroidx/core/widget/EdgeEffectCompat; or its super classes (declaration of 'androidx.core.widget.EdgeEffectCompat' appears in /data/app/com.jiangxue.heartview-sDxXREwWLDMCpWawbYlahw==/base.apk)

debug一下最近问题定位到了这里

public static float onPullDistance(
            @NonNull EdgeEffect edgeEffect,
            float deltaDistance,
            float displacement
    ) {
        if (BuildCompat.isAtLeastS()) {
            return Api31Impl.onPullDistance(edgeEffect, deltaDistance, displacement);
        }
        onPull(edgeEffect, deltaDistance, displacement);
        return deltaDistance;
    }

为什么突然间滑动边缘时不设置边缘效果会报错,首先检查一下对应版本问题

看一下我的布局

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
      <!--  <import type="com.jiangxue.heartview.R" />-->
        <variable
            name="viewModel"
            type="com.jiangxue.heartview.ui.main.fragment.FateViewModel" />



    </data>


    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_topic"
            android:orientation="horizontal"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>
</layout>

试着布局修改后正常了:

<?xml version="1.0" encoding="utf-8"?>
<layout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools">

    <data>
 
        <variable
            name="viewModel"
            type="com.jiangxue.heartview.ui.main.fragment.FateViewModel" />

    </data>


    <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_topic"
            android:overScrollMode="never"
            android:scrollbars="none"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"/>
</layout>

这行代码:试着禁掉边缘效果

android:overScrollMode="never" 可以设置滑动到边缘时的光晕效果
   android:overScrollMode=""
   有三个属性
   never:去掉光晕效果
   always:设置总是出现光晕效果
   ifContentScrolls:设置此模式,如果recycleview里面的内容可以滑动,那么滑到边界后继续滑动会出现弧形光晕;如果recycleview里面的内容不可以滑动,那么滑到边界后继续滑动不会出现弧形光晕

试着降低版本

implementation 'androidx.recyclerview:recyclerview:1.3.0'

implementation 'androidx.recyclerview:recyclerview:1.1.0'

也OK  

总结一下解决办法:

办法一:

implementation 'androidx.recyclerview:recyclerview:1.1.0'

 <androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_topic"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

办法二:

implementation 'androidx.recyclerview:recyclerview:1.3.0'
<androidx.recyclerview.widget.RecyclerView
            android:id="@+id/rv_topic"
            android:overScrollMode="never"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"/>

收工!

<think>好的,我需要解决用户提到的Java中的NoSuchMethodError异常,具体是方法Lcom/viewat/logic/NtPos cEmvLib_IccCommand缺失的问题。首先,我得回忆一下NoSuchMethodError的常见原因,通常这类错误是因为编译时存在某个方法,但运行时找不到,可能是依赖冲突或者版本不一致导致的。 用户提供的几个引用中提到了不同的解决方法,比如包冲突、版本问题、排除自动配置等。例如引用[1]和[4]提到JSON库的版本问题,引用[3]和[5]涉及到Guava和Gson的配置问题。这说明依赖管理是关键因素。 接下来,我需要分析用户的具体错误信息。错误信息中的方法cEmvLib_IccCommand属于NtPos类,可能这个类所在的库在编译时和运行时版本不一致。可能的原因有:1)项目依赖了多个版本的同一库,导致运行时加载了旧版本;2)编译时使用的库版本包含该方法,但运行时使用的版本不包含;3)类路径中存在冲突的jar包。 解决方案方面,首先要检查依赖树,查看是否有版本冲突。可以用Maven的mvn dependency:tree或者Gradle的dependencies任务来排查。然后排除旧版本的依赖,确保使用正确的版本。如果问题依旧,可能需要检查编译环境和运行环境是否一致,包括IDE配置和构建工具的设置。另外,清理缓存和重新构建项目也是必要的步骤,比如mvn clean install。 用户提供的引用中,例如引用[4]提到更新fastjson版本解决类似问题,这可能适用于用户的情况,如果NtPos类所在的库有更新的版本,可能需要升级。另外,引用[5]中提到的排除自动配置可能不适用,但说明配置问题也可能导致类加载异常。 最后,生成相关问题时要覆盖依赖冲突的其他表现、排查工具的使用、多模块项目处理方式,以及与其他类似错误的区别,如NoClassDefFoundError。这样用户能全面了解相关问题,自行排查其他潜在问题。</think>针对$java.lang.NoSuchMethodError$报错中提到的$Lcom/viewat/logic/NtPos cEmvLib_IccCommand$方法缺失问题,以下是系统性解决方案: ### 一、错误原因分析 该异常的直接原因是:**JVM在运行时环境中找不到特定方法的实现**,常见于以下场景: 1. **依赖版本不一致**:编译时使用包含该方法的库版本,运行时加载了不包含该方法的旧版本库[^1][^4] 2. **多重依赖冲突**:多个依赖项引入同一库的不同版本,Maven/Gradle最终选择旧版本[^2][^3] 3. **编译/运行环境差异**:开发环境与生产环境的依赖配置不一致 4. **动态加载问题**:类加载器未正确加载包含该方法的类 ### 二、排查与解决步骤 #### 1. 验证依赖树 使用构建工具查看完整依赖关系: ```bash # Maven项目 mvn dependency:tree > dependencies.txt # Gradle项目 gradle dependencies > dependencies.txt ``` 在输出结果中搜索涉及`com.viewat.logic`的库,确认是否存在多个版本 #### 2. 强制指定版本 在构建配置中显式声明正确版本(示例为Maven): ```xml <dependency> <groupId>com.viewat</groupId> <artifactId>ntpos-lib</artifactId> <version>2.1.4</version> <!-- 确认包含cEmvLib_IccCommand的版本 --> <exclusions> <exclusion> <groupId>org.conflicting</groupId> <artifactId>library</artifactId> </exclusion> </exclusions> </dependency> ``` #### 3. 检查类路径 通过以下命令验证运行时实际加载的JAR: ```bash # Linux/Mac ps aux | grep java jcmd <PID> VM.system_properties | grep class.path # 或运行时打印类路径 System.getProperty("java.class.path").split(":").forEach(System.out::println); ``` #### 4. 清理构建缓存 ```bash mvn clean install -U # Maven强制更新快照 gradle clean build --refresh-dependencies # Gradle刷新依赖 ``` ### 三、进阶验证手段 1. **反编译验证**:使用JD-GUI工具打开相关JAR文件,确认`NtPos`类是否包含目标方法 2. **运行时追踪**:添加JVM参数`-verbose:class`观察类加载过程 3. **单元测试验证**:编写反射测试验证方法存在性 ```java try { Class<?> clazz = Class.forName("com.viewat.logic.NtPos"); clazz.getDeclaredMethod("cEmvLib_IccCommand"); System.out.println("方法存在"); } catch (Exception e) { e.printStackTrace(); } ``` ### 四、预防措施 1. 使用依赖管理工具(如Maven BOM)统一版本 2. 在CI/CD流程中加入依赖检查: ```xml <!-- Maven Enforcer插件 --> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-enforcer-plugin</artifactId> <version>3.0.0</version> <executions> <execution> <id>enforce</id> <configuration> <rules> <dependencyConvergence/> </rules> </configuration> </execution> </executions> </plugin> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

TouchOfSun

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值