Declaración de prueba / captura en bucle

Estoy tratando de tomar dos rowid aleatorios de mi base de datos. Todo funciona, pero tengo un escenario en el que solo hay un rowid. Quiero hacer un ciclo en mi intento / captura hasta que haya un segundo número en mi base de datos.
¿Qué estoy haciendo mal? Gracias

public void Kaslaimejo() {
    String sql = "SELECT rowid FROM Zaidejai WHERE Pirmas < 4 ORDER BY random() LIMIT 2";
    Integer value1 = null, value2 = null; 
    Integer judesiukas1 = null, judesiukas2 = null;

    int a = 0;
    int k = 15; // kiek kartu? Reikia infinity padaryti

    for (a = 0; a < 3; a++) {
        try {
            Connection conn = Serveris.connect();
            Statement stmt  = conn.createStatement();
            ResultSet rs = stmt.executeQuery(sql)) {
                if (rs.next()) {
                    value1 = rs.getInt("rowid");
                    if (rs.next()) {
                        value2 = rs.getInt("rowid");
                        PreparedStatement buvo = conn.prepareStatement("UPDATE Zaidejai SET Numeriukas = ? WHERE rowid = ?");
                        buvo.setInt(1, i);
                        buvo.setInt(2, value1);
                        int buvolala = buvo.executeUpdate  ();
                        PreparedStatement buvo2 = conn.prepareStatement("UPDATE Zaidejai SET Numeriukas = ? WHERE rowid = ?");
                        buvo2.setInt(1, i);
                        buvo2.setInt(2, value2);
                        int buvolala2 = buvo2.executeUpdate  ();// 
                        i++;
                    }
                System.out.println("Pirmas zaidejas" + value1); // atspausdina 1 random zaideja is duomenu bazes
                System.out.println("Antras zaidejas" + value2); // atspausdina 2 random zaideja is duomenu bazes
            }
        } catch (SQLException e) {
            a--;
            //System.out.println(e.getMessage());
        }
    }
}

En este momento mi programa se repite dos veces y luego me da SQLException. ¿Cómo puedo repetir mi programa hasta que no haya SQLException?

Respuesta 1

Bien, he tratado de escribir lo que creo que intentas hacer. Espera para siempre hasta que alguien ponga al menos dos entradas en la base de datos. Extrae dos valores, los procesa y luego espera un poco más.

Algunos puntos a tener en cuenta: 1. Las comparaciones de objetos deben hacerse con .equals()no con == 2. Es posible que desee proporcionar alguna forma de salir del bucle infinito que he escrito ( while(true)). 3. Cuidado con los nullvalores. Podrían producir NullPointerException. 4. Intenta dividir tu código en métodos. Cada gran bloque de código podría entrar en cada método propio.

public void Kaslaimejo(){
    String sql = "SELECT rowid FROM Zaidejai WHERE Pirmas < 4 ORDER BY random() LIMIT 2";
    Integer judesiukas1 = null, judesiukas2 = null;


    while(true) {

        List<Integer> values = new ArrayList<>();

        while (values.size() < 2) {
            try (Connection conn = Serveris.connect();
                 Statement stmt = conn.createStatement();
                 ResultSet rs = stmt.executeQuery(sql)) {
                if( rs.next() ){
                    Integer value = rs.getInt("rowid");
                    values.add(value);
                }
            } catch (SQLException e) {
                e.printStackTrace();
            }
        }

        try( Connection conn = Serveris.connect()) {
            PreparedStatement buvo = conn.prepareStatement("UPDATE Zaidejai SET Numeriukas = ? WHERE rowid = ?");
            buvo.setInt(1, i);
            buvo.setInt(2, values.get(0));
            int buvolala = buvo.executeUpdate  ();
            PreparedStatement buvo2 = conn.prepareStatement("UPDATE Zaidejai SET Numeriukas = ? WHERE rowid = ?");
            buvo2.setInt(1, i);
            buvo2.setInt(2, values.get(1));
            int buvolala2 = buvo2.executeUpdate  ();//
            i++;
        }catch (SQLException e) {
            e.printStackTrace();
        }

        Connection conn = Serveris.connect();

        try {
            PreparedStatement pstmt = conn.prepareStatement("SELECT Pirmas FROM Zaidejai WHERE rowid = ?");
            PreparedStatement pstmt2 = conn.prepareStatement("SELECT Pirmas FROM Zaidejai WHERE rowid = ?");
            pstmt.setInt(1, values.get(0));
            pstmt2.setInt(1, values.get(1));
            ResultSet myrsv = pstmt.executeQuery();
            ResultSet myrsv2 = pstmt2.executeQuery();


            {

                if (myrsv.next()) {
                    judesiukas1 = myrsv.getInt("Pirmas");
                    if (myrsv2.next()) {
                        judesiukas2 = myrsv2.getInt("Pirmas");
                    }

                }
                //System.out.println("Pirmo zaidejo veiksmas" + myrsv.getInt("Pirmas"));
                //System.out.println("Antro zaidejo veiksmas" + myrsv2.getInt("Pirmas"));

            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }

        if (judesiukas1.equals(judesiukas2)) // careful here. NullPointerException may happen.
        {
            try {
                PreparedStatement laim = conn.prepareStatement("UPDATE Zaidejai SET Rezultatas = ? WHERE rowid = ?"); // ble ble update reikia naudoti , o ne insert into. Insert kai sukuriame nauja kazka tik
                PreparedStatement laim2 = conn.prepareStatement("UPDATE Zaidejai SET Rezultatas = ? WHERE rowid = ?");
                laim.setString(1, "Lygiosios");
                laim.setInt(2, values.get(0));
                laim2.setString(1, "Lygiosios");
                laim2.setInt(2, values.get(1));
                int irasyk = laim.executeUpdate  (); // kodel executeupdate, o ne executequery????
                int irasyk2 = laim2.executeUpdate  (); // kodel executeupdate, o ne executequery????
                {


                }
            } catch (SQLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
            System.out.print("Lygiosios");
        } else {

            //  (1) - Rock
            //  (2)  Scissors
            //  (3) - Paper
            switch (values.get(0)){
                case 1:
                    if (judesiukas2 == 2)
                        System.out.print("Zaidejas 1 wins!");

                    else
                        System.out.print("Zaidejas 2 wins!");
                    break;
                case 2:
                    if (judesiukas2 == 3)
                        System.out.print("Zaidejas 1 wins!");
                    else
                        System.out.print("Zaidejas 2 wins!");
                    break;
                case 3:
                    if (judesiukas2 == 1)
                        System.out.print("Zaidejas 1 wins!");
                    else
                        System.out.print("Zaidejas 2 wins!");
                    break;
            }
        }

        try {
            conn.close();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
Respuesta: 2

La lógica se vuelve más fácil si agrega los valores a una lista

var values = new ArrayList<Integer>();
while (values.Count < 2) {
    try (Connection conn = Serveris.connect();
         Statement stmt  = conn.createStatement();
         ResultSet rs = stmt.executeQuery(sql))
    {
        while (values.Count < 2 && rs.next()) {
            Integer v = rs.getInt("rowid");
            values.Add(v);
        }
    } catch (SQLException e) {
    }
}
//TODO: process the values here

La ventaja es que puede recuperar un valor en la primera consulta de la base de datos y el segundo en una posterior o ambas en la misma ronda y no tiene que hacer un seguimiento de cuál de las dos variables usar.

(Tenga paciencia conmigo con los detalles de la sintaxis, no soy un programador de Java).

Respuesta: 3

Estoy usando eclipse, y cuando lo ejecuto normalmente no veo una declaración impresa en la consola, pero cuando lo ejecuto en modo de depuración, lo veo. Que esta pasando? Esto sucede solo con algunas declaraciones impresas ...

Necesito ayuda en una aplicación simple basada en Vaadin. Necesito tener una tabla vinculada a los resultados de la consulta SQL. La consulta SQL tiene un parámetro cuyo valor elige el usuario del cuadro combinado. Lo que necesito es ponerme en la mesa ...

Me gustaría tener una propiedad en catalina.properties y, en algunos casos, anularla desde la línea de comandos con -D = propvalue ¿Es esto posible? Más específicamente, me gustaría controlar el puerto de un ...

Estoy usando hibernate en mi proyecto y está yendo bien, pero mi problema es que estoy un poco confundido, es decir, voy por buen camino para escribir funciones de hibernate. A continuación pego mi bloque de código para ...