如何在try / catch之外使用变量?

时间:2013-05-17 16:28:08

标签: java try-catch

我有一个应用程序,用户输入用户名,应用程序从数据库查询返回用户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 个答案:

答案 0 :(得分:3)

将userID声明为类级别变量。

所以你可以在任何其他地方使用它,最终 try catch 块之外访问它,但是你不会< / strong>能够更改此变量的值。

class User  
{  
   private int userID;  

//Constructors
 public void actionPerformed (ActionEvent e)
        {  

   }
}    

答案 1 :(得分:2)

变量是各自代码块的本地变量。如果你想在try-catch之外使用它们,要么在块之外定义它们,然后在里面使用它们,或者,如注释所示,在try块中移动更多的代码。

编辑:或者更好,正如其他两个答案所说的那样,让它成为一个班级成员。

答案 2 :(得分: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);

答案 3 :(得分:1)

通常,如果在{}范围内声明变量,则该范围外的变量不可访问。这适用于C,C ++,Java和许多其他语言。

在Java中,如果您在范围之外声明变量,请仅在条件范围内设置它(由于iftry/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是否合适,或者错误是否得到妥善处理 - 这是一个单独的问题。)