Как избежать установки переменной в инструкции try

StackOverflow https://stackoverflow.com/questions/845155

  •  20-08-2019
  •  | 
  •  

Вопрос

Моя проблема в том, что мне нужно установить переменную в операторе try, иначе я получу ошибку компиляции.

Позже мне понадобится использовать эту переменную, но сейчас она выходит за рамки, по крайней мере, я так думаю.Я инициализирую переменную вне оператора try и присваиваю ей значение null. Я думал, что тогда она может быть доступна снаружи, но все равно получаю NullPointerException.

Код приведен ниже, большая его часть удалена, чтобы облегчить чтение. Я знаю, что это плохой код, но я новичок в сервлетах и ​​просто хотел увидеть, как он работает, и все движущиеся части делают то, что должны.

Я создал еще один класс, который вызывает createDocs(...) и передает необходимые параметры, и он работает нормально.Поэтому мне интересно, почему, когда я звоню rs.getString("name") Я понимаю NullPointerException, поскольку это именно то, что я делаю из другого класса (для удобства запускаю из основного метода), и это работает так, как ожидалось.

Рассматриваемая переменная — это переменная ResultSet «rs» —

public class AgReportServlet extends HttpServlet {

    private static final long serialVersionUID = 1L;

    public AgReportServlet() {
        super();
    }

    public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        ResultSet rs = null;
        try {
            rs = docs.getDocs(con, start, end, zone, locality);
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (InstantiationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IllegalAccessException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        response.setContentType("text/xml");
        PrintWriter out = response.getWriter();
        out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
                out.println(
                        "<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");

        // I have a resultset object need to iterate through it to display the file names

        try {
            while (rs.next()) { // page through the result set

                out.println(
                        "  <tr>\n" +
                                "    <td>: " + rs.getString("name") + "</td>\n" +
                                "  </tr>\n"
                );
            }
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        out.println(
                "</table></body>\n" +
                        "</html>"
        );

        out.flush();
        out.close();
    }
}
Это было полезно?

Решение

Ваша проблема в том, что если это утверждение:

rs = docs.getDocs(con, start, end, zone, locality);

выдает исключение, тогда значение rs все еще остается null.Итак, я бы переместил цикл внутри того же блока try-catch.В качестве альтернативы вы можете проверить, является ли он все еще нулевым, прежде чем пытаться его использовать.

Однако установка значения null за пределами блока try-catch не является плохим кодом.Это именно то, что вам нужно сделать, если вы хотите, чтобы переменная rs находилась вне блока try (в том числе внутри одного из предложений catch).Ваш цикл rs while, вероятно, должен находиться в одном и том же блоке try.

Другие советы

То, как вы объявляете переменную rs и первый блок try/catch, в порядке.

Просто после первой попытки/ловли нужно помнить, что rs будет все еще быть нулевым, если при первой попытке/перехвате произошла ошибка.Поэтому просто убедитесь, что вы проверили rs на ноль, прежде чем пытаться получить к нему доступ.

Почему бы вам просто не добавить

if(rs != null)

до

while(rs.next())

Это должно помочь (насколько я понимаю)

Спасибо всем за вашу помощь.Сначала вы помогли мне определить, что должно быть выброшено какое-то исключение.Когда я посмотрел на консоль Tomcat, я увидел, что это ошибка класса, не финансируемого для соединителя MySQL.Я включил это в свой проект, но не в сам проект — я просто лениво ссылался на него в своем каталоге lib, поэтому в конечном итоге исключение вызвало проблему, но использование ваших предложений, таких как if(rs != null), помогло мне получить к первопричине.

Сначала я думал, что это как-то связано с тем, что переменная находится вне области видимости.Ясно, что это было не то.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top