NoSuchFieldError处理

今天公司项目发布上线,可是上线后商品列表不能请求了,看日志错误如下。

Caused by: java.lang.NoSuchFieldError: TYPE
  at com.cm.admin.service.goods.GoodsTagService.listAllTagBySpu(GoodsTagService.java:216)
  at com.cm.admin.service.goods.GoodsTagService$$FastClassBySpringCGLIB$$c44fbbaa.invoke(<generated>)
  at org.springframework.cglib.proxy.MethodProxy.invoke(MethodProxy.java:204)

来来来,抓重点,NoSuchFieldError,定位到指定行,这个字段是有的,而且在本地和测试服务器都正常。如果这个字段不存在的话,应用应该是不能启动的,那么是什么原因呢?这里先用个demo复现这个错误。

首先,我们创建两个类,代码如下:

  • TestClass.java
public class TestClass {
    public static String str = "Hello By TestClass";
}
  • Example.java
public class Example {
    public static void main(String[] args){
        System.out.println(TestClass.str);
    }
}

用命令行编译并运行,命令如下

javac Example.java
java Example

输出如下:

Hello By TestClass

一切正常,并未出现NoSuchFieldError。

接下来我们把TestClass类做如下修改,注释第二行。

public class TestClass {
    //public static String str = "Hello By TestClass";
}

只编译TestClass类,而不把Example类编译,然后运行程序

javac TestClass.java
java Example

运行结果如下:

Exception in thread "main" java.lang.NoSuchFieldError: str
    at Example.main(Example.java:3)

好了,NoSuchFieldError出现了。

要处理这个错误,我们要清除所有的 .class 文件,重新编译,以保证所有的文件都是最新的。
如果这个错误运行时还存在,可能是编译时引用的依赖和运行时的版本不同,这里就要检查各个路径、版本是否错误了。
maven项目一般执行 mvn clean 就可以了。

项目已成功上线,当时原因除了这个外,还有docker镜像也不是最新的(docker部署),两错误一起,多绕了点弯,这里就不细说了。

参考文章

已标记关键词 清除标记
©️2020 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页