Как избежать установки переменной в инструкции try - PullRequest
0 голосов
/ 10 мая 2009

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

Позже мне нужно использовать эту переменную, но теперь она выходит за рамки, или я так полагаю. Я инициализирую переменную вне оператора try и устанавливаю ее на нуль, я думал, что тогда она может быть доступна снаружи, но я все равно получаю 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();
    }
}

Ответы [ 4 ]

5 голосов
/ 10 мая 2009

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

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

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

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

4 голосов
/ 10 мая 2009

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

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

2 голосов
/ 10 мая 2009

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

if(rs != null)

до

while(rs.next())

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

0 голосов
/ 10 мая 2009

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

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

...