Java Servlet在为doGet()调用存储过程引发异常时出错

Java Servlet在为doGet()调用存储过程引发异常时出错,java,database,servlets,Java,Database,Servlets,有人知道如何修复以下错误吗 未报告的异常javax.naming.NamingException;必须被抓住或宣布被抛出 Context Context=新的InitialContext() Auth.java:46:未报告的异常java.sql.SQLException;必须捕获或声明为抛出conn=ds.getConnection() 我从这个JavaServlet中得到了什么 import javax.servlet.http.HttpServlet; import javax.servl

有人知道如何修复以下错误吗

未报告的异常javax.naming.NamingException;必须被抓住或宣布被抛出
Context Context=新的InitialContext()

Auth.java:46:未报告的异常java.sql.SQLException;必须捕获或声明为抛出conn=ds.getConnection()

我从这个JavaServlet中得到了什么

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;

public class ABC extends HttpServlet {

  @Override
  public void init(ServletConfig config) throws ServletException {
    super.init(config);
  }

  protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {

    Connection conn;
    CallableStatement cs;

    String xy = req.getParameter("xy");
    String zz = req.getParameter("zz");

    // call stored procedure
    Context context = new InitialContext();
    DataSource ds = (DataSource)context.lookup("jdbc/mypool");
    conn = ds.getConnection();
    cs = conn.prepareCall( "{call mysproc (?,?)}" );
    cs.setString(1, xy);
    cs.setString(2, zz);
    cs.execute();

    if ( conn != null ) {
      try { conn.close(); } catch ( Exception ex ) {}
      conn = null;
    }

    // Set the content type (MIME Type) of the response.
    res.setContentType("text/html");

    // Write the HTML to the response
    PrintWriter out = res.getWriter();
    out.println("<html>");
    out.println("<head>");
    out.println("<title>my title</title>");
    out.println("</head>");
    out.println("<body>");
    out.println("<h2>my header</h2>");
    out.println("my body text<br/>");
    out.println("</body>);
    out.println("</html>");
    out.flush();
    out.close();
  }

  public void destroy() {  
  }         
}


它们都会产生错误,说我不能重写doGet,因为被重写的方法不会抛出Exception、SQLException或NamingException

你说得对。不能将异常添加到被重写方法的
throws
子句中

相反,将有问题的语句放在
try
/
catch
块中,并处理错误。如果没有其他内容,您可以将它们作为
ServletException
重新播放。例如:

Context context;
try {
    context = new InitialContext();
}
catch (NamingException e) {
    throw new ServletException(e);
}

你说得对。不能将异常添加到被重写方法的
throws
子句中

相反,将有问题的语句放在
try
/
catch
块中,并处理错误。如果没有其他内容,您可以将它们作为
ServletException
重新播放。例如:

Context context;
try {
    context = new InitialContext();
}
catch (NamingException e) {
    throw new ServletException(e);
}
抛出选中的异常
NamingException
,应该捕获该异常,或者使用此代码的方法应该有一个与之关联的throws子句

因为您正在扩展和重写方法,所以不能附加新的checked异常,因为这违反了Java中的重写规则

而是将代码放在try-catch块中,然后catch
NamingException

所以不是

Context context = new InitialContext();
替换为

Context context = null;
try {
    context = new InitialContext();
} catch(NamingException exp){
    //Handle Exception
}
类似地,抛出一个应捕获或重新捕获的选中异常
SQLException
,再次,您不能向doGet方法添加新的选中异常,因为重写规则必须显式捕获它

try {
    DataSource ds = (DataSource)context.lookup("jdbc/mypool");
    conn = ds.getConnection();
    cs = conn.prepareCall( "{call mysproc (?,?)}" );
    cs.setString(1, xy);
    cs.setString(2, zz);
    cs.execute();

} catch ( SQLException exp ) {
  //Handle your exception
} finally {  
  if (conn != null ) {
      try {
         conn.close(); 
      } catch(SQLException sqlExp){
         // Handle your exception     
      }
      conn = null;
    }
}
Java中的重写规则:

  • 争论决不能改变
  • 除了协变(子类型)返回之外,返回类型不能更改
  • 例外情况可以减少/消除。不得抛出新的/更广泛的已检查异常
  • 访问权限不得更严格。可以减少限制
  • 在运行时调用哪个方法取决于对象类型
抛出一个选中的异常
NamingException
,应该捕获该异常,或者使用该代码的方法应该有一个与之关联的throws子句

因为您正在扩展和重写方法,所以不能附加新的checked异常,因为这违反了Java中的重写规则

而是将代码放在try-catch块中,然后catch
NamingException

所以不是

Context context = new InitialContext();
替换为

Context context = null;
try {
    context = new InitialContext();
} catch(NamingException exp){
    //Handle Exception
}
类似地,抛出一个应捕获或重新捕获的选中异常
SQLException
,再次,您不能向doGet方法添加新的选中异常,因为重写规则必须显式捕获它

try {
    DataSource ds = (DataSource)context.lookup("jdbc/mypool");
    conn = ds.getConnection();
    cs = conn.prepareCall( "{call mysproc (?,?)}" );
    cs.setString(1, xy);
    cs.setString(2, zz);
    cs.execute();

} catch ( SQLException exp ) {
  //Handle your exception
} finally {  
  if (conn != null ) {
      try {
         conn.close(); 
      } catch(SQLException sqlExp){
         // Handle your exception     
      }
      conn = null;
    }
}
Java中的重写规则:

  • 争论决不能改变
  • 除了协变(子类型)返回之外,返回类型不能更改
  • 例外情况可以减少/消除。不得抛出新的/更广泛的已检查异常
  • 访问权限不得更严格。可以减少限制
  • 在运行时调用哪个方法取决于对象类型

用@mprabhat&@quantummechanical给出的try-catch包装SQL代码是最好的方法

如果你想知道为什么你不能

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws Exception {

。。这是因为当您重写一个方法时,有两件重要的事情需要记住

  • 重写方法可以有一个更自由的访问器。。示例:如果超类方法声明为
    受保护的int-add(…)
    ,则可以使用
    公共int-add(…)
    进行重写,反之则不可能
  • 重写方法必须声明超类异常的相同或子类型。。例如如果超类方法声明为
    public int add(),抛出IllegalArgumentException
    ,则重写方法可以具有以下语法
    public int add()抛出NumberFormatException
    ,但它不能有更广泛的语法,如
    public int add()抛出Exception

谢谢大家没有投反对票

用@mprabhat&@quantummechanical给出的try-catch包装SQL代码是最好的方法

如果你想知道为什么你不能

protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws Exception {

。。这是因为当您重写一个方法时,有两件重要的事情需要记住

  • 重写方法可以有一个更自由的访问器。。示例:如果超类方法声明为
    受保护的int-add(…)
    ,则可以使用
    公共int-add(…)
    进行重写,反之则不可能
  • 重写方法必须声明超类异常的相同或子类型。。例如如果超类方法声明为
    public int add(),抛出IllegalArgumentException
    ,则重写方法可以具有以下语法
    public int add()抛出NumberFormatException
    ,但它不能有更广泛的语法,如
    public int add()抛出Exception

谢谢大家没有投反对票

感谢QuantumMechanical,异常处理特别有用。感谢QuantumMechanical,异常处理特别有用。感谢mprabhat在您的回答中如此完整。这很有帮助!谢谢你的回答如此完整。这很有帮助!