1. Java / Говнокод #26204

    −1

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    Statement stmt = null; 
    ResultSet rs = null; 
    
    try{     
    stmt = connection.createStatement();    
    ResultSet rs = stmt.executeQuery("select * from VENDORS");   
     while(rs.next())
         {
          //тело цикла....
           }
     } 
    finally
    { 
         rs.close(); stmt.close(); 
    }

    Тимлид сказал что за такое будет руки отрывать. Что тут не так?

    Запостил: mozga, 12 Декабря 2019

    Комментарии (34) RSS

    • показать все, что скрытоvanished
      Ответить
    • Да это понятно, что с ресурсами можно, но ведь finally выполнится в любом случае. В чем тогда проблема? И порядок закрытия соблюден. То есть тут вроде нет почвы для ошибки, или это вопрос религии?
      Ответить
      • А что будет если инициализация stmt выбросит исключение? null будешь закрывать?
        Ответить
      • Траеблядь шоль?
        Ответить
      • Пипец ты тупорылый, прости за прямоту.
        Должно быть как-то так:
        Statement stmt; 
        ResultSet rs; 
        
          try{     
           stmt = connection.createStatement();     
           ResultSet rs = stmt.executeQuery("select * from VENDORS");  
           try
            { 
                while(rs.next())
                 {
                  //тело цикла....
                  }
            } 
           finally
             { 
               rs.close(); stmt.close(); 
             }
         }
          catch{e}
           MessageBox('Джава наебнулась');
        }
        Ответить
        • не мог бы пояснить смысл этого добавления?
          Ответить
          • Элементарно, Ватсон mozga!
            В блоке try..catch отлавливается исключение, если вызов фабричных методов "connection.createStatement();" и "ResultSet rs = stmt.executeQuery("select * from VENDORS"); " был неудачен. В противном случае, инструкция входит в блок try..finally, где работает с полученными экземплярами объектов и затем освобождает их.
            Ответить
            • Я вижу тут только одну проблему - это если закрытие ресурсов произойдет с исключением, вот для них может быть полезен блок try-catch.
              Ответить
              • С чего бы статься такой оказии? Если деструктор кидает исключение, это плохо.
                Ответить
                • ну на сколько я понимаю блок try не может выкинуть исключение т.к. в случае "неудачного" запроса тело цикла просто не исполнится т.е. условие цикла будет =false. Затем исполнится finally. И если в нем выкинется исключение, то следующий ресурс не будет закрыт. Т.е. rs.close() нужно поместить в еще один вложенный try-catch, чтобы последний ресурс был закрыт. Но получается уже сложная конструкция, лучше делать try-with-resources.
                  Ответить
              • показать все, что скрытоvanished
                Ответить
      • показать все, что скрытоvanished
        Ответить
    • Я бы за форматирование руки оторвал.
      Ответить
    • У вас там нет никакой ОРМ или хотя бы билдера запросов? Переменные с помощью mysql_real_escape_string() экранируете?
      Ответить
      • Билдера нет. На сколько мне известно, в Java есть несколько специальных методов в java.sql.Statement для этой задачи (экранирование). Только вот какие - не знаю.
        Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • КАКОЙ БАГОР
      Ответить
    • хибернейт, жпа и все вот это вот
      Ответить

    Добавить комментарий