【问题标题】:Show only one error message inside try catch在 try catch 中只显示一条错误消息
【发布时间】:2015-05-20 09:43:48
【问题描述】:

在我的“添加”按钮单击中,我键入了一些运行良好的代码,在我的 try catch 块中,我有两条 JOptionPane 消息。 第一条信息表示信息已成功添加,另一条在 catch 块内表示不能在同一日期将客户两次添加到同一旅游中。

当我在没有任何主键违规的情况下运行此代码时,它会显示第一条消息(这是正确的),但也显示第二条消息。它应该只显示第一条消息并停止。但在显示两条消息后,它会添加到数据库中。

当我输入一些会违反主键的内容时,它会显示添加成功消息(这是错误的),然后是错误消息。它不会添加到数据库中。

我做错了什么?

这是我的代码。

 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         
        DBConnection db = new DBConnection();

        if (txt_name.getText().isEmpty() || txt_escort.getText().isEmpty()) {
            JOptionPane.showMessageDialog(null, "Cannot have empty fields");
        } else {

            clientID = combo_client.getSelectedItem().toString();
            tourID = combo_tour.getSelectedItem().toString();
            date = combo_date.getSelectedItem().toString();
            escortID = txt_escort.getText();
            clientName = txt_name.getText();

            try {

                query = "INSERT INTO tourRParticipant(ClientID,Name,TourID,StartDate,EscortID) VALUES (?,?,?,?,?)";
                PreparedStatement stm = db.getconn().prepareStatement(query);
                JOptionPane.showMessageDialog(null, "Added successfully!");
                stm.setString(1, clientID);
                stm.setString(2, clientName);
                stm.setString(3, tourID);
                stm.setString(4, date);
                stm.setString(5, escortID);
                rs = stm.executeQuery();

                rs.next();

                conn.close();

            } catch (Exception e) {
                JOptionPane.showMessageDialog(null, "ERROR..Client cannot be added to the same tour with the same date");
            }

            ViewTable();
        }
    }                                        

【问题讨论】:

  • 写下这一行 JOptionPane.showMessageDialog(null, "添加成功!");在 rs = stm.executeQuery(); 之后
  • 由于您在实际执行 jdbc 查询之前显示了第一条消息,因此您很可能会得到一个仍然被捕获的SQLException
  • 这是因为你没有验证抛出了什么异常。您在 catch 块中的描述是错误的。此外,在打印成功添加客户端之前,您不会验证是否添加了客户端。将该行移动到执行查询之后
  • @SpringLearner 我以前试过。但它仍然提供相同的输出。
  • @Dragondraikk 现在在执行下粘贴成功消息后不显示成功消息。即使我输入正确,它也只是显示错误

标签: java sql database jframe try-catch


【解决方案1】:

首先,在执行更新之前显示成功消息JOptionPane.showMessageDialog(null, "Added successfully!");。它应该在插入语句执行后显示。

其次,您应该调用 executeUpdate 而不是 executeQuery,因为您正在执行 INSERT 语句。

stm.executeUpdate();
JOptionPane.showMessageDialog(null, "Added successfully!");

【讨论】:

  • @ShanD 您应该打印捕获的异常的详细信息(catch 子句中的System.out.println(e))。这将帮助您理解问题。
【解决方案2】:
JOptionPane.showMessageDialog(null, "Added successfully!");

应该在

rs = stm.executeQuery();

正如其他答案中所指出的,应该使用stmt.executeUpdate() 而不是stmt.executeQuery()。当您将更新查询传递给 executeQuery() 方法时,它会引发异常。这就是为什么您总是收到两条消息。

【讨论】:

  • 我试过了...现在它甚至没有显示已成功添加的消息。即使我正确输入数据,它也只会显示错误
  • 那是因为您使用executeQuery 进行更新。更新时使用的正确方法是executeUpdate
  • 是的,我改为 executeUpdate() 然后它说 int 不能转换为 ResultSet
  • 这是因为 executeUpdate 返回更新的行数,这是 int 而不是 ResultSet。要了解这些工作,请通过此链接:docs.oracle.com/javase/7/docs/api/java/sql/…
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-14
  • 2011-11-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多