我有以下代码:
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){}
在duedate.substring(1,10)
上抛出错误我试图理解为什么这是不正确的? 提前谢谢
错误:
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)
答案 0 :(得分:4)
就像@danben所说,你需要发布错误以获得有意义的帮助。但是,查看代码时,我认为错误发生时duedate
为null
。您可能需要在duedate
循环中使用 while
移动实际的代码。
答案 1 :(得分:3)
首先,我认为rs
应该是代码示例第10行的rs1
。即便如此,我想到那时rs1
还剩下不再有行,所以getString
会返回null
,这会导致下一行出现NullPointerException。
即使不是这种情况,返回的字符串也可能不是10个字符长,在这种情况下substring(1,10)
失败并出现ArrayIndexOutOfBoundsException。
答案 2 :(得分:1)
您在While循环中声明String duedate
。因此,一旦rs1.next()
返回false,它就会从While循环中断,duedate
消失(超出While循环的范围)。没有什么大不了的,因为你再次在While循环的范围内声明它。但是,到那时,rs1
不再包含条目,因此rs1.getString("duedate")
返回null。
你需要在While循环OR的范围之前声明String duedate
在之外,就像HankGay提到的那样,将table+=
移动到While循环中。
答案 3 :(得分:0)
如果NullPointerException
- duedate
为null
,则等于记录中的NULL值
如果IndexOutOfBoundsException
- duedate
长度小于10个字符,那么数据库中的值要么不正确(如果您希望条目超过10个字符),要么甚至为空。< / p>
无论如何 - 期望duedate
可能是null
,空的或太短,只需在String duedate = rs.getString("duedate");
后添加一些代码来处理这些情况。
答案 4 :(得分:0)
我看到了两个可能出现问题的可能性,第一个是
中的NullPointerExceptionduedate.substring(1,10)
因为你真的不知道是否
String duedate = rs1.getString("duedate");
设置为值或null。也许rs1.getString(...)调用中没有返回的String。
另一个潜在问题是你永远不会检查duedate是否超过10个字符。如果你要求一个子字符串,那么它应该在返回的字符串中。例如,我希望代码:
String abc = "abc";
abc.substring(4, 24);
抛出一个异常,可能是一个ArrayOutOfBoundsException,但只要它抛出某些异常,它就是正确的。
答案 5 :(得分:0)
第一个字符串duedate是多余的。该变量在循环内重新声明。
但导致异常的部分很可能是你没有检查作为null的duedate。尝试类似:
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位置。你是否意识到substring认为第一个位置为零,而第二个参数是第一个不包含的字符?如果duedate是,例如,“2010-07-05”,这将给出“010-07-05”。如果你想获得前10个字符,你需要substring(0,10)。当然,我不知道你的专业领域究竟是什么。