Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/384.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 什么';我的请求有什么问题吗?_Java_Servlets - Fatal编程技术网

Java 什么';我的请求有什么问题吗?

Java 什么';我的请求有什么问题吗?,java,servlets,Java,Servlets,我有一个表格,上面有一个doPost: <form id="frmData" name="frmData" action="ProcessReg" method="post"> <td>Full Name</td> <td><input type="text" id="stFullName" name="stFullName" value=""></td> 还有我的servlet: publ

我有一个表格,上面有一个doPost:

<form id="frmData" name="frmData" action="ProcessReg" method="post">            
  <td>Full Name</td>
  <td><input type="text" id="stFullName" name="stFullName" value=""></td>
还有我的servlet:

public class ProcessReg extends HttpServlet {

  protected void doGet(HttpServletRequest request, HttpServletResponse response)   
     throws ServletException, IOException {
    processRequest(request, response);
  }

  protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    processRequest(request, response);
  }

  protected void processRequest(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    response.setContentType("text/html;charset=UTF-8");
    PrintWriter out = response.getWriter();

    PreparedStatement ps = null;
    Connection con = null;
    ResultSet rs = null;
    Statement stmt = null;

    String strName = "";

   strName = request.getParameter("stFullName");

   try {
     DBConnect a = new DBConnect();
     stmt = (Statement) DBConnect.getConnection();                   
     rs = stmt.executeQuery("SELECT * FROM members");
我希望有人能告诉我哪里出了问题,因为在它完美运行之前,我真的很迷茫哪里出了错误

完整堆栈跟踪:

SEVERE: Servlet.service() for servlet [ProcessReg] in context with path [/Web1] threw  exception
    java.lang.NullPointerException
at ProcessReg.processRequest(ProcessReg.java:86)
at ProcessReg.doPost(ProcessReg.java:32)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:647)
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.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:99)
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:1023)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908)
at java.lang.Thread.run(Thread.java:619)
和我的DBConnect.java:

  public class DBConnect {

  private static Connection con;

  public static void createConnection(String dbUrl,String dbusername,String      dbPassword){
    try {
        Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
        con = DriverManager.getConnection("jdbc:odbc:practODBC, 231, abc");     
    } catch (Exception ex) {
    }    
}

    public static Connection getConnection(){
    return con;
}

   public static void closeConnection(){
    if(con!=null){
        try {
            con.close();
        } catch (SQLException ex) {
        }
    }

问题出在
ProcessReg
的第86行,您试图调用一个对象上的方法,但是您对该对象的引用==
null
,因此出现错误

找到该引用,并确定它在控制流中的该点处是否为
null
。如果是错误,请修复它。如果它不是一个错误,在使用它调用该对象上的方法之前,请等待将其设置为指向一个对象

更新

现在您已经发布了DBConnection的代码,很明显您的代码存在很多问题。我将尝试指出主要的方面,但作为旁白,我郑重建议在继续编写诸如servlet等相对复杂的功能之前,先复习一下Java基础知识

ProcessReg中的问题

您正在调用
getConnection()
并返回
con
,但尚未初始化
con
,因此您只返回一个
null
引用

然后,您正试图将从
getConnection()
返回的
连接
引用强制转换为
语句
类型。这将抛出一个
ClassCastException
。相反,您需要对返回的
连接
对象引用调用
createStatement()

DbConnect
上的所有方法都是静态的(请参见下文-您应该重构它),因此您正在实例化一个毫无意义的DbConnect对象
a
,然后显然从未使用过它

DBConnect中的问题

您有一个静态字段
con
,以及修改/访问它的静态方法。不要这样做。将
con
设为实例变量,并将初始化塞进DBConnect构造函数中-类似如下:

public class DBConnect {

    private Connection con;

    public DBConnect() {
        // setup con
    }

    public Connection getConnection() {
        return con; // con is never null because it's been initialised in constructor
    }

    ...
然后,在
ProcessReg
中,实例化一个
DBConnect
对象,并通过调用
getConnection()
获取它所包装的
Connection
对象,类似如下:

PreparedStatement ps = null;
Connection con = null;
ResultSet rs = null;
Statement stmt = null;

String strName = "";

strName = request.getParameter("stFullName");

try {
     DBConnect dbConnect = new DBConnect();
     con = dbConnect.getConnection();
     stmt = con.createStatement();                   
     rs = stmt.executeQuery("SELECT * FROM members");

问题是
publicstaticconnection getConnection()
方法返回一个空连接,因为您从未调用
createConnection()
它实际加载驱动程序并创建连接对象。在返回
DBConnect
类中的
con
对象之前,需要修复
getConnection()
以调用
createConnection()

检查
null

if (stmt != null) {
    rs = stmt.executeQuery("SELECT * FROM members");
}
但是你的代码看起来很奇怪

  • 调用类DBConnect的静态方法:

    DBConnect.getConnection();
    
    那么为什么要创建这个类的对象呢

    DBConnect a = new DBConnect();
    
  • 为什么将
    getConnection()
    方法的返回值设置为
    语句的变量
    类型

    stmt = (Statement) DBConnect.getConnection();
    
  • 您将其转换为
    语句的目的是什么?只有当您的方法返回
    对象
    引用类型时,才需要它。如果返回类型是subinterface或
    语句的任何实现,则不需要强制转换。无法执行将
    连接
    转换为
    语句

  • 方法
    DBConnect.createConnection()
    不使用获取的参数。它们是硬编码的

  • 如果方法未被调用或发生异常,静态字段
    con
    将保持
    null


  • strName=request.getParameter(“stFullName”)中没有错误,在其他地方。发布完整stacktrace。发布完整stacktrace。请发布
    DBConnect.getConnection()的实现。
    。它必须返回
    null
    。我已经添加了DBConnect.java。还是那个问题吗?第86行是rs=stmt.executeQuery(“从成员中选择*);好的,所以
    stmt
    ==null,即
    DBConnect.getConnection()
    返回null,这就是您的问题。什么是
    DBConnect
    -这是您自己的类吗?看起来很可能会返回
    连接
    ,因此您对
    语句的转换一旦返回一个不为null的
    连接
    引用就会出错。请使用
    Connection.createStatement()
    取而代之。我添加了DBConnect.java。这仍然是个问题吗?@KarenGoh这里有几个问题,需要比注释更多的空间。请查看我的更新答案:)@davnicwil试图将
    连接
    引用转换为
    语句
    类型将无法编译。
    stmt = (Statement) DBConnect.getConnection();