Spring 从数据库解析数据时返回 NullPointerException

Spring returning NullPointerException when parsing data from Database

我有一个代码片段

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

中的值

new 创建字符串不能解决问题。因为,它不是导致 NullPointerException 而是代码行下方

List<String> merchantList = null;

你没有在任何地方创建 ArrayList 并直接开始使用它们。

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

上面的代码行 merchantList 仍然指向 null 引用。所以,你需要在使用它们之前创建一个 ArrayList 的实例

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

此外,您应该还原以下代码

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

 rs.getString("MerchantName")

因为不需要创建 new 字符串对象。