2009-12-01 8 views
0

내 자바 서블릿 코드를 컴파일, 나는 ... 내 오버라이드 (override)의 doGet() 함수에서Java Servlet 클래스가 SAXException을 처리하도록하려면 어떻게해야합니까?

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

, 나는 JAXP 분명히 SAXExceptions을 처리하기 위해 저를 필요로 XML을 처리하는 데 사용하고 다음과 같은 오류가 발생합니다. 그러나 "SAXExeption"을 예외 유형 목록에 넣으면 doGet 함수를 처리 할 때 위의 오류가 발생합니다. doGet 함수로 SAXExcpetions를 처리하려면 어떻게해야합니까?

미리 감사드립니다.

답변

4

오버라이드중인 메서드에 의해 throw되지 않는 체크 된 예외를 throw하는 재정의 메서드를 선언 할 수 없습니다. 즉, HttpServlet.doGet()이 IOException 및 ServletException을 throw하는 것으로 선언되었으므로 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을 잡아두고 유용한 정보를 제공하는 오류를내는 더 나은 방법 일 것입니다.

클라이언트가 get에서 정보를 XML로 전송하고 있습니까? 그렇다면 XML이 올바르지 않다고 말하는 현명한 오류로 응답해야합니다.

이 오류는 서버 쪽에서로드 된 오류로 인해 발생합니까? 그렇다면 get에 기본적인 문제가 있으며 사용자는 그에 대한 적절한 메시지를 얻어야합니다.

1

부모 클래스가 확인 예외를 throw하도록 선언하면 하위 클래스는 부모 클래스의 계약을 이행하기 위해 최소한 동일한 확인 예외를 throw해야합니다. 반대로, 자식 클래스 메서드는 예외를 throw하도록 선언 할 필요는 없지만 부모 클래스 메서드가 throw하도록 선언되지 않은 확인 된 예외를 throw하도록 선언 할 수는 없습니다.

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

이것은 내가 무엇을 말하고 있는지 (훨씬) 더 나은 설명입니다. –

관련 문제