2010-07-06 3 views
0

나는 다음과 같은 코드가 있습니다자바 하위 문자열?

String table; 
private DB.ConnectMAS mas=new DB.ConnectMAS(); 
java.sql.ResultSet rs1 = mas.DBquery("select * from products"); 


try{ 
String duedate = ""; 
while(rs1.next()){ 
    String duedate = rs1.getString("duedate"); 
table+="<tr><td>"+duedate.substring(1,10)+"</td></tr>"; 
} catch(java.sql.SQLException e){} 

그것은 (1,10)

나는이 잘못된 이유를 이해하려고 노력 중이 야를 duedate.substring에 오류를 던지고을?

사전

에서 감사 오류 : 모든

SEVERE: Servlet.service() for servlet POList threw exception 
java.lang.NullPointerException 
    at POList.getDetails(POList.java:126) 
    at POList.getTable(POList.java:165) 
    at POList.processRequest(POList.java:55) 
    at POList.doGet(POList.java:177) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:690) 
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:803) 
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:269) 
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:188) 
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:210) 
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:174) 
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) 
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:117) 
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:108) 
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:151) 
    at org.apache.coyote.http11.Http11AprProcessor.process(Http11AprProcessor.java:834) 
    at org.apache.coyote.http11.Http11AprProtocol$Http11ConnectionHandler.process(Http11AprProtocol.java:640) 
    at org.apache.tomcat.util.net.AprEndpoint$Worker.run(AprEndpoint.java:1286) 
    at java.lang.Thread.run(Unknown Source) 
+9

아마도 오류를 게시 하시겠습니까? – danben

답변

4

@ danben과 마찬가지로 의미있는 도움을 얻으려면 오류를 게시해야합니다. 귀하의 코드를 살펴보면, 오류시 duedatenull이라고 생각합니다. 실제로는 코드를 while 루프 내에서duedate을 사용하여 이동해야합니다.

+1

@barrowc, 지역 변수 범위 지정은 어떻게 이와 관련이 있습니까? 'duedate'는 (혼란 스럽지만 기술적으로 정확하게) 루프 이후에도 정의됩니다. –

+0

당신이 맞습니다, 선생님. – barrowc

3

첫째, 나는 rs이 코드 샘플의 10 행에 rs1해야 가정합니다. 그렇더라도 그때까지는 rs1에 선이 더 이상 남아 있지 않으므로 getStringnull을 반환하므로 다음 줄에서 NullPointerException이 발생합니다.

그렇지 않은 경우에도 반환되는 문자열 길이는 10 문자가 아니며,이 경우 substring(1,10)은 ArrayIndexOutOfBoundsException으로 실패합니다.

1

While 루프 내에 String duedate을 선언하고 있습니다. 따라서 rs1.next()이 false를 반환하면 While 루프에서 깨지고 duedate이 사라집니다 (While 루프 범위를 벗어남). While 루프의 범위 밖에서 다시 선언 한 이후 큰 문제는 없습니다. 그러나 그때까지 rs1에는 더 이상 항목이 없으므로 rs1.getString("duedate")은 null을 반환합니다. HankGay 언급처럼

당신은 While 루프 OR의 범위 전에 외부 String duedate 를 선언하거나 필요, While 루프에 table+= 이동합니다. NullPointerException의 경우

0

-duedateIndexOutOfBoundsException의 경우 기록

에서 NULL 값과 동일 null입니다 - duedate 미만 10 자, 그래서 데이터베이스의 값 중 하나입니다 부정확 (10 자 이상인 항목을 예상하는 경우) 또는 비어 있습니다.

어쨌든 - duedatenull 일 수 있으며, 너무 짧거나 공백 인 경우에만 String duedate = rs.getString("duedate"); 뒤에 코드를 추가하면됩니다.

0

나는

String duedate = rs1.getString("duedate"); 

가 값 또는 null로 설정된 경우 당신이 정말로 모르기 때문에 첫 번째

duedate.substring(1,10) 

에서 NullPointerException이있다, 두 가지 문제에 대한 잠재력을 참조하십시오. 아마도 rs1.getString (...) 호출에 반환 된 String이 없습니다.

다른 잠재적 인 문제는 duedate가 10자를 초과하지 않는지 확인하지 않는다는 것입니다.하위 문자열을 요청하면 반환 된 문자열 내에 있어야합니다.

String abc = "abc"; 
abc.substring(4, 24); 

예외, 아마 ArrayOutOfBoundsException을 던져하지만 한이 일부 예외를 던져, 그것은 적절한 것 : 예를 들어, 내가 코드를 기대.

0

첫 번째 String duedate는 불필요합니다. 변수가 루프 내부에서 다시 선언됩니다.

하지만 예외를 유발하는 부분은 사용자가 null로 되돌아 오는 양원을 확인하지 않을 가능성이 높습니다. 다음과 같이 시도하십시오 :

try{ 
while(rs1.next()){ 
String duedate = rs1.getString("duedate"); 
if (duedate==null && duedate.length()>=10) 
    table+="<tr><td>Date missing or invalid</td></tr>"; // or whatever text is appropriate 
else 
    table+="<tr><td>"+duedate.substring(1,10)+"</td></tr>"; 
} catch(java.sql.SQLException e){} 

나는 왜 당신이 duedate의 1 - 9 위치를 추출하는지 궁금합니다. 하위 문자열이 첫 번째 위치를 0으로 간주하고 두 번째 매개 변수가 포함하지 않을 첫 번째 문자라는 것을 알고 있습니까? 예를 들어, "2010-07-05"가 duedate이면 "010-07-05"가됩니다. 처음 10자를 얻으려고하면 하위 문자열 (0,10)을 원하게됩니다. 물론 나는 당신의 두려운 분야에 실제로 무엇이 있는지 모릅니다.