2012-05-18 43 views
0

任何人都知道如何解決以下錯誤投擲例外的doGet()的Java Servlet錯誤調用存儲過程

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。

回答

2

new InitialContext()拋出檢查異常NamingException,它要麼被捕獲或者你在哪裏使用此代碼應該有一個投與它相關條款的方法。

由於您正在擴展HttpServlet並覆蓋doGet方法,因此它不能附加新的checked異常,因爲它違反了Java中的覆蓋規則。

而是將代碼放在try catch塊中並捕獲NamingException

所以不是

Context context = new InitialContext(); 

通過

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

同樣dataSource.getConnection更換,這將引發checked異常SQLException應該被捕獲或者重新拋出,再次你不能添加新的checked exception到您的doGet方法由於重寫的規則,你必須明確地捕捉它。在Java中重寫的

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; 
    } 
} 

規則:

Overridden Method

  • 參數不能改變
  • 返回類型,除了協無法更改(亞型)返回
  • 異常可以減少/消除。不能拋出新的/更廣泛的檢查異常
  • 訪問不得限制更多。可以減少限制。
  • 調用哪個方法調用是基於對象的類型,在運行時間
+0

感謝mprabhat在答案中如此完整。這非常有幫助! – ggkmath

+0

你是最受歡迎的 – mprabhat

1

你是對的。您不能向覆蓋的方法的throws子句添加例外。

取而代之的是,將問題陳述在try/catch區塊中並處理這些錯誤。如果沒有別的,你可以重新拋出它們作爲ServletException。例如:

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

感謝QuantumMechanic,處理異常特別有用。 – ggkmath

1

用包裝紙的try-catch SQL代碼通過@mprabhat & @QuantumMechanic給出就是去..

的最佳方式

如果你想知道你爲什麼不能做

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

OR

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

謝謝大家沒有downvoting!

+0

感謝您的解釋! – ggkmath