Зацикливание try / catch - PullRequest
       2

Зацикливание try / catch

0 голосов
/ 25 декабря 2018

Я пытаюсь взять два случайных rowid из моей базы данных.Все работает, но у меня есть сценарий, когда есть только один rowid.Я хочу сделать цикл на моем try / catch, пока в моей базе данных не появится второй номер.Что я делаю не так?Спасибо

  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());

        }
    }

Прямо сейчас моя программа зацикливается два раза и затем дает мне SQLException.Как я могу зациклить мою программу, пока не будет SQLException?

Ответы [ 3 ]

0 голосов
/ 25 декабря 2018

Логика становится проще, если вы добавляете значения в список

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

Преимущество состоит в том, что вы можете извлечь одно значение в первом запросе к базе данных и второе в последующем или оба втот же раунд, и вам не нужно отслеживать, какую из двух переменных использовать.

(Имейте в виду детали синтаксиса, я не программист на Java.)

0 голосов
/ 26 декабря 2018

ОК, я пытался написать то, что, по-моему, вы пытаетесь сделать.Вы ждете вечно, пока кто-нибудь не поместит хотя бы две записи в базу данных.Вы извлекаете два значения, обрабатываете их, затем ждете еще.

Некоторые моменты, на которые следует обратить внимание: 1. Сравнение объектов должно быть сделано с .equals(), а не с == 2. Возможно, вы захотите предоставить некоторыеспособ вырваться из бесконечного цикла, который я написал (while(true)).3. Осторожно с null значениями.Они могут произвести NullPointerException.4. Попробуйте разбить ваш код на методы.Каждый большой блок кода может входить в каждый собственный метод.

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();
        }
    }
}
0 голосов
/ 25 декабря 2018

Как я могу зациклить свою программу, пока не возникнет исключение SQLException?

Измените это (потому что это позволит зацикливаться только два раза)

for (a = 0; a < 2; a++) {

на

while(true)

Поместите все внутри while(true), если возникла исключительная ситуация, то она выйдет из цикла while.Нечто подобное:

try
{
  while(true)
  {
  ...
  ...
  }
  ...
}
catch(SQLException e)
{
    // do somthing
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...