Java,代码工作,但仍然抛出异常

时间:2012-11-10 13:07:24

标签: java sql exception

我正在创建一个简单的注册框架,将记录添加到数据库中。每次运行在数据库中添加记录的SQL查询时,它都会给我一条错误消息,但它仍会添加它们,但由于这一点,我的程序会停止,而不是打开另一个窗口。

这是代码的一部分:

regButton.addActionListener(new ActionListener() {

@Override public void actionPerformed( ActionEvent e ) {
   //Execute when button is pressed
   if(   uNameField.getText().equals("")
      || new String(newPassField.getPassword()).equals("")
      || new String(repeatPassField.getPassword()).equals("") ) {
      errorLabel.setForeground(Color.red);
      errorLabel.setText("Some fields are left blank");
   }
   else if( new String(newPassField.getPassword()).equals(
            new String(repeatPassField.getPassword()))){
      Statement stmt;
      ResultSet res;
      try
      {
         //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE
         String username = uNameField.getText().toUpperCase();
         String password = new String(newPassField.getPassword()).toUpperCase();
         //SQL INSERT QUERY
         String sql;
         sql = "INSERT INTO Employees VALUES ('" +username +"','" +password +"');";
         stmt = con.createStatement();
         res = stmt.executeQuery(sql);
         System.out.println("Added to database!");
         con.close();
      }
      catch(SQLException exe) {
         System.out.println("Error creating or running statement: " + e.toString());
         try {
            con.close();
         }
         catch(Exception eex){}
      }
   }
   else {
      errorLabel.setForeground(Color.red);
      errorLabel.setText("Password missmatch");
   }
}

每次注册新员工(用户)时,都会显示“错误创建或运行语句:......”,但我可以在员工列表中找到新添加的员工。

可能导致此问题的原因是什么?

4 个答案:

答案 0 :(得分:4)

在我们解决您的具体问题之前,请先提出一些建议:

Connection con = ...
try {
    // your stuff
}
catch (Exception e) {
  e.printStackTrace();
}
finally {
  try {
    con.close();
  } catch (Exception e) {
   e.printStackTrace();
  }
}

你现在这样做的方式不仅是吞下异常,还避免打印堆栈跟踪。 close必须只进行一次,无论例外情况如何。

如果您使用的是Java 7,那么这将更容易:

try (Connetion con = ...) {
  // stuff to do
}
catch (Exception e) {
  e.printStackTrace();
}

现在自动完成finally的结束。

特别是关于您的异常,您可以通过调用executeQuery来执行INSERT。此方法将语句发送到正确执行它的DB,但它对JDBC的响应不是ResultSet。这是爆炸的地方,已经插入记录。由于您处于自动提交模式,因此无需回滚事务。课程:始终使用交易

答案 1 :(得分:2)

您需要将executeUpdate用于SQL INSERT

int rowCount = stmt.executeUpdate(sql);

答案 2 :(得分:1)

我讨厌看到以这种方式编写的代码。你没有问过这个,我的评论不会解决你的问题,但我认为需要说。

通过将持久性代码放在Swing Listener方法中,您将为自己创建一个维护噩梦。

更好的想法是以一种给予他们单一责任的方式来思考对象。

获取持久性代码并将其移动到您可以自行开发和测试的单独类中。一旦它工作,给出需要它的类的引用。

您的代码将更加模块化,更易于测试,更具可重用性,并且不会让您难以理解。

鲍勃·马丁叔叔为此以及其他值得记住的想法提供了简洁的肺部疾病:SOLID

答案 3 :(得分:0)

为什么不尝试PreparedStatement

try{
    //SET USERNAME AND PASSWORD FROM FIELDS TO UPPER CASE
     String username = uNameField.getText().toUpperCase();
     String password = new String(newPassField.getPassword()).toUpperCase();
     //SQL INSERT QUERY
     PreparedStatement pstmt = con.prepareStatement("insert into Employees values(?,?)");
     pstmt.setString(1,username);
     pstmt.setString(2,password);

     if(!pstmt.execute())
     {
       //means your code worked correctly
        System.out.println("Inserted successfully");
     }
     else
     {
           System.out.println("Unsuccessfull");
     }
   }
   catch(Exception ex)
   {
      ex.printStackTrace();
   }