подстрока Java? - PullRequest
       7

подстрока Java?

0 голосов
/ 06 июля 2010

У меня есть следующий код:

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 ]

4 голосов
/ 06 июля 2010

Как говорит @danben, вам нужно опубликовать ошибку, чтобы получить значимую помощь. Однако, глядя на ваш код, я могу представить, что duedate на момент ошибки равно null. Возможно, вам нужно переместить код, который на самом деле , используя duedate внутри цикла while.

3 голосов
/ 06 июля 2010

Прежде всего, я полагаю, rs должно быть rs1 в строке 10 вашего примера кода. Несмотря на это, я предполагаю, что к этому времени у rs1 больше не осталось строк, поэтому getString возвращает null, что приводит к исключению NullPointerException на следующей строке.

Даже если это не так, возвращаемая строка может не иметь длину 10 символов, в этом случае substring(1,10) завершается с ошибкой ArrayIndexOutOfBoundsException.

1 голос
/ 06 июля 2010

Вы объявляете String duedate в цикле while. Таким образом, как только rs1.next() возвращает значение false, оно выходит из цикла while и duedate исчезает (выходит за рамки цикла While). Ничего страшного, так как вы объявляете это снова за рамками цикла while. Однако к тому времени rs1 не содержит больше записей, поэтому rs1.getString("duedate") возвращает ноль.

Вам нужно либо объявить String duedate за пределами , прежде чем область действия цикла Loop ИЛИ, как упоминал HankGay, переместить table+= в цикл while.

0 голосов
/ 07 июля 2010

Первый струнный duedate излишен. Переменная объявляется внутри цикла.

Но часть, вызывающая исключение, скорее всего, вы не проверяете, что 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){}

Мне также интересно, почему вы извлекаете позиции 1 - 9 из duedate. Понимаете ли вы, что подстрока считает первую позицию равной нулю, а второй параметр - это первый символ, который НЕ включает? Если duedate, скажем, «2010-07-05», это даст «010-07-05». Если вы пытаетесь получить первые 10 символов, вам нужна подстрока (0,10). Конечно, я не знаю, что на самом деле в твоей новой жизни.

0 голосов
/ 06 июля 2010

Я вижу потенциал для двух возможных проблем, во-первых, исключение NullPointerException в

duedate.substring(1,10)

потому что вы действительно не знаете, если

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

было установлено значение или ноль. Возможно, в вызове rs1.getString (...) нет возвращаемой строки.

Другая потенциальная проблема заключается в том, что вы никогда не проверяете, что duedate имеет длину более 10 символов. Если вы запрашиваете подстроку, то она должна быть в возвращенной строке. Например, я бы ожидал код:

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

для создания исключения, возможно, ArrayOutOfBoundsException, но до тех пор, пока оно вызывает некоторое исключение, это будет правильно.

0 голосов
/ 06 июля 2010

В случае NullPointerException - duedate равно null, что равно значению NULL в записи

В случае IndexOutOfBoundsException - duedate меньше 10длинных символов, поэтому значение в базе данных является либо неправильным (если вы ожидаете записи с более чем 10 символами), либо даже пустым.Короче говоря, просто добавьте некоторый код позади String duedate = rs.getString("duedate"); для обработки этих случаев.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...