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、名前または nif が空であるか、または給与が null でない場合に戻ります。正しくチェックするには、次を使用する必要があります。

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;
}

アップデート

厳密に必要でない場合は、決して変数を初期化しないことをお勧めします。場合によっては、null ポインターに夢中になることがありSQLExceptionますClassNotFoundException

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

throwsメソッドに句を追加する必要はありません。

于 2013-05-07T09:32:09.857 に答える
0

行番号を入力したので、次のことは明らかepですnull

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 に答える