我生锈了,罐头';我不知道如何在JavaSwing中正确处理异常

我生锈了,罐头';我不知道如何在JavaSwing中正确处理异常,java,swing,exception-handling,Java,Swing,Exception Handling,所以,我有这个程序,它运行正常。但我有个问题。您不能添加已经在我的数组的ID表中的ID 这是我的添加按钮(laggTill)上侦听器的代码 我不知道如何使异常停止添加数据。例如,当我把字母放在我的ID框中时,我想我无法添加它。但它仍然存在。By JOptionPane显示upp并显示错误消息,但仍将其添加到数组中。我该如何阻止这种情况发生? 我认为异常停止了一切,但显然它没有 我还需要身份证检查的例外情况。。我不知道怎么做。。我已经有一段时间没这么做了,所以我想不出来 因此,基本上,我的问题是:

所以,我有这个程序,它运行正常。但我有个问题。您不能添加已经在我的数组的ID表中的ID

这是我的添加按钮(laggTill)上侦听器的代码 我不知道如何使异常停止添加数据。例如,当我把字母放在我的ID框中时,我想我无法添加它。但它仍然存在。By JOptionPane显示upp并显示错误消息,但仍将其添加到数组中。我该如何阻止这种情况发生? 我认为异常停止了一切,但显然它没有

我还需要身份证检查的例外情况。。我不知道怎么做。。我已经有一段时间没这么做了,所以我想不出来

因此,基本上,我的问题是:如何使异常阻止数据的添加。我如何让我的类检查ID是否唯一

主要类别:

私有类侦听器实现ActionListener{

    String getId;

    @Override
    public void actionPerformed(ActionEvent ae) {

        if (ae.getSource() == laggTill) {

            DTODjur dto = new DTODjur();

            dto.djurNamn = textFieldNamn.getText();
            dto.djurKategori = (String) comboBox.getSelectedItem();
            try {
                dto.djurID = Integer.parseInt(textFieldId.getText());
                dao.laggTill(dto);
            } catch (WrongDjurID ex) {
                 JOptionPane.showMessageDialog(null, ex.getMessage());
            }
            catch (NumberFormatException ex) {
                JOptionPane.showMessageDialog(null, ex.getMessage());
            }
            textArea.setText("Lade till: \nID: " + textFieldId.getText() + "\nNamn: " + textFieldNamn.getText() + "\nKategori: "+ comboBox.getSelectedItem());
        }
DAO类:

public void laggTill(DTODjur dto) throws WrongDjurID {

    boolean found = false;

    openDB();

    try {
        int djurid = dto.djurID;
        String djurnamn = dto.djurNamn;
        String djurkategori = dto.djurKategori;

        String SQL = "INSERT INTO h12mjont_djur(djurID,djurNamn,djurKategori) VALUES('" + djurid + "','" + djurnamn + "','" + djurkategori + "')";

        System.out.println(SQL);
        st.executeUpdate(SQL);
        found=true;

    } catch (SQLException ex) {
    }
    if (!found) {
        throw new WrongDjurID("Id ska inte innehålla bokstäver");
    }else  {

    dtodjur = getAll();
   }

    closeDB();
    dtodjur = getAll();
}

您的问题是捕获异常,然后在捕获后编写代码,就好像什么都没有发生一样继续。我建议将所有捕获逻辑移到每个方法的末尾。在第一个块中,将其更改为:

字符串getId

@Override
public void actionPerformed(ActionEvent ae) {

    if (ae.getSource() == laggTill) {

        DTODjur dto = new DTODjur();

        dto.djurNamn = textFieldNamn.getText();
        dto.djurKategori = (String) comboBox.getSelectedItem();
        try {
            dto.djurID = Integer.parseInt(textFieldId.getText());
            dao.laggTill(dto);
            textArea.setText("Lade till: \nID: " + textFieldId.getText() + "\nNamn: " + textFieldNamn.getText() + "\nKategori: "+ comboBox.getSelectedItem());
        } catch (WrongDjurID ex) {
             JOptionPane.showMessageDialog(null, ex.getMessage());
        }
        catch (NumberFormatException ex) {
            JOptionPane.showMessageDialog(null, ex.getMessage());
        }
    }
第二段代码:

public void laggTill(DTODjur dto) throws WrongDjurID {
   openDB();

   try {
    int djurid = dto.djurID;
    String djurnamn = dto.djurNamn;
    String djurkategori = dto.djurKategori;

    String SQL = "INSERT INTO h12mjont_djur(djurID,djurNamn,djurKategori) VALUES('" + djurid + "','" + djurnamn + "','" + djurkategori + "')";

    System.out.println(SQL);
    st.executeUpdate(SQL);
    dtodjur = getAll();

   } catch (SQLException ex) {
      throw new WrongDjurID("Id ska inte innehålla bokstäver");
   } finally {
      closeDB();
   }
}

现在,如果引发异常,则不会运行getAll()调用即使抛出了一个将重新读取列表的异常。记住在读取数据库后使用finally子句进行清理,无论它是否成功或抛出了异常。

那么,您得到的是什么SQL异常?您可以在尝试执行之前执行
Select
Count
查询以检查id是否存在
Insert
查询。好吧,谢谢!当我看到它时,这是很明显的…但是正如我所说,我已经有一段时间没有这样做了。谢谢你的帮助!