gpt4 book ai didi

从内部类内部访问的 Java 局部变量;需要声明为 final,为什么它在 NetBeans 中有效?

转载 作者:行者123 更新时间:2023-11-30 08:02:44 32 4
gpt4 key购买 nike

在我的 Java 应用程序中,有一个方法,它具有以下代码:

JButton Button = new JButton(Content);
Button.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
doSomething(Button.getText());
}
});

它在 NetBeans 8.1 中编译并运行良好,但今天当我尝试从命令行编译项目时,它给了我以下错误:

local variable Button is accessed from within inner class; needs to be declared final

我的问题是:为什么相同的代码在 NetBeans 8.1 中兼容并运行良好,但不能在命令行中编译?

我的命令行Java版本是:1.8.0_77

我的 NetBeans Java 版本是:1.8.0_65

这应该无关紧要,那么为什么 NetBeans 不认为这是一个错误呢?

编辑:哇,对我来说是个大惊喜,我刚刚检查了 javac:

C:\Users\USER>java -versionJava 版本“1.8.0_77”

C:\Users\USER>javac -versionjavac 1.7.0_40

等一下,我 100% 很困惑,首先我不知道有一个“javac -version”命令,我以为“java -verison”会告诉我 java 和 javac,我假设它们是同样,第二,我安装Java的时候,我以为安装程序会自动更新它,javac是java的一部分,所以它应该是内部一致的,但肯定不是,所以我的java -version怎么和我的不一样javac-版本?换句话说,我怎么能相信 Oracle 会同时安装我的 java 和 javac,如果它不能完成这项工作,这是否意味着每次我更新 Java 时,我都需要以某种方式手动安装我的 javac?我从来没有这样做过,那么为什么会发生这种情况以及如何发生这种情况?

最佳答案

在Java 8之前,所有需要在内部类中访问的局部变量都需要声明final .这是由于一个实现细节——局部变量被实现为内部类的隐藏实例变量。如果变量可以更改,那么内部类中的副本将不正确。

在 Java 8 中,此要求放宽为“最终”或 "effectively final" (向下滚动大约 2/3)。

However, starting in Java SE 8, a local class can access local variables and parameters of the enclosing block that are final or effectively final. A variable or parameter whose value is never changed after it is initialized is effectively final.

变量不必显式声明为 final , 它必须是有效的最终的——不是明确的 final , 只是没有改变。

你没有改变 Button ,所以它实际上是最终的,它在 Java 8 下编译。但是,Java 7 仍然要求它被显式声明 final所以存在编译错误。

修正你的路径,使javac是您的 Java 8 安装。您可能有一个 JRE(没有“javac”可执行文件),它是 Java 8,但安装了 JDK 1.7 (Java 7),这可以解释您的版本控制输出。在这种情况下,您需要下载并安装 Java 8 JDK (1.8)。

关于从内部类内部访问的 Java 局部变量;需要声明为 final,为什么它在 NetBeans 中有效?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36703670/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com