2016-04-18 2 views
2

は、方法があり、それは次のコードを持っています内部クラスからアクセスされるJavaローカル変数。最終的に宣言する必要があります。なぜNetBeansで動作しますか?私のJavaアプリで

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

それはコンパイルとNetBeans 8.1から正常に動作しますが、私はコマンドラインからプロジェクトをコンパイルしようとしたとき、今日、それは私を与えました次のエラーが発生します:

私の質問は、同じコードがNetBeans 8.1から正常に動作し、コマンドラインでコンパイルできないのはなぜですか? 1.8.0_77

そして、私のNetBeansのJavaのバージョンは次のとおりです:

私のコマンドラインJavaのバージョンがある問題ではないはず1.8.0_65

は、なぜNetBeansはそれエラー考慮しないのですか?

編集:

C:\ Users \ユーザーUSER>のjava -version Javaのバージョン "1.8.0_77"

C:ウー、私にとって大きな驚きは、私はちょうどのjavacのチェックをしました\私は100%混乱しています。最初は "javac -version"コマンドがあるとは思っていませんでした。 "java -verison"と思っていました。私はJavaとjavacの両方を教えてくれると思いますが、私はそれらが同じであると仮定します.2番目はJavaをインストールしたときにインストーラが自動的に更新すると思っていました。 Javaの一部であるため、内部的に一貫しているはずですが、間違いなく、私のjava -versionはjavac -versionとどう違うのですか?言い換えれば、JavaとJavaを同時にインストールするためにOracleをどのように信頼できるのですか?それが仕事をしなければ、Javaを更新するたびにjavacを手動でインストールする必要がありますか?私はそれをやったことがない、なぜ、どうやってこれが起こるのだろうか?

+1

Netbeansプロジェクトのターゲットプラットフォームとは何ですか?使用していると思う 'javac'を使用していますか?コマンドラインのパスは時々あなたを驚かせることがあります。あなたのコードは、Java 8用にコンパイルする必要があります。 – biziclop

+1

コマンドラインは1.8より前のJavaの以前のバージョンを使用していますか? – rgettman

+1

コンパイルする必要があります。コマンドラインで 'Javac'のバージョンを確認してください。 – 11thdimension

答えて

3

Java 8以前では、内部クラスでアクセスする必要があるすべてのローカル変数をfinalと宣言する必要があります。これはインプリメンテーションの詳細によるものです。ローカル変数は内部クラスの隠しインスタンス変数として実装されています。変数を変更できる場合は、内部クラスのコピーが正しくありません。

Java 8では、この要件は「final」または"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インストールであるようにパスを修正してください。 Java 8ではなくJDK 1.7(Java 7)インストールのJRE(「javac」実行可能ファイルはありません)があり、バージョン出力を説明することができます。その場合は、Java 8 JDK(1.8)をダウンロードしてインストールする必要があります。

関連する問題