JSP頁面中出現的一個異常:org.apache.jasper.JasperException: java.lang.NullPointerException

先把出現的異常情況貼出來吧:


type Exception report

messagejava.lang.NullPointerException

descriptionThe server encountered an internal error that prevented it from fulfilling this request.

exception

org.apache.jasper.JasperException: java.lang.NullPointerException
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:177)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)

root cause

java.lang.NullPointerException
	org.apache.jsp.shiyan4.DataBaseOperation_jsp.<init>(DataBaseOperation_jsp.java:31)
	sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
	sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown Source)
	java.lang.reflect.Constructor.newInstance(Unknown Source)
	java.lang.Class.newInstance(Unknown Source)
	org.apache.jasper.servlet.JspServletWrapper.getServlet(JspServletWrapper.java:172)
	org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:369)
	org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:403)
	org.apache.jasper.servlet.JspServlet.service(JspServlet.java:347)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
	org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:91)

noteThe full stack trace of the root cause is available in the Apache Tomcat/8.0.0-RC1 logs.


 

 

       爲什麼會出現這種錯誤呢?一遍又一遍的檢查自己的代碼,發現需要一個javax.servlet.http.HttpServletRequest request;的聲明,request的請求不能獲取值。加上之後,得到這上面這樣的異常:NullPointerException.

      在幾小時的掙扎中,想放棄了。。。但是,發現一個很隱祕的問題,這個潛伏在代碼中的隱患,這是不容易查看到的。那就是將request獲取值設置成全局變量。先看代碼:

<body>
<%!
	
	String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
	String DBURL = "jdbc:odbc:user" ;
	Connection conn = null ;
	//Statement stmt = null ;
	PreparedStatement stmt;
	String sql = null ;
	//ResultSet rs = null ;
	javax.servlet.http.HttpServletRequest request;
	//request.setCharacterEncoding("gb2312");
    String username=request.getParameter("username");
	//byte b[]=username.getBytes("ISO-8859-1");
	//username=new String(b);
    String password=request.getParameter("password");
 
	String address=request.getParameter("address");    
	String nation=request.getParameter("nation");                                             
	String sex=request.getParameter("sex");   
	//byte bb[]=sex.getBytes("ISO-8859-1");
	//sex=new String(bb);
	String photo=request.getParameter("photo");
	String temp=request.getParameter("age");
	
%>


        隨後,修改後嘗試,發現問題解決了。

       於是得出結論:在JSP中,獲取表單提交的值時,不能將獲取語句放在全局變量裏面,即不能放在<%!  %>之間。(注意感嘆號!),而是放在<%  %>中。

      爲了同大家交流,遂貼上所有源碼,望各位指點:

        //regedit.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*" errorPage="" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>用戶註冊</title>
<script language="JavaScript">
    	function change()
		{
			var photo = document.getElementById("photo");
			var photoImg = document.getElementById("photoImg");
			photoImg.src = photo.value;
	    }
</script>
</head>
<link rel="stylesheet" href="style.css" type="text/css" />
<body>
<div class="div1">
     <div class="div2"><h2>輸入用戶信息</h2></div>
     <form action="DataBaseOperation.jsp" method="post" name="form">
      <table align="center">
           <tr >
           		<td class="div3">用戶名</td>
         	  <td><input type="text" name="username" /></td>
           </tr>
           
           <tr >
           	<td class="div3">密碼</td>
            <td><input type="password" name="password" /></td>
           </tr>
           
           <tr>
           		<td class="div3">年齡</td>
         	  <td><input type="text" name="age" /></td>
           </tr>
           
           <tr>
           	<td class="div3">出生地</td>
            <td><input type="text" name="address" /></td>
           </tr>
            <tr>
           		<td class="div3">民族</td>
         	  <td><input type="text" name="nation" /></td>
           </tr>
           
           <tr>
           	<td class="div3">性別</td>
            <td><input  type="radio" name="sex" value="男"  />男
                <input  type="radio" name="sex" value="女"  />女</td>
           </tr>
           
           <tr>
           	<td class="div3">頭像</td>
                <td align="left">
                    <select name="photo" id="photo"  οnchange="change();">
		       <option value="images/01.gif" selected="selected">頭像一</option>
		       <option value="images/02.gif">頭像二</option>
	           </select>
                   <img id="photoImg" src="images/01.gif">
            </td>
           </tr>
           
           <tr>
                <td></td>
                <td align="left"><input type="submit" name="submit" value="註冊" />
                    <input type="reset" name="reset" value="重置" />
                </td>
           </tr>
     </table>
     </form>
</div>
</body>
</html>

      //style.css


@charset "utf-8";
/* CSS Document */

body
{
	border:0px;
	margin-top:0px;
	margin-left:0px;
    background:url(images/bg4.jpg);
}
table
{
	padding-top:5px;
	left:340px;
	padding:20px 0px 3px 20px;
	}
.div1
{
	background:url(images/bg3.jpg);
	width:900px;
    height:760px;
	text-align:center;
	margin-top:0px;
	margin-left:225px;
}
.div2
{
	margin-top:0px;
}
.div1 table tr
{
	/*line-height:30px;*/
	height:30px;}
.div3
{
	text-align:right;
}


 

    //DataBaseOperation.jsp

<%@ page contentType="text/html; charset=gb2312" language="java" import="java.sql.*" errorPage="" %>
<%@page import="java.util.*"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
<title>註冊信息</title>
</head>

<body>
<%!
	
	String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
	String DBURL = "jdbc:odbc:user1" ;
	Connection conn = null ;
	//Statement stmt = null ;
	PreparedStatement stmt;
	String sql = null ;
	//ResultSet rs = null ;
%>
<%
	//javax.servlet.http.HttpServletRequest request;
	request.setCharacterEncoding("gb2312");
        String username=request.getParameter("username");
	//byte b[]=username.getBytes("ISO-8859-1");
	//username=new String(b);
        String password=request.getParameter("password");
 
	String address=request.getParameter("address");    
	String nation=request.getParameter("nation");                                             
	String sex=request.getParameter("sex");   
	//byte bb[]=sex.getBytes("ISO-8859-1");
	//sex=new String(bb);
	//String photo=request.getParameter("photo");
	String temp=request.getParameter("age");
        if(temp==null)
        {
                 temp="";
        }
        Integer age=Integer.parseInt(temp);
	try
	{
		Class.forName(DBDRIVER) ;
	}
	catch(Exception e)
	{
	}

	try
	{
		conn = DriverManager.getConnection(DBURL) ;
	}
	catch(Exception e)
	{
	}
	try
	{
		sql="Insert into user(name,password,age,address,nation,sex) values(?,?,?,?,?,?)";
		stmt=conn.prepareStatement(sql);
		stmt.setString(1,username);
		stmt.setString(2,password);
		stmt.setInt(3,age);
		stmt.setString(4,address);
		stmt.setString(5,nation);
		stmt.setString(6,sex);
		//stmt.setString(7,photo);
		stmt.executeUpdate();
		//stmt = conn.createStatement() ;
	   // sql="Insert into user(name,password,age,address,nation,sex,images) values('"+username+"','"+password+"','"+sex+"')";
		//stmt.executeUpdate(sql);

	}
	catch(Exception e)
	{
		
	}
	
	try
	{
		stmt.close() ;
		conn.close() ;
		out.println("註冊成功!");
%>
    請記住您的註冊信息:<br />
    用戶名:<%=username%><br />
    密碼:<%=password%>   <br />
<%
	}
	catch(Exception e)
	{
		out.println("數據庫關閉失敗!!!") ;
	}
%>

</body>
</html>

//數據庫

(這個我上傳到百度雲後,給鏈接。)

功能不太完善,當時我創建的數據庫中頭像的類型是文本(Varchar)的,表單獲取的頭像的值是頭像的src,但是不知道爲什麼,存放不進去。於是,上面SQL語句中沒有插入頭像。希望大俠指點一下,在mysql數據庫中,圖像的存放時什麼類型,或者怎麼處理。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章