HTTP 500 - java.lang.NullPointerException

时间:2014-07-07 07:06:27

标签: java jsp servlets

我正在开展一个网络项目。我对此很新。在编译我的servlet时,我得到了一个错误(HTTP 500 - java.lang.NullPointerException)。

请帮帮我。

我的错误消息是

 java.lang.NullPointerException
    at aexam.doGet(aexam.java:47)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(WsFilter.java:51)
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
    at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
    at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:502)
    at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
    at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:100)
    at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:953)
    at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
    at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
    at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1041)
    at     org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:603)
    at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
    at java.lang.Thread.run(Unknown Source)

这是我的servlet代码:

import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* Servlet implementation class aexam
*/
@WebServlet("/aexam")
public class aexam extends HttpServlet {
private static final long serialVersionUID = 1L;
Statement ps=null;  
ResultSet rs=null;

/**
 * @see HttpServlet#HttpServlet()
 */
public aexam() {
    super();
    // TODO Auto-generated constructor stub
}

/**
 * @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
 */
protected void doGet(HttpServletRequest req, HttpServletResponse res) throws                    ServletException,IOException {
    // TODO Auto-generated method stub
    PrintWriter pw=res.getWriter();

    String dt=req.getParameter("date");
    String tim=req.getParameter("time");
    String pap=req.getParameter("paper");
    String dur=req.getParameter("duration");
    String ky=req.getParameter("key");
    String paper=pap.replace("\\","\\\\");
    pw.println(dt+"<br>"+tim+"<br>"+pap+"<br>"+dur+"<br>"+ky+"<br>"+paper);
    FileReader f1=new FileReader(paper);
    BufferedReader br1=new BufferedReader(f1);
    res.setContentType("text/html");
    int i=0;
    try
    {
    Class.forName("com.mysql.jdbc.Driver");
    Connection con=DriverManager.getConnection("jdbc:mysql://localhost:3306/ocp2","root",             "");          
    ps=con.createStatement();
    //pw.println("hello");
    String s=br1.readLine();
    //pw.println(s);
    //String sfname=req.getParameter("sfname");

    do
    {
        i++;
        //pw.println(i);

        String ans[]=s.split(",");
        //pw.println("insert into key(qno,ques,ch1,ch2,ch3,ch4) values                                           ("+i+",'"+ans[0]+"','"+ans[1]+"','"+ans[2]+"','"+ans[3]+"','"+ans[4]+"')");
        ps.executeUpdate("insert into keyset values         ("+i+",'"+ans[0]+"','"+ans[1]+"','"+ans[2]+"','"+ans[3]+"','"+ans[4]+"',to_date('"+dt+":"+tim+"','DD.MM.YYYY:HH24:MI:SS'))");

    }while((s=br1.readLine())!=null);
    con.commit();
    pw.println("<html><head></head><body><center><h1>Thank You</h1></center></body></html>");
    }
    catch(Exception e)
    {
        System.out.println(e);
    }
}


/**
 * @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
 */
protected void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException,   IOException {
    // TODO Auto-generated method stub
}

}

4 个答案:

答案 0 :(得分:0)

看起来前面缺少一个参数,你试图进入servlet。

答案 1 :(得分:0)

看起来像     FileReader f1=new FileReader(paper); 这会导致NPE。请检查文件名。

答案 2 :(得分:0)

NPE在FileReader f1=new FileReader(paper);投掷 最好确保'paper'不是空字符串并且是正确的路径

答案 3 :(得分:0)

由于您不熟悉servlet,首先要提几个技巧。

检查字段是否为null,然后使用字段名称给出错误。这种“快速失败”程序可以加快开发速度。

不要使用字段(psrs),可以重用已创建的servlet实例。

然后还声明psrs尽可能接近其用法。关闭所有。

使用PreparedStatement。在这里你冒着SQL注入黑客的风险。它使转义字符串(单引号,反斜杠,空值,日期时间)更简单。

这使得以下多余:

String paper=pap.replace("\\","\\\\");

我猜想没有给出paper参数,pap为空。 检查堆栈跟踪中的行号,以获取具有NullPointerException的确切行。

FileReader是一个实用程序类(仅供本地使用),它使用默认的操作系统编码进行读取。在Linux下,现在很可能是UTF-8。如果你在Windows下开发它是不同的。

new InputStreamReader(new FileInputStreeam(file), StandardCharsets.UTF_8)
new InputStreamReader(new FileInputStreeam(file), "Windows-1252")

提供文件也存在安全风险。即使在小型网站上也会发生黑客攻击。