java - 错误 :NullPointerException for java project, 如何解决?

标签 java mysql jsp nullpointerexception tomcat7

当我运行一个简单的 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();
        }
    }
}

用户.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();

我得到了顶部导航栏,但没有信息。这太奇怪了。我猜它没有连接数据库,也许当我尝试使用指向内存中任何位置(空)的引用时也会发生这种情况,就好像它正在引用一个对象。但我找不到空值。 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 - 错误 :NullPointerException for java project, 如何解决?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40935870/

相关文章:

java - 如何加载带有数据的弹出窗口并将所选选项返回到原始表单

java - Tomcat 为每个请求重置 session

java - SMS 文本规范化

java - 如何将WildFly 10.1.0.Final设置为Linux服务?

php - 使用 PHP 将数据插入 mysql 时页面不工作

javascript - 提交表格并将其发布到主页

database - 无法从 mysqldump.exe 解析版本号

java - 在java中生成随机数的问题

java - 在指定的时间后终止 Java 中的连接

java - 如何检测支持 WebP 的浏览器以及如何为它们提供 WebP 图片?