2

我有一个应用程序,用户正在输入用户名,并且应用程序正在从数据库查询中返回用户 ID。

我遇到的问题是如何在userID中显示userIDLbl

代码如下所示:

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 块中。

编辑:或者更好的是,正如其他两个答案所述,使其成为班级成员。

于 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 和许多其他语言。

在 Java 中,如果您在范围之外声明变量,则仅将其设置在条件范围内(由于 anif或由于可能是“条件” 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 回答