2

我试图在我的数据库中添加一行,在表员工。但我得到一个例外:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ConnectionBD.EmployeeBD.add(EmployeeBD.java:56)`

这是我的源代码(EmployeeBD 类):

public void add() throws SQLException, ClassNotFoundException {
56      Employee a = ep.ReadEmployee();
57      if (a!=null) {
58          Connection conn = null; 
        try  { 
            Class.forName(BDConnect.DRIVER);
            conn = DriverManager.getConnection(BDConnect.BD_URL, BDConnect.USUARI, BDConnect.PASSWORD);
            Statement stmt = conn.createStatement(ResultSet.TYPE_SCROLL_INSENSITIVE, ResultSet.CONCUR_UPDATABLE ); 
            if (conn != null) {
                String sql = "SELECT * FROM employee";
                ResultSet rs = stmt.executeQuery( sql ); 
                rs.moveToInsertRow();
                rs.updateString( "nif", a.getNif());
                rs.updateString( "name", a.getName());
                rs.updateDouble( "salary",a.getSalary());
                System.out.println("Added Suscefully");
                rs.insertRow();
                rs.moveToCurrentRow();
            } else {
                System.out.println("Can't get DB");
            }
        } catch (SQLException ioe) { 
            System.out.println(ioe); 
        } catch(ClassNotFoundException ex) { 
            System.out.println(ex); 
        }
    }
}

和 ReadEmployee() 方法:

public Employee ReadEmployee() {
    String nif = null;
    String name = null;
    Double salary = null;
    int depId = 0;

    nif = jTextField1.getText();
    name = jTextField2.getText();
    salary = Double.parseDouble(jTextField3.getText());
    Employee  emp = new Employee(nif, name, salary, 1);

    if (name.equals("") || nif.equals("") || salary != null) {
        return emp;
    } else {
        JOptionPane.showMessageDialog(this, "Fill all TextFields", "Article warning", JOptionPane.WARNING_MESSAGE);
        return null;
    }
}

为什么它会抛出异常?我不知道如何正确地做到这一点!

4

4 回答 4

1
if (name.equals("") || nif.equals("") || salary != null) {
    ...
}

这不适用于空值的指定检查。emp如果所有字段都已填写,您希望返回,但emp如果 name 或 nif 为空,或者薪水不为空,您将返回。要正确检查它,您必须使用:

if (!name.equals("") && !nif.equals("") && salary != null) {
    return emp;
}

对于else条件,如果您想在单个字段未填满时抛出消息,请使用:

else if (name.equals("") || nif.equals("") || salary == null) {
    JOptionPane.showMessageDialog(this, "Fill all TextFields", "Article warning", JOptionPane.WARNING_MESSAGE);
    return null;
}

更新

我必须建议你,如果它不是严格必要的,永远不要初始化变量。有时,空指针会让你发疯,如果你正在处理SQLExceptionClassNotFoundException使用:

try {
    ...
} catch (SQLException ex) {
    ...
} catch (ClassNotFoundException ex) {
    ...
}

您不必throws在方法中添加子句。

于 2013-05-07T09:32:09.857 回答
0

jTextField1.getText() - 请为 jTextField1 添加空检查。如果它的空 .getText() 可以抛出空指针异常

于 2013-05-07T09:07:32.553 回答
0

好的,现在您已经输入了行号,很明显epnull

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ConnectionBD.EmployeeBD.add(EmployeeBD.java:56)`

这是我的源代码(EmployeeBD 类):

56  Employee a = ep.ReadEmployee();
于 2013-05-07T09:17:58.403 回答
0

考虑处理 ReadEmployee 的 if-else 块:

if (name.equals("") || nif.equals("") || salary != null) {
    return emp;
} else {
    JOptionPane.showMessageDialog(this, "Fill all TextFields", "Article warning", JOptionPane.WARNING_MESSAGE);
    return null;
}

if 条件表示:如果 name 为空或 nif 为空或salary 不为 null,则返回 emp。

但根据 else 块看起来像 if 条件应该是:

if (! name.equals("") && ! nif.equals("") && salary != null)
于 2013-05-07T09:21:02.517 回答