Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 相同类型的代码,但有一个代码显示异常_Java_Mysql_Exception - Fatal编程技术网

Java 相同类型的代码,但有一个代码显示异常

Java 相同类型的代码,但有一个代码显示异常,java,mysql,exception,Java,Mysql,Exception,我编辑了这个问题。这是完整的代码。看一看 public class AddStaff extends Application { private Connection connect = null; private Statement statement = null; private ResultSet rs = null; private PreparedStatement preparedStatement = null; TextField

我编辑了这个问题。这是完整的代码。看一看

  public class AddStaff extends Application {

    private Connection connect = null;
    private Statement statement = null;
    private ResultSet rs = null;
    private PreparedStatement preparedStatement = null;
    TextField addSubName;
    String msg;
    private TableView<Staff> table = new TableView<Staff>();
    private final ObservableList<Staff> data
            = FXCollections.observableArrayList();
    final HBox hb = new HBox();

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        Scene scene = new Scene(new Group());
        stage.setTitle("Add Staff");
        stage.setWidth(450);
        stage.setHeight(550);
        stage.setResizable(false);
        final Label label = new Label("Staff Details");
        label.setFont(Font.font("Calibri", FontWeight.BOLD, 22));
        label.setTextFill(Color.WHITE);
        TableColumn sub = new TableColumn("Staff Name");
        sub.setMinWidth(400);
        sub.setCellValueFactory(
                new PropertyValueFactory<Staff, String>("subName"));
        sub.setCellFactory(TextFieldTableCell.forTableColumn());
        sub.setOnEditCommit(
                new EventHandler<TableColumn.CellEditEvent<Staff, String>>() {
                    @Override
                    public void handle(TableColumn.CellEditEvent<Staff, String> t) {
                        ((Staff) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())).setSubName(t.getNewValue());
                    }
                }
        );

        table.setItems(data);
        table.getColumns().addAll(sub);
        addSubName = new TextField();
        addSubName.setPromptText("Staff Name");
        addSubName.setPrefSize(200, 30);    
        final Button b2 = new Button("Add");
        b2.setFont(Font.font("Calibri", FontWeight.BOLD, 17));
        b2.setPrefSize(70, 30);
        b2.setStyle(" -fx-base: #0066ff;");
        b2.setTextFill(Color.BLACK);
        b2.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent e) {

                msg = addSubName.getText();
                try {
                    enterStaff();
                } catch (ClassNotFoundException | SQLException ex) {
                    Logger.getLogger(AddStaff.class.getName()).log(Level.SEVERE, null, ex);
                }
                data.add(new Staff(addSubName.getText()));
                addSubName.clear();
            }
        });

        hb.getChildren().addAll(addSubName, b2);
        hb.setSpacing(5);
        final VBox vbox = new VBox();
        vbox.setSpacing(10);
        vbox.setPadding(new Insets(20, 20, 20, 20));
        vbox.getChildren().addAll(label, table, hb);
        vbox.setStyle("-fx-background-color: #333333;");
        ((Group) scene.getRoot()).getChildren().addAll(vbox);
        stage.setScene(scene);
        stage.show();
    }

    public void enterStaff() throws ClassNotFoundException, SQLException {
        try {
            Class.forName("com.mysql.jdbc.Driver");
            connect = DriverManager
                    .getConnection("jdbc:mysql://localhost:3306/project?"
                            + "user=root&password=virus");
            statement = connect.createStatement();

            preparedStatement = connect
                    .prepareStatement("SELECT count(*)FROM information_schema.tables\n"
                            + "WHERE table_schema = 'project' AND table_name = 'staff'");
            rs = preparedStatement.executeQuery();
            rs.next();
            int chk = rs.getInt(1);

            if (chk != 1) {
                preparedStatement = connect
                        .prepareStatement("create table staff (staffname varchar(30) primary key");
                preparedStatement.executeUpdate();
            }

            preparedStatement = connect
                    .prepareStatement("insert into staff values(?)");
            preparedStatement.setString(1, msg);
            preparedStatement.executeUpdate();
        } catch (ClassNotFoundException | SQLException e) {
            throw e;
        } finally {
            close2();
        }

    }

    private void close2() {
        try {

            if (statement != null) {
                statement.close();
            }

            if (connect != null) {
                connect.close();
            }
        } catch (SQLException e) {

        }
    }
}
我不知道为什么会发生这种异常。我花了很长时间来纠正它。我怎样才能避免这种例外


我以前问过这个问题。也请注意-

我不认为这是您的代码,但您正在尝试向数据库插入一个具有相同主键的条目

Duplicate entry '' for key 'PRIMARY'
这意味着您要插入的项的密钥为null,并且您已经插入了具有此密钥的项


问题可能是您正在创建该表,但上一次运行时该表已经存在。创建新表时,始终尝试先删除。

代码中没有问题,但在数据库中插入的值违反了主键约束

Duplicate entry '' for key 'PRIMARY'
明确说明您正试图在主字段staffname中输入重复的empaty字符串

stuffname是字段,它是主键。我假设变量msg是一个空字符串,并且您已尝试运行代码两次

异常表示,您正在尝试插入表中已存在的主键值

preparedStatement.setString(1, msg);
您试图插入的msg为null,可能是因为异常显示staff表中存在重复条目,并且列staffname具有主键约束,所以它不允许您插入重复值

编辑:

编辑后出现异常的原因相同。 但是,您可以改进代码设计

将msg作为enterstaff方法的参数

并在调用方法之前检查msg是否不为null

if ( null != msg && !msg.trim().equals(""))
{
   enterstaff(msg);
}

我解决了。我刚把职员的名字改成了用户。现在没有例外,一切正常。

1。从信息模式中选择计数*以从信息模式中选择计数*。2.staffname是主键,因此请确保您没有为其添加重复的值。您可以通过调试代码轻松找到错误…似乎msg没有使用正确的输入填充。请再次查看异常。它说我不止一次尝试进入“”。但我没有尝试过进入''。我总是在文本字段中键入一些数据。文本字段中的数据如何没有被输入到数据库中。@Tom:可能是因为从上一次运行开始,表就在那里,您没有将它与之前插入的项一起删除。@Tom:当您调试行preparedStatement.SetString,msg;它是空的吗?您可以使用System.out.printlnmg打印出来;看看。我们可以把问题分为与数据库相关还是与输入相关。请再次查看异常。它说我不止一次尝试进入“”。但我没有尝试过进入''。我总是在文本字段中键入一些数据。了解如何将文本字段中的数据输入数据库。调试消息字段。这可能是主要的问题
enterStaff(addSubName.getText());
public void enterStaff(String stuffName){
   if(stuffName!=null && !stuffName.trim().isEmpty()){
      ...
   }
}
Duplicate entry '' for key 'PRIMARY'
preparedStatement.setString(1, msg);
enterstaff(String msg)...
if ( null != msg && !msg.trim().equals(""))
{
   enterstaff(msg);
}