报错:java.lang.NoSuchFieldError

开课吧开课吧科科2021-03-30 11:43

在学习java和算法过程中,需要使用java的编译和执行命令。但是有时总是会出现各种报错,今天开课吧广场小编整理了开课吧教研老师提供的文章,希望能为遇到此问题的小伙伴帮助发现错误原因,找到对应方法解决问题!

Java报错:java.lang.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部署),两错误一起,多绕了点弯,这里就不细说了。

以上开课吧小编今日整理的“报错:java.lang.NoSuchFieldError”Java报错相关一文了,希望为遇到相关报错问题的朋友提供参考,更多Java报错内容尽在开课吧广场Java问答频道!

原文链接:https://blog.csdn.net/zcw1994/article/details/80206472

有用
分享
全部评论快来秀出你的观点
登录 后可发表观点…
发表
暂无评论,快来抢沙发!
高并发编程训练营