为MySQLIntegrityConstraintViolationException创建System.out.println:密钥' PRIMARY'的重复条目。

时间:2016-03-19 14:19:24

标签: java mysql

我有一大堆代码,用户可以选择学生ID和班级ID,并在课堂上注册该学生。我正试图拥有它,所以如果学生尝试注册他们已经在的课程,则会出现错误消息。我收到CVE错误,说重复输入,这是我想要的,但我怎么能将此错误打印出来给用户?我尝试了CVE错误,但一定是出错了。

public static void addClass() {

    try {
        rs = myStmt.executeQuery("SELECT * FROM ClassSelector.classes");
        while (rs.next()) {
            String availableClasses = rs.getString("class_id") + "\t" + rs.getString("class_name") + "\t" + rs.getString("description");
            System.out.println(availableClasses);
        }
        System.out.println("Enter Class ID from Classes Listed Above to Join: ");
        selectedClass = sc.nextLine();
        rs = myStmt.executeQuery("SELECT * FROM ClassSelector.classes WHERE class_id = " + selectedClass);
        while (rs.next()) {
            String innerJoin = (userEnterIdAsName + " has been added to " + rs.getString("class_name") + " " + rs.getString("class_id"));
            System.out.println(innerJoin);
            String student_x_classJoin = "INSERT INTO student_x_class" + "(student_id, student_name, class_id, class_name)" + "VALUES (?, ?, ?, ?)";
            PreparedStatement pStmt = con.prepareStatement(student_x_classJoin);
                pStmt.setString(1, user_entered_student_id);
                pStmt.setString(2, userEnterIdAsName);
                pStmt.setString(3, rs.getString("class_id"));
                pStmt.setString(4, rs.getString("class_name"));
                pStmt.executeUpdate();
                System.out.println("Would you like to enroll " + userEnterIdAsName + " into another class? (Y/N)");
                String addAdditionalClass = sc.nextLine();
                if (addAdditionalClass.equalsIgnoreCase("Y")) {
                    addClass();
                } else if (addAdditionalClass.equalsIgnoreCase("N")) {
                    return;
                }
            }
    }
    catch (java.sql.SQLException SQL) {
        SQL.printStackTrace();
    }
}

错误来自这一行:

String student_x_classJoin

由于

这是错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Duplicate entry '33-315' for key 'PRIMARY'
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:422)
    at com.mysql.jdbc.Util.handleNewInstance(Util.java:404)
    at com.mysql.jdbc.Util.getInstance(Util.java:387)
    at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:932)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3878)
    at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3814)
    at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2478)
    at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2625)
    at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2551)
    at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1861)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2073)
    at com.mysql.jdbc.PreparedStatement.executeUpdateInternal(PreparedStatement.java:2009)
    at com.mysql.jdbc.PreparedStatement.executeLargeUpdate(PreparedStatement.java:5094)
    at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:1994)
    at ClassSelectorApp.addClass(ClassSelectorApp.java:168)
    at ClassSelectorApp.signUp(ClassSelectorApp.java:122)
    at ClassSelectorApp.main(ClassSelectorApp.java:29)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:497)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:144)

1 个答案:

答案 0 :(得分:0)

你可以使用另一个试图抓住你的句子

     pStmt.executeUpdate();

Catching the wrong exception

中解释的一样

堆栈跟踪后编辑

    try {
        pstmt.executeUpdate();
    } catch (MySQLIntegrityConstraintViolationException ex) {
          System.out.println("Duplicated entry"); // or whatever message you want
          throw new SQLException("Duplicated entry"); // "jump" to external catch
    }