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サーブレットから取得しますか?

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 {

オーバーライドされたメソッドはException、SQLException、またはNamingExceptionをスローしないため、どちらもdoGetをオーバーライドできないというエラーを生成します。

4

3 に答える 3

2

new InitialContext()NamingExceptionこれをキャッチするか、このコードを使用しているメソッドに throws 句を関連付ける必要があります。

メソッドを拡張HttpServletおよびオーバーライドdoGetしているため、Java でのオーバーライドの法則に反するため、新しいチェック済み例外を添付することはできません。

代わりに、コードを try catch ブロックと catch 内に配置しますNamingException

だから代わりに

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 によって与えられたように、SQL コードを try-catch でラップするのが最善の方法です。

どうしてできないのかと思ったら

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

また

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

.. メソッドをオーバーライドするときは、2 つの重要な点に注意する必要があります。

  • オーバーライドするメソッドには、より自由度の高いアクセサーを指定できます。例: スーパー クラス メソッドが で宣言されている場合、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 に答える