在我的Java程序中获取SQLException错误,不确定原因

时间:2013-11-12 22:22:00

标签: java sql database exception jdbc

我正在尝试在单击按钮时运行代码,但它告诉我需要捕获异常,但我认为我已经这样做了。我错过了什么吗?看起来很简单,但我似乎无法弄明白。 我在第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); 
 }

} 
} 

4 个答案:

答案 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();
}
在你的阻挡之后

。并再次运行您的代码。这将捕获抛出的任何异常并将打印堆栈跟踪。

但我打赌你已经在你的控制台上看到了,不是吗?你也可以复制堆栈跟踪吗?