0

任何人都知道如何解决以下错误

unreported exception javax.naming.NamingException; must be caught or declared to be thrown Context context = new InitialContext();

Auth.java:46: unreported exception java.sql.SQLException; must be caught or declared to be thrown conn = ds.getConnection();

我从这个 java servlet 得到什么?

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() {  
  }         
}

如果我尝试更换

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

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

或者

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

它们都产生错误,说我无法覆盖 doGet,因为被覆盖的方法不会抛出异常、SQLException 或 NamingException。

4

3 回答 3

2

new InitialContext()抛出一个经过检查的异常NamingException,它应该被捕获,或者您使用此代码的方法应该有一个与之关联的 throws 子句。

由于您正在扩展HttpServlet和覆盖doGet方法,因此您不能附加新的已检查异常,因为它违反了 Java 中的覆盖法则。

而是将代码放在 try catch 块和 catchNamingException中。

所以而不是

Context context = new InitialContext();

将其替换为

Context context = null;
try {
    context = new InitialContext();
} catch(NamingException exp){
    //Handle Exception
}

类似地dataSource.getConnection抛出一个应该被捕获或重新抛出的检查异常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中的覆盖规则:

被覆盖的方法

  • 参数不得更改
  • 返回类型不能改变,除了协变(子类型)返回
  • 异常可以减少/消除。不得抛出新的/更广泛的检查异常
  • 访问权限不能更严格。可以少一些限制。
  • 调用 调用哪个方法取决于对象类型,在运行时
于 2012-05-18T02:44:45.653 回答
1

你是对的。您不能向被覆盖方法的throws子句添加例外。

相反,将有问题的语句放在try/catch块中并处理错误。如果不出意外,您可以将它们重新抛出为ServletException. 例如:

Context context;
try {
    context = new InitialContext();
}
catch (NamingException e) {
    throw new ServletException(e);
}
于 2012-05-18T02:41:47.757 回答
1

用@mprabhat 和@QuantumMechanic 给出的try-catch 包装SQL 代码是最好的方法。

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

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

或者

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

..这是因为当你覆盖一个方法时 - 有两件重要的事情要记住..

  • 覆盖方法可以有一个更自由的访问器。例如:如果声明了超类方法protected int add(...),则可以用 覆盖public int add(...),反之则不行。
  • 覆盖方法必须声明超类异常的相同或子类型。例如..如果声明了超类方法public int add() throws IllegalArgumentException,那么覆盖方法可以有以下语法.. public int add() throws NumberFormatException,但不能有更广泛的语法如public int add() throws Exception.

谢谢大家不投反对票!!

于 2012-05-18T02:58:10.223 回答