我正在尝试在单击按钮时运行代码,但它告诉我需要捕获异常,但我认为我已经这样做了。我错过了什么吗?看起来很简单,但我似乎无法弄明白。 我在第76-83行
上收到此错误class EmpList {
private static JFrame frame;
private static JTextField textField;
public static void main (String args [])
throws SQLException {
DriverManager.registerDriver (new oracle.jdbc.driver.OracleDriver());
final String user, pass, query;
user = "asdf";
pass = "asdf";
query = "select * from customers";
try
{
Connection conn = DriverManager.getConnection
("jdbc:oracle:thin:@Picard2:1521:itec2",user,pass);
final Statement stmt = conn.createStatement ();
final ResultSet rset = stmt.executeQuery (query);
EmpList window = new EmpList();
frame = new JFrame();
frame.setBounds(100, 100, 630, 470);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.getContentPane().setLayout(null);
final JTextArea textArea = new JTextArea();
textArea.setEditable(false);
textArea.setLineWrap(true);
textArea.setBounds(10, 179, 594, 241);
frame.getContentPane().add(textArea);
textField = new JTextField();
textField.setBounds(255, 69, 86, 20);
frame.getContentPane().add(textField);
textField.setColumns(10);
JLabel lblEnterCustomerId = new JLabel("Enter Customer ID (1-6)");
lblEnterCustomerId.setBounds(240, 43, 153, 14);
frame.getContentPane().add(lblEnterCustomerId);
JButton btnGetInfo = new JButton("Get Info");
btnGetInfo.setBounds(255, 115, 89, 23);
frame.getContentPane().add(btnGetInfo);
btnGetInfo.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
while (rset.next ())
{
textArea.append((rset.getString("CUSTID") + " - " + rset.getString("CUSTSSN")
+ " - " + rset.getString("LNAME") + " - " + rset.getString("FNAME") + " - " +
rset.getString("STREET") + " - " + rset.getString("CITY") + " - " + rset.getString("STATE") +
" - " + rset.getString("ZIP") + " - " + rset.getString("PHONE") + System.getProperty("line.separator")
+ System.getProperty("line.separator")));
}
}
});
window.frame.setVisible(true);
}
我认为这会抓住异常,但我猜它不会。
catch (SQLException e)
{
System.out.println ("Could not load the db"+e);
}
}
}
答案 0 :(得分:3)
actionPerformed()
方法具有可能抛出SQLException
的JDBC语句。您必须处理该方法中的异常。它不在您创建匿名内部类的try
块中。
答案 1 :(得分:1)
以下是相关问题:
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
while (rset.next ()) {...}
}
}
这是一个新类,该函数在函数上下文中调用rset,该函数上下文没有用于封闭上下文的try catch块,并且不会从函数中抛出异常。
将该代码更改为适当的代码,但这样可以帮助您:
new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
try {
while (rset.next()) {...}
} catch (SQLException ex) {
// do something cool
}
}
}
答案 2 :(得分:0)
使用下面的Catch子句然后它肯定会捕获你的异常。抛出的异常可能不是SQLException因此它没有被捕获
catch (Exception e)
{
System.out.println ("Exception Thrown: "+e);
}
答案 3 :(得分:0)
您的代码似乎正在正确捕获异常。你确定你真的有SQL异常吗?您也可以添加:
catch (Throwable t) {
t.printStackTrace();
}
在你的阻挡之后。并再次运行您的代码。这将捕获抛出的任何异常并将打印堆栈跟踪。
但我打赌你已经在你的控制台上看到了,不是吗?你也可以复制堆栈跟踪吗?