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
字符串对象。
我有一个代码片段
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
字符串对象。