2009-05-10 3 views
0

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

나중에이 변수를 사용해야하지만 현재 범위를 벗어났습니다. 또는 그렇게 믿습니다. try 문 외부에서 변수를 초기화하고 null로 설정하면 외부에서 액세스 할 수 있다고 생각했지만 여전히 NullPointerException이 표시됩니다.

코드가 아래에 있습니다. 읽기 쉽도록 많은 코드가 포함되어 있습니다. 잘못된 코드 인 것을 알고 있지만, Servlets을 처음 접했고 모든 움직이는 부분이 실행되는 것을보고 싶었습니다. .

나는 createDocs (...)를 호출하고 필수 매개 변수를 전달하는 또 다른 클래스를 만들었고 올바르게 작동합니다. 그래서 그것은 제가 rs.getString("name")이라고 부르면 NullPointerException을 얻었습니다. 이것은 다른 클래스 (편의상 main 메소드에서 실행)에서했던 것과 정확히 같고 예상대로 작동합니다.

문제의 변수는 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(); 
    } 
} 
+0

코드에 저장된 XSS 취약점이있는 것으로 알고 있습니까? –

+0

나는 실제 문제는 예외가 제기 된 후에도 아무 일도 일어나지 않는 것처럼 계속 진행된다고 생각합니다.예외를 던지거나 오류를 반환하면 rs를 설정할 필요가 없습니다. 참고 : 스택 트레이스는 어디로 이동합니까? 사용자는 스택 트레이스를 볼 수 없습니다. 사용자에게 오류가 발생했음을 알리는 것이 더 친숙 할 수 있습니다. –

답변

5

귀하의 문제는이 사항이있는 경우이다 :

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

예외를 throw 다음 RS의 값이 여전히 null입니다. 따라서 루프를 동일한 try-catch 블록으로 옮기면됩니다. 또는 사용하려고 시도하기 전에 여전히 null인지 여부를 확인할 수 있습니다.

try-catch 블록 외부에서 값을 null로 설정하는 것은 나쁜 코드가 아닙니다. rs 변수를 try 블록 외부에두고 싶으면 catch 문 중 하나가 포함되도록해야합니다. 귀하의 rs while 루프는 아마도 같은 try 블록 내에 있어야합니다. 이 도움이해야

if(rs != null) 

while(rs.next()) 

전에

+0

감사합니다. cletus,하지만 rs.getString ("name")을 호출 할 때 왜 NullPointerException이 발생하는지 알고 있습니까? – Ankur

+0

귀하의 요점을 놓쳤습니다. 지금 업데이트되었습니다. 서블릿 로그를 검사하면 예외가 발생 했으므로 의심 할 여지없이 null 값이 표시됩니다. – cletus

2

왜 당신은 단순히

+0

감사합니다. 그러나이 경우 rs는 null이 아니어야합니다. 데이터가 존재하고 다른 클래스에서 메서드를 호출하면 올바르게 작동합니다. rs = docs.getDocs (con, start, end, zone, locality)와 관련하여 null이라는 사실입니다. try 문장 내에서 일어나는 것? – Ankur

+0

그래, 다른 사람들이 이미 말했듯이 rs가 try 블록 이후에 null이 아니란 것을 확신 할 수 없기 때문에 오류가있을 수 있습니다. –

4

(지금까지의 내가 그것을 이해) 당신이 변수 R을 선언하는 방법을 추가하지 마십시오 첫 번째 try/catch 블록은 ok입니다.

첫 번째 try/catch 이후에 rs가 일 때이 처음 시도/catch에 오류가있는 경우 null이된다는 것을 기억해야합니다. 따라서 액세스하기 전에 rs가 null인지 테스트하십시오.

0

여러분 모두 도와 주셔서 감사합니다. 먼저 어떤 종류의 예외가 던져 져야한다는 것을 확인하도록 도와주었습니다. Tomcat 콘솔을 보았을 때 MySQL 커넥터에 대한 클래스 기금이 아닌 클래스라는 것을 알 수있었습니다. 내 프로젝트에 포함 시켰지만 프로젝트 자체는 포함하지 않았다. lib 디렉토리에서 lazily라고 언급 했으므로 궁극적으로 예외가 발생했지만 if (rs! = null)과 같은 제안을 사용하면 도움이되었다. 근본 원인에.

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