java substring?

时间:2010-07-06 15:05:10

标签: java

我有以下代码:

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)

6 个答案:

答案 0 :(得分:4)

就像@danben所说,你需要发布错误以获得有意义的帮助。但是,查看代码时,我认为错误发生时duedatenull。您可能需要在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 - duedatenull,则等于记录中的NULL值

如果IndexOutOfBoundsException - duedate长度小于10个字符,那么数据库中的值要么不正确(如果您希望条目超过10个字符),要么甚至为空。< / p>

无论如何 - 期望duedate可能是null,空的或太短,只需在String duedate = rs.getString("duedate");后添加一些代码来处理这些情况。

答案 4 :(得分:0)

我看到了两个可能出现问题的可能性,第一个是

中的NullPointerException
duedate.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)。当然,我不知道你的专业领域究竟是什么。