an error:NullPointerException for java project, how to fix it?
an error:NullPointerException for java project, how to fix it?
虽然我 运行 一个简单的 java 查询用户和密码的项目,但我抛出此错误消息:
type Exception report
message: java.lang.NullPointerException
description The server encountered an internal error that prevented it from fulfilling this request.
java.lang.NullPointerException
DB.DataBaseConnection.close(DataBaseConnection.java:34)
DB.UserDAOImpl.queryAll(UserDAOImpl.java:84)
org.apache.jsp.QueryAll_jsp._jspService(QueryAll_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
这里是QueryAll.jsp
:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="DB.*" %>
<%@ page import="java.util.*" %>
<title>QueryAll</title>
<% request.setCharacterEncoding("utf-8"); %>
<body>
<%
UserDAO userDAo=DAOFcatory.getUserDAOInstance();
//set new user
List<User> all=userDAo.queryAll();
Iterator<User> iter=all.iterator();
%>
<table border="1" bgcolor="#c0c0c0" align="center">
<tr>
<td>Id</td>
<td>Username</td>
<td>Password</td>
</tr>
<%
while(iter.hasNext()){
User user1=iter.next();
%>
<tr>
<td><%=user1.getUserid() %></td>
<td><%=user1.getUsername()%></td>
<td><%=user1.getPassword() %></td>
</tr>
<%
}
%>
</table>
这里是DataBaseConnection.java
:
package DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBaseConnection {
private final String driver = "com.mysql.jdbc.Driver";
private final String url = "jdbc:mysql:localhost:3306/javaweb";
private final String user = "root";
private final String pwd = "root";
private Connection conn;
public DataBaseConnection() {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url,user,pwd);
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return this.conn;
}
public void close(){
try {
this.conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
User.java
:
package DB;
public class User {
private int userid;
private String username;
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这里是UserDAO.java
:
package DB;
import java.util.*;
public interface UserDAO {
//query by all
public List<User> queryAll() throws Exception;
这里是UserDAOImpl.java
:
package DB;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import DB.User;
import DB.DataBaseConnection;
public class UserDAOImpl implements UserDAO{
public List<User> queryAll() throws Exception {
List<User> all = new ArrayList<User>();
String sql = "select * from user";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
try {
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
//query database
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
User user = new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
//add data to List
all.add(user);
}
rs.close();
pstmt.close();
}
catch(Exception e) {
e.printStackTrace();
throw new Exception("Erro:operation abnormal");
}
finally {
dbc.close();
}
return all;
}
这里是DAOFactory.java
:
package DB;
import DB.*;
public class DAOFcatory {
public static UserDAO getUserDAOInstance() {
return new UserDAOImpl();
}
}
然而,当我评论来自 UserDAOImpl.java
的代码时:
throw new Exception("Erro:operation abnormal");
和
dbc.close();
我得到了顶部导航栏,但没有 information.It,所以 odd.I 猜想它没有连接数据库,也许当我尝试使用指向任何位置的引用时也会发生这种情况在内存中 (null) 就好像它在引用一个对象。但我找不到空值。 userid 是不确定的,也许这是一个线索。
我认为您的连接有问题。
public DataBaseConnection() {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url,user,pwd);
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
如果 getConnection
抛出一个 SQLException
- 它可能正在做 - 当你抓住它时你离开 private Connection conn;
未初始化。当您在 this.conn.close();
处关闭它时,您是在空引用上调用 .close()
。
如果您能够在这个阶段查看正在打印的堆栈跟踪(在错误日志等中),您应该明白连接失败的原因。
以下示例演示了相同的行为:
public class Blah
{
public String hello;
public Blah()
{
try
{
fail();
hello = "hi";
}
catch (IOException e)
{
System.err.println("Exception caught!");
}
}
private void fail() throws IOException
{
throw new IOException();
}
public static void main(String[] args)
{
Blah blah = new Blah();
System.out.println(blah.hello);
}
}
因为在hello
初始化(hello = "hi";
)之前抛出异常,代码最后打印'null'。
虽然我 运行 一个简单的 java 查询用户和密码的项目,但我抛出此错误消息:
type Exception report
message: java.lang.NullPointerException
description The server encountered an internal error that prevented it from fulfilling this request.
java.lang.NullPointerException
DB.DataBaseConnection.close(DataBaseConnection.java:34)
DB.UserDAOImpl.queryAll(UserDAOImpl.java:84)
org.apache.jsp.QueryAll_jsp._jspService(QueryAll_jsp.java:100)
org.apache.jasper.runtime.HttpJspBase.service(HttpJspBase.java:70)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:439)
org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:395)
org.apache.jasper.servlet.JspServlet.service(JspServlet.java:339)
javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
这里是QueryAll.jsp
:
<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>
<%@ page import="DB.*" %>
<%@ page import="java.util.*" %>
<title>QueryAll</title>
<% request.setCharacterEncoding("utf-8"); %>
<body>
<%
UserDAO userDAo=DAOFcatory.getUserDAOInstance();
//set new user
List<User> all=userDAo.queryAll();
Iterator<User> iter=all.iterator();
%>
<table border="1" bgcolor="#c0c0c0" align="center">
<tr>
<td>Id</td>
<td>Username</td>
<td>Password</td>
</tr>
<%
while(iter.hasNext()){
User user1=iter.next();
%>
<tr>
<td><%=user1.getUserid() %></td>
<td><%=user1.getUsername()%></td>
<td><%=user1.getPassword() %></td>
</tr>
<%
}
%>
</table>
这里是DataBaseConnection.java
:
package DB;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class DataBaseConnection {
private final String driver = "com.mysql.jdbc.Driver";
private final String url = "jdbc:mysql:localhost:3306/javaweb";
private final String user = "root";
private final String pwd = "root";
private Connection conn;
public DataBaseConnection() {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url,user,pwd);
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
public Connection getConnection() {
return this.conn;
}
public void close(){
try {
this.conn.close();
}
catch (SQLException e) {
e.printStackTrace();
}
}
}
User.java
:
package DB;
public class User {
private int userid;
private String username;
private String password;
public int getUserid() {
return userid;
}
public void setUserid(int userid) {
this.userid = userid;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
}
这里是UserDAO.java
:
package DB;
import java.util.*;
public interface UserDAO {
//query by all
public List<User> queryAll() throws Exception;
这里是UserDAOImpl.java
:
package DB;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.util.ArrayList;
import java.util.List;
import DB.User;
import DB.DataBaseConnection;
public class UserDAOImpl implements UserDAO{
public List<User> queryAll() throws Exception {
List<User> all = new ArrayList<User>();
String sql = "select * from user";
PreparedStatement pstmt = null;
DataBaseConnection dbc = null;
try {
dbc = new DataBaseConnection();
pstmt = dbc.getConnection().prepareStatement(sql);
//query database
ResultSet rs = pstmt.executeQuery();
while(rs.next()) {
User user = new User();
user.setUserid(rs.getInt(1));
user.setUsername(rs.getString(2));
user.setPassword(rs.getString(3));
//add data to List
all.add(user);
}
rs.close();
pstmt.close();
}
catch(Exception e) {
e.printStackTrace();
throw new Exception("Erro:operation abnormal");
}
finally {
dbc.close();
}
return all;
}
这里是DAOFactory.java
:
package DB;
import DB.*;
public class DAOFcatory {
public static UserDAO getUserDAOInstance() {
return new UserDAOImpl();
}
}
然而,当我评论来自 UserDAOImpl.java
的代码时:
throw new Exception("Erro:operation abnormal");
和
dbc.close();
我得到了顶部导航栏,但没有 information.It,所以 odd.I 猜想它没有连接数据库,也许当我尝试使用指向任何位置的引用时也会发生这种情况在内存中 (null) 就好像它在引用一个对象。但我找不到空值。 userid 是不确定的,也许这是一个线索。
我认为您的连接有问题。
public DataBaseConnection() {
try {
Class.forName(driver);
this.conn = DriverManager.getConnection(url,user,pwd);
}
catch (ClassNotFoundException e){
e.printStackTrace();
}
catch (SQLException e) {
e.printStackTrace();
}
}
如果 getConnection
抛出一个 SQLException
- 它可能正在做 - 当你抓住它时你离开 private Connection conn;
未初始化。当您在 this.conn.close();
处关闭它时,您是在空引用上调用 .close()
。
如果您能够在这个阶段查看正在打印的堆栈跟踪(在错误日志等中),您应该明白连接失败的原因。
以下示例演示了相同的行为:
public class Blah
{
public String hello;
public Blah()
{
try
{
fail();
hello = "hi";
}
catch (IOException e)
{
System.err.println("Exception caught!");
}
}
private void fail() throws IOException
{
throw new IOException();
}
public static void main(String[] args)
{
Blah blah = new Blah();
System.out.println(blah.hello);
}
}
因为在hello
初始化(hello = "hi";
)之前抛出异常,代码最后打印'null'。