为什么它通过mysql交互摆脱while循环?

时间:2017-05-20 16:38:25

标签: mysql try-catch

我在Eclipse上运行此代码,几天前我开始与java进行mysql交互...

我真的不明白,当我执行()一个PreparedStatement时,看起来它突破了while循环,也许它抛出一个异常,然后try catch中断,但是有什么方法可以保持循环? / p>

评论是关于我的语言,它只是解释了它的作用。

public static void main(String[] args) {
    Scanner sc = new Scanner(System.in);

    try {
        Class.forName("com.mysql.jdbc.Driver");
        Connection conexion = DriverManager.getConnection("jdbc:mysql://localhost/base_de_datos_java", "root", "");
        System.out.println("Que quieres hacer:\n1º Crear tabla.\n2º Borrar tabla.\n3º Insertar datos en tabla.\n4º Mostrar tablas de la base de datos.\n9º Salir.");
        String sentenciaUsarBD = "USE base_de_datos_java;";                                         // Sentencia SQL para usar la base de datos.
        PreparedStatement stUBD = (PreparedStatement) conexion.prepareStatement(sentenciaUsarBD);   // Creando la conexion para ejecuta la sentencia
        stUBD.execute();                                                                            // Ejecuntando la sentencia
        int menu = 0;
        while (menu != 9) {
            Scanner scw = new Scanner(System.in);
            menu = scw.nextInt();
            switch (menu) {
            case 1:
                String sqlCrearTabla = "CREATE TABLE ";
                String sentenciaSQLCrear = "CREATE TABLE PRUEBA1(ID INT ,NOMBRE VARCHAR(30));";
                System.out.println("Esta opción por defecto hace : " + sentenciaSQLCrear);
                System.out.println("Deseas usarla? Si o No");
                String menu2 = scw.next();
                if (menu2.equals("Si")) {
                    PreparedStatement st = (PreparedStatement) conexion.prepareStatement(sentenciaSQLCrear);
                    st.execute();
                    // Parece ser que cada vez que se ejecuta una sentencia sin error cierra el programa
                } else {
                    System.out.println("Que tabla desea crear?");
                    String nuevaTabla = sc.next();
                    System.out.println("Que columnas desea crear en la tabla: " + nuevaTabla);
                    String nuevaColumna = sc.next();
                    sentenciaSQLCrear = sqlCrearTabla + nuevaTabla + nuevaColumna;
                    System.out.println(sentenciaSQLCrear);
                }
                scw.close();
                break;
            case 2:
                String sentenciaSQLBorrar = "DROP TABLE PRUEBA1;";
                PreparedStatement str = (PreparedStatement) conexion.prepareStatement(sentenciaSQLBorrar);
                str.execute();
                scw.close();
                break;
            case 3:
                String sentenciaSQLInsertar = "INSERT INTO prueba1 VALUES(987654321,'Alex');";
                PreparedStatement stcf = (PreparedStatement) conexion.prepareStatement(sentenciaSQLInsertar);
                stcf.execute();
                scw.close();
                break;
            case 4:
                String sentenciaSQLMostrar = "SHOW TABLES FROM base_de_datos_java;";
                PreparedStatement stm = (PreparedStatement) conexion.prepareStatement(sentenciaSQLMostrar);
                stm.execute();
                ResultSet rs = stm.executeQuery();
                int num3 = 0;
                System.out.println("Tablas de la base de datos");
                while (rs.next() == true) {
                    num3++;
                    System.out.println(rs.getString(num3));
                }
                scw.close();
                break;

            default:

                break;
            }
            System.out.println("\nQue quieres hacer?\n1º Crear tabla.\n2º Borrar tabla.\n3º Insertar datos en tabla.\n4º Mostrar tablas.\n9º Salir.");
        }

    } catch (SQLException e) {
        System.out.println(e.getMessage());
    } catch (Exception e) {
        System.out.println(e.getMessage());
    }
}

2 个答案:

答案 0 :(得分:0)

从堆栈跟踪看,它看起来像是在以下行中失败:

menu = scw.nextInt();

Here's扫描程序类的nextInt方法的javadoc,这就是它所说的:

  

抛出: NoSuchElementException - 如果输入已用尽

因此,您的代码正在尝试从integer读取Scanner,但没有任何内容可供阅读,可能是因为Scanner已经读取了所有输入令牌。当您使用next() method阅读令牌时通常会出现这种情况。它从Scanner读取令牌但不advance。如果您想要readadvance扫描仪,则需要使用nextLine()代替next()

P.S。这与您的PrepearedStatement逻辑无关。

答案 1 :(得分:0)

我改了很多代码...... 现在每个preparedStatment都在一个不同的try catch循环中,如果它崩溃它只是继续运行。 我正在关闭扫描仪,这在某些时候是问题所在。 它运行良好。