13
 private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)
{
    final int c=0;
    final JDialog d=new JDialog();
    JLabel l=new JLabel("Enter the Element :");
    JButton but1=new JButton("OK");
    JButton but2=new JButton("Cancel");
    final JTextField f=new JTextField(10);
    JPanel panel = new JPanel();
    but1.addActionListener(new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            c=Integer.parseInt(f.getText());
            d.setVisible(false);
            d.dispose( );
        }
     });
but2.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent e){
        d.setVisible(false);
        d.dispose( );
    }
});
}

私はネットビーンズ7.1.1を使用しています。これは、「c」を「final int」として宣言した私のコードですが、「c=Integer.parseInt(f.getText());」という行です。「最終変数に値を割り当てることができません」というエラーが表示されます。宣言から final という単語を削除して「int c」と同じにする場合、同じ行に「クラス内からローカル変数 c にアクセスできません。final を宣言する必要があります」というエラーが表示されます。なぜこれが起こっているのか誰にも教えてもらえますか?

4

7 に答える 7

34

関数で宣言されたcを取得し、その関数内に匿名の内部クラスを作成しました。この内部クラスである ActionListener は、関数が終了した後も存続します。そのため、c は関数に対してローカルであるため、c に値を割り当てることはできません。

「最終」に関する警告は誤解を招きます。これは、匿名クラスから一時的なローカル変数にアクセスできないことをコンパイラが伝えているだけです。c を final にするだけでは問題を解決できません。これにより、c への割り当てがまったくできなくなりますが、c をクラス pushButtonActionPerformed のインスタンス メンバーにすることはできます。このようなもの:

class Something
{
    int c;

    private void pushButtonActionPerformed(java.awt.event.ActionEvent evt)
    {
        JButton but1=new JButton("OK");
        but1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                c=Integer.parseInt(f.getText());
            }
        });
    }
}
于 2012-04-16T12:35:51.147 に答える
14

私は理由をスキップして解決策に切り込みます:使用

final int[] c = {0};
...
c[0] = Integer.parseInt(f.getText());

全文については、この投稿を参照してください

于 2012-04-16T12:33:24.967 に答える
6

しかし、「c=Integer.parseInt(f.getText());」という行 「最終変数に値を代入できません」というエラーが表示されます

右。変数の全体的なポイントはfinal、それらに1回しか割り当てることができないということですが、2回割り当てようとしています(初期化0で1回、引用行で1回)。仕様から:

変数を宣言できますfinalfinal変数は 1 回だけ割り当てることができます。変数を宣言するfinalと、その値が変更されないという有用なドキュメントとして機能し、プログラミング エラーを回避するのに役立ちます。

final代入の直前に変数が確実に未代入でない限り (§16) に変数が代入されると、コンパイル時エラーになります。

空白finalは、final宣言に初期化子がない変数です。

final変数が割り当てられると、常に同じ値が含まれます。変数がオブジェクトへの参照を保持している場合、finalオブジェクトの操作によってオブジェクトの状態が変更される可能性がありますが、変数は常に同じオブジェクトを参照します。

(私の強調ではなく、彼らの強調です。)

メソッドの変数に格納している状態を追跡しようとする代わりに、作成しcている匿名のインスタンスのデータ メンバーで追跡しますActionListener

于 2012-04-16T12:28:52.937 に答える
2

finalこれがjavaにキーワードが存在する理由です。変数は final です。つまり、その値は変更できません。値を変更する必要がある場合は、変数を final としてマークしないでください。

于 2012-04-16T12:28:51.237 に答える
0

変数がfinalキーワードで宣言されているということは、その値を変更できないことを意味します。最終変数は定数のようなものです

于 2012-04-16T12:28:32.143 に答える
0

final「変数」を定数にします。変更することはできません。final キーワードを削除した後にコンパイラが警告を表示する理由については、コード全体を確認する必要があります...

編集:

 but1.addActionListener(new ActionListener()
 {
     public void actionPerformed(ActionEvent e)
     {
         c=Integer.parseInt(f.getText());
         d.setVisible(false);
         d.dispose( );
     }
  });

これは、コンパイラが警告を発生させるコードのセグメントであると思います。cこのクラスでは使えません...

于 2012-04-16T12:29:48.140 に答える
-4

宣言からキーワードを削除してfinal、プログラムを続行してください。finalキーワードは、値が変更されていないことを意味します。

于 2012-04-16T12:30:20.563 に答える