문제

내 문제는 시도 문서에서 변수를 설정해야한다는 것입니다. 그렇지 않으면 컴파일 오류가 발생합니다.

나중에 나는 그 변수를 사용해야하지만 이제는 범위를 벗어났습니다. 나는 try 문 외부의 변수를 초기화하고 그것을 null로 설정했다. 나는 그것이 외부에 액세스 할 수 있다고 생각했지만 여전히 NullPointerException.

코드는 아래에 있으며, 읽기가 더 쉬워지기 위해 많은 것을 가져 왔습니다. 나는 그것이 나쁜 코드라는 것을 알고 있지만, 나는 서블릿을 처음 접했고, 모든 움직이는 부분이 그들이 예상되는 일을하는 것을보고 싶었습니다.

Createocs (...)를 호출하고 필요한 매개 변수를 통과하는 다른 클래스를 만들었으며 잘 작동합니다. 그래서 그것이 내가 전화 할 때 왜 호기심을 불러 일으킨다 rs.getString("name") 나는 얻는다 NullPointerException, 이것은 내가 다른 클래스에서하는 일 (편의를위한 주요 방법에서 실행)이며 예상대로 작동합니다.

문제의 변수는 결과 세트 변수 "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. 그래서 내가 할 일은 루프를 동일한 트라이 캐치 블록 내부로 옮기는 것입니다. 또는 사용하기 전에 여전히 Null인지 확인할 수 있습니다.

시도 캐치 블록 외부에서 값을 널로 설정하는 것은 나쁜 코드가 아닙니다. Try Block 외부의 RS 변수를 원한다면 (캐치 클로즈 중 하나 내부에 포함). RS While Loop은 아마도 같은 시도 블록 내에 있어야합니다.

다른 팁

RS 변수를 선언하는 방식과 첫 번째 시도/캐치 블록은 괜찮습니다.

첫 번째 시도/캐치 후 Rs가 아직 첫 번째 시도/캐치에 오류가 있으면 무효가 되십시오. 따라서 액세스하려고하기 전에 RS를 테스트하십시오.

단순히 추가하지 않는 이유는 무엇입니까?

if(rs != null)

~ 전에

while(rs.next())

이것은 도움이 될 것입니다 (내가 이해하는 한)

도와 주셔서 감사합니다. 먼저 당신은 내가 어떤 종류의 예외가 발생해야한다는 것을 식별하도록 도와주었습니다. Tomcat 콘솔을 보았을 때 MySQL 커넥터에 대한 클래스 자금이 아닌 클래스라는 것을 알 수있었습니다. 프로젝트 자체에 포함되지는 않았지만 프로젝트에 포함 시켰습니다. 저는 LIB 디렉토리에서 게으르게 언급 했으므로 궁극적으로 예외는 문제를 일으켰지 만 if (rs! = null)과 같은 귀하의 제안을 사용하는 데 도움이되었습니다. 근본 원인에.

처음에는 변수가 범위를 벗어난 것과 관련이 있다고 생각했습니다. 분명히 그것은 그렇지 않았습니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top