2017-09-16 41 views
-2

分析数据时,春回的NullPointerException我有一个代码片段从数据库

String sql = "SELECT * FROM merchantlist ORDER BY TransactionCount DESC LIMIT 10"; 
    Connection conn = null; 

    try { 
     List<String> merchantList = null; 
     conn = dataSource.getConnection(); 
     PreparedStatement ps = conn.prepareStatement(sql); 
     ResultSet rs = ps.executeQuery(); 
     if (rs.next()) { 
      merchantList.add(new String(rs.getString("MerchantName"))); 
     } 
     rs.close(); 
     ps.close(); 
     return new TopMerchants(merchantList); 
    } catch (SQLException e) { 
     throw new RuntimeException(e); 
    } finally { 
     if (conn != null) { 
      try { 
      conn.close(); 
      } catch (SQLException e) {} 
     } 
    } 
} 

我一边跑这个Tomcat上得到一个异常 -

java.lang.NullPointerException 
com.cybs.impactanalysis.dao.impl.TopMerchantsDAOImpl.retrieveMerchantList(TopMerchantsDAOImpl.java:35) 
com.cybs.impactanalysis.controller.MerchantMonitoring.MerchantMonitoring(MerchantMonitoring.java:22) 
sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
java.lang.reflect.Method.invoke(Method.java:498) 
org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) 
org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:133) 
org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:116) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandlerMethod(RequestMappingHandlerAdapter.java:827) 
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:738) 
org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:85) 
org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:963) 
org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:897) 
org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:970) 
org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:861) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:620) 
org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:846) 
javax.servlet.http.HttpServlet.service(HttpServlet.java:727) 
org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:52) 

当我运行存储过程,我得到2行作为输出。该数据类型的配置是否正确(MERCHANTNAME列是VARCHAR(20))

我该如何解决这个问题?我试图把它在调试模式下,但我无法看到的ResultSet

+0

@Ravi改变了代码来创建一个新的字符串对象,但没有工作。 –

回答

-1

值与new创建的字符串不会解决问题。因为,它不是代替下面的代码

List<String> merchantList = null; 

你无处创建ArrayList和使用它们直接启动线造成NullPointerException

if (rs.next()) { 
     merchantList.add(new String(rs.getString("MerchantName"))); 
    } 

在的代码merchantList上面的行仍然指向null参考。所以,你需要使用它们

List<String> merchantList = new ArrayList<>(); 

而且前创建ArrayList的实例,您应将下面的代码

new String(rs.getString("MerchantName")) 

rs.getString("MerchantName") 

由于没有必要创造new字符串对象。

+0

@Prateek纳伦德拉你需要改变'if'到'while'。因为'if'只会被执行一次,并且在第一次执行时会被执行。 – Ravi