2009-12-01 54 views
0

當編譯我的Java servlet代碼,我得到以下錯誤...如何讓我的Java Servlet類處理SAXException?

in javax.servlet.http.HttpServlet; overridden method does not throw org.xml.sax.SAXException 

在我重寫的doGet()函數,我使用JAXP處理XML這顯然需要我來處理SAXExceptions。但是當我將「SAXExeption」添加到異常類型列表中時,我希望我的doGet函數能夠處理,我得到了上述錯誤。我怎樣才能讓我的doGet函數掛起SAXExcpetions?

在此先感謝您的幫助!

回答

4

您不能聲明覆蓋方法,該方法會拋出未被覆蓋方法拋出的已檢查異常。換句話說,由於HttpServlet.doGet()被聲明爲引發IOException和ServletException,因此不能在doGet方法的throws子句中使用任何其他異常類型。

但是,你可以用了,你得到的將的ServletException的SAXException來解決這個問題:

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException { 
    try { 
     JAXP.possiblyThrowASAXException(); 
    } catch (SAXException e) { 
     throw new ServletException("JAXP had a parsing failure", e); 
    } 
} 
0

我同意@大衛溫斯洛答案

當你拋出一個異常HttpServlet的doGet方法基本上會拋棄你的手,並放棄任何明智的錯誤處理。

它可能是更好的方法來捕獲SAXException,併發出一個錯誤,提供有用的信息。

客戶端是否在XML中獲取信息?如果是這樣,你應該回應一個明智的錯誤,告訴他們他們的XML是不正確的。

此錯誤是由服務器端加載的內容引起的嗎?如果是,那麼get就有一個基本的問題,用戶應該得到適當的消息。

1

當父類聲明拋出一個檢查的異常時,子類必須至少拋出相同的檢查異常來完成父類的契約。反過來說,子類方法不必聲明爲拋出任何異常,但不能聲明拋出一個檢查的異常,即父類方法未聲明爲拋出。

爲了說明這一點,讓我們假設你有以下類:

package test; 

import java.io.IOException; 

public class Parent { 
    void foo() throws IOException { 
     throw new IOException(); 
    } 
} 

這將編譯:

package test; 

class Child1 extends Parent { 
    void foo() { 
    } 
} 

但這並不:

package test; 

import org.xml.sax.SAXException; 

class Child2 extends Parent 
{ 
    void foo() throws SAXException { 
     throw new SAXException(); 
    } 
} 

javac編譯器會生成以下輸出:

test/Child2.java:6: foo() in test.Child2 cannot override foo() in test.Parent; overridden method does not throw org.xml.sax.SAXException 
    void foo() throws SAXException { 
     ^
1 error 

換句話說,你不能這樣寫:

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException, SAXException { 
    super.doGet(req, resp); 
    ... 
} 

你必須處理在doGet()方法SAXException,如果你想重新拋出來包裝它在一個ServletException

@Override 
protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
     throws ServletException, IOException { 
    super.doGet(req, resp); 

    try { 
     // code that possibly throws a SAXException 
     ... 
    } catch (SAXException e) { 
     // handle it or rethrow it as ServletException 
     ... 
    } 
} 
+0

這是對我所說的(很多)更好的解釋。 – 2009-12-01 12:39:29