更改类后的java.lang.NoSuchFieldError

更改类后的java.lang.NoSuchFieldError,java,exception,runtime,member,Java,Exception,Runtime,Member,我今天遇到了一个异常,并设法消除了错误。首先,让我给你一个示例代码 public class Foo () { protected String var; } public class Bar extends Foo () { public String isVarNull() { return (this.var == null); } } 这是我的两个示例类。这两个类都位于某个jar中。在这个场景中,一切都很好(imageine它们是有用的类,在一

我今天遇到了一个异常,并设法消除了错误。首先,让我给你一个示例代码

public class Foo () {
    protected String var;
}

public class Bar extends Foo () {
    public String isVarNull() {
        return (this.var == null);
    }
}
这是我的两个示例类。这两个类都位于某个jar中。在这个场景中,一切都很好(imageine它们是有用的类,在一些生产环境中使用)。 我现在所做的就是将
Foo
中的
Var
类型更改为
Integer

public class Foo () {
    protected Integer var;
}
之后,我编译class
Foo
,并用新的类文件替换Jar中的旧类文件。当我现在尝试访问字段
var
(在类
Bar
的方法
isVarNull()
中)时,我得到以下异常:

原因:java.lang.NoSuchFieldError:test/Bar.var at test.Bar.isVarNull(Bar.java:6)

据我所知,它与类的字节码
Bar
有关。编译类是否“知道”代码中使用的方法/变量的类型?在这种情况下,
Bar
“知道”应该返回什么类型的
var
,并因此抛出错误,因为方法的返回类型已更改? 如果能给我一个详细的答复,我将不胜感激


亲切问候

我想这里的首要答案可能会有所帮助:


但是为了不过分依赖链接,一般的想法是您可能只编译
Foo
。因此,
Foo
var
类型确实发生了变化,但
Bar
关于
var
应该是什么类型的想法却没有发生变化。是的,编译类确实“知道”它们引用的是什么类型的方法/变量。在这种情况下,
Bar
仍然认为它在
Foo
中查找名为
var
字符串,但由于它找不到,因此出现了此错误。我认为,编译这两个类应该会让所有类再次出现在同一页上

您需要重建包含所有类的解决方案

在基类中所做的更改不会反映在派生类中

重建项目应该可以工作。

“编译类”是否知道“代码中使用的方法/变量的类型?”=>是的,Java是一种类型安全语言,而且在运行时变量的类型也是已知的(泛型中的类型擦除除外)。