2

ユーザーがユーザー名を入力し、アプリケーションがデータベース クエリからユーザー ID を返すアプリケーションがあります。

私が抱えている問題は、どのように表示するuserIDuserIDLblですか?

コードは次のようになります。

JButton currentRoleBtn = new JButton("Get ID");
    currentRoleBtn.setBounds(50, 50, 150, 30);
    currentRoleBtn.setToolTipText("Press to get the ID for the user");
    currentRoleBtn.addActionListener(new ActionListener()
    {
        public void actionPerformed (ActionEvent e)
        {
            int userID;
            String userName = adUserNameTxt.getText().toString();
            StringBuffer getRolesQuery1 = new StringBuffer("select id from hib.person where name = '");
            getRolesQuery1.append(userName).append("'");
            try 
            {
                ResultSet rs = stmt.executeQuery(getRolesQuery1.toString());
                try
                {
                    while (rs.next())
                    {
                        userID = rs.getInt(1);
                        System.out.println("The User ID is: " +userID);

                    }
                }
                finally
                {
                    rs.close();
                }
            } 

            catch (SQLException e1) 
            {
                // TODO Auto-generated catch block
                e1.printStackTrace();
            }
        }
    });

    //Create UserID label
    JLabel userIDLbl = new JLabel("User ID is: " +userID);
    userIDLbl.setFont(new Font("Georgia", Font.PLAIN, 14));
    userIDLbl.setForeground(new Color(50,50, 25));
    userIDLbl.setBounds(25, 200, 200, 30);
4

4 に答える 4

4

userID をクラス レベル変数として宣言します。

そのため、 try catchブロックの外側でアクセスするには最終的にする必要がありますが、この変数の値を変更することはできません。

class User  
{  
   private int userID;  

//Constructors
 public void actionPerformed (ActionEvent e)
        {  

   }
}    
于 2013-05-17T16:30:56.877 に答える
2

変数は、それぞれのコード ブロックに対してローカルです。それらを try-catch の外側で使用する場合は、ブロックの外側で定義してから内側で操作するか、コメントで示されているように、try ブロックの内側にさらに多くのコードを移動します。

編集:または、他の2つの回答が述べているように、それをクラスメンバーにします。

于 2013-05-17T16:30:43.267 に答える
1

クラスメンバー変数にします。

class Foo  
{  
   private int userID;  
...
//getters setters
 public void actionPerformed (ActionEvent e)
        {  
          ...
   }
}       

これを絶対にしないでください

 StringBuffer getRolesQuery1 = new StringBuffer("select id from hib.person where name = '");
            getRolesQuery1.append(userName).append("'");

ユーザー入力は信頼できません。SQL インジェクションを軽減するには、次のようなものが必要です。

PreparedStatement statement = conn.prepareStatement("select id from hib.person where name = ?");  
statement.setString(1,userName);
于 2013-05-17T16:30:45.757 に答える
1

一般に、スコープ内で変数を宣言すると{}、その変数はそのスコープ外ではアクセスできなくなります。これは、C、C++、Java、およびその他の多くの言語に当てはまります。

ifJava では、スコープ外で変数を宣言する場合は、条件付きスコープ (または により「条件付き」である可能性があります) でのみ設定し、try/catchその条件付きスコープを離れた後にその変数を参照しようとすると、コンパイラとベリファイアは、変数が初期化されていないと文句を言います。

SomeClass someVar;
try {
    someVar = someValue;
    someOtherStuff;
    ...
}
catch ... {
    ...
}
someOtherVar = someVar;  // This access IS NOT allowed, because "someVar" is not certain to be initialized if an exception occurs.

したがって、一般的に、あなたの解決策は次のとおりです。

SomeClass someVar = null;  // Or some other appropriate default value
try {
    someVar = someValue;
    someOtherStuff;
    ...
}
catch ... {
    ...
}
someOtherVar = someVar;  // This access IS allowed, because someVar is initialized, at least to "null".

(これは、try/catch の使用が適切であったかどうか、またはエラーが適切に処理されたかどうかについては何も述べていないことに注意してください。これは別の質問です。)

于 2013-05-17T16:36:07.333 に答える