0

私が持っていた以前の質問を参照してください:

Javaフォームを使用したデータベーススクロールボタン-次のメソッドを呼び出してカーソルを上に移動するとエラーが発生しますResultsetオブジェクト

上記の質問に対する回答を参照してください(この質問の下部のパラグラスを参照してください)

私は疑問に思っていました-あなたが言っているとき:'変数を隠す'-これは実際にはどういう意味ですか:プライベート関数として設定されたnetbeansで生成されたコードイベントスタブを参照していますか?もしそうなら、私が試したのですが、Netbeansが私を許可しないので、どのように公開に変更しますか?

これが私のコードです:��

public void DoConnect( ) {

        try{
        String host = "jdbc:derby://localhost:1527/Employer";
        String uName = "admins";
        String uPass= "admins";


        Connection con = DriverManager.getConnection( host, uName, uPass );
//        Statement stmt = con.createStatement( );
        stmt = con.createStatement( ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE );

        String SQL = "SELECT * FROM WORKERS";
        ResultSet rs = stmt.executeQuery( SQL );

        rs.next( );
        int id_col = rs.getInt("ID");
        String id=Integer.toString(id_col);
        String first= rs.getString("First_Name");
        String last = rs.getString("Last_Name");
        String job = rs.getString("Job_Title");

        textID.setText(id);
        textFirstName.setText(first);
        textLastName.setText(last);
        textJobTitle.setText(job);

        }

        catch ( SQLException err ){
               System.out.println( err.getMessage( ) );

        }

    }

そして、netbeansはイベントコードスタブを生成しました。その中にイベントコードを配置しました:

private void btnNextActionPerformed(java.awt.event.ActionEvent evt) {                                        
        // TODO add your handling code here:
        try {





        if ( rs.next( )) {

               int id_col = rs.getInt("ID");
                String id = Integer.toString(id_col);
                String first = rs.getString("First_Name");
                String last = rs.getString("Last_Name");
                String job = rs.getString("Job_Title");

                textID.setText(id);
                textFirstName.setText(first);
                textLastName.setText(last);
               textJobTitle.setText(job);
            }
            else {
                rs.previous( );
                JOptionPane.showMessageDialog(Workers.this, "End of File");
            }
        }
        catch (SQLException err) {
            JOptionPane.showMessageDialog(Workers.this, err.getMessage());
            System.out.println( err.getMessage( ) );
        }
    }                                       


    public static void main(String args[]) {

        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new Workers().setVisible(true);
            }
        }
    }

以前の回答は、次のように言った@UwePlonusから親切に私に与えられました。

「問題は、ResultSetがnullであるということです。

あなたはあなたの変数rsを隠しています。

あなたのコードは(基本的に)次のとおりです。

public class Sample {
    ResultSet rs; // is null
    public method() {
        ResultSet rs = stmt.execute(); // here the other rs is hidden
    }
}

コードを機能させたい場合は、変数を非表示にしないでください。また、接続を非表示にしないでください。

答えを早く得るには、コードを減らして例を短くし、実際の問題に集中してください。」

そして私は言った...

「ご回答ありがとうございます。具体的には、rsオブジェクトのnullを解除する方法を教えてください」!

そのことについては、私の変数を再表示します。また、プライベートイベントスタブを公開しますか?

助けてください!

4

1 に答える 1

4

次のコードでは:

public class Sample {
    ResultSet rs; // is null
    public method() {
        ResultSet rs = stmt.execute(); // here the other rs is hidden
    }
}

次の 2 つの変数があります。

  • rsクラスで宣言されたという 1 つの変数
  • rsメソッドで宣言された、 とも呼ばれる 1 つのローカル変数

したがって、rsメソッドで何かを割り当てる場合、rsフィールドには何も割り当てません。これらは 2 つの異なる変数だからです。あなたの意図がフィールドを初期化することである場合、コードは

public class Sample {
    ResultSet rs;
    public method() {
        this.rs = stmt.execute(); // there is no declaration here, so rs is the field
                                  // and not a new, local variable
    }
}

または単に

public class Sample {
    ResultSet rs;
    public method() {
        rs = stmt.execute(); 
    }
}
于 2012-12-09T17:03:25.927 に答える