簡體   English   中英

錯誤:java項目的NullPointerException,如何解決?

[英]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();

我得到了頂部導航欄,但沒有信息。它太奇怪了。我猜它不是連接數據庫,也許當我嘗試使用指向內存中沒有位置的引用時出現(null),好像它引用了一個賓語。 但我找不到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();關閉它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”。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM