Странное предупреждение с оператором return

#java

#java

Вопрос:

 public ResultSet getParticularEmpoyee(int empId){
        PreparedStatement  getParticular;
        ResultSet resu<
        try{
             getParticular= conn.prepareStatement("SELECT * FROM " DatabaseHelper.TABLE_NAME " WHERE EMP_ID = ? ");
             getParticular.setInt(1,empId);
             result = getParticular.executeQuery();

            // return resu<
        }catch(SQLException e){
             JOptionPane.showMessageDialog(null, e);  
        }
        return resu< // this gives the warning that result may not be initialized :)
    }
  

Приведенный выше мой код предназначен для какой-то цели, и я получаю проблему, и я не могу понять, почему это происходит 🙂
будет ли это предупреждение иметь какие-то серьезные последствия из-за того, что это просто предупреждение?
если это проблема, то, пожалуйста, скажите мне, как этого избежать!
если я помещаю оператор return в блок try, то появляется ошибка «Оператор Return отсутствует перед последней фигурной скобкой»

Комментарии:

1. Оно не инициализируется, если выдается SQLException .

2. Если генерируется исключение, локальная переменная result , возможно, никогда не была инициализирована.

3. «будет ли это предупреждение иметь какие-то серьезные последствия из-за того, что это просто предупреждение?» Это ошибка компилятора, так что да.

4. Простите меня, но, кроме технического комментария, я серьезно не понимаю смысла смайлика 🙂 в комментарии к коду.

5. Результат может никогда не инициализироваться, потому что он инициализируется в блоке try. Это должно привести к предупреждению во время компиляции. Я бы установил для него значение null при создании переменной или какое-нибудь значение, которое сообщит вам, не удался ли блок try.

Ответ №1:

Ваш результирующий набор не инициализирован, поэтому, если в try catch есть исключение, оно может быть неопределенным. Правильнее и понятнее инициализировать значением null.

Комментарии:

1. В качестве альтернативы, вы могли бы присвоить переменной значение null только в блоке catch.

Ответ №2:

Итак, вам нужно спросить себя, что произойдет, если в начале вашего try{} блока будет выдано исключение. Если это действительно произойдет, то result не будет присвоено значение, и, следовательно, вы получите это предупреждение.

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

Поскольку вы возвращаете ResultSet , вы могли бы вместо этого обработать свои результаты с помощью этого метода, и это может дать вам альтернативу возвращению null (или, возможно, пустого необязательного) employee .

Ответ №3:

Вы должны инициализировать все ответвления пути программы. Ваша переменная может обнулиться без вашего участия.

Поместите result = null; в свой блок catch.

Лучше всего, если ваша переменная является эффективной final или окончательной. Проверьте это: https://docs.oracle.com/javase/specs/jls/se8/html/jls-14.html#jls-14.4

Ответ №4:

Если запрос выдает SQLException , переменной result никогда не присваивалось значение. Какое значение оно должно иметь в этом случае?

Я бы посоветовал, чтобы ваше объявление getParticularEmployee() выдавало SQLException , и пусть это продолжается до тех пор, пока вы не достигнете метода, зависящего от пользовательского интерфейса, например, Action установленного в качестве слушателя на кнопке.

Сохранение низкоуровневой реализации свободной от высокоуровневого кода пользовательского интерфейса позволяет повторно использовать ее другими способами. Сегодня вы создаете настольное приложение для управления сотрудниками. Предположим, завтра вы захотите сделать часть его функциональности доступной через веб-службу. Отделение логики от уровня представления позволит вам создать новый интерфейс, но повторно использовать всю логику на серверной части.

У вас также проблема с ресурсами. PreparedStatement Должен быть закрыт, но вы теряете его из виду, когда возвращается ваш метод. Кроме того, его нельзя закрыть, пока вы не закончите использовать ResultSet .