본문 바로가기
카테고리 없음

[Java] SAXParser Exception - "[Fatal Error] :1:1: Premature end of file"

by 꼬마낙타 2019. 5. 30.
반응형

SAX 파서를 이용한 라이브러리를 사용하다가 "[Fatal Error] :1:1: Premature end of file." 혹은 "[Fatal Error] :1:1: 예기치 않은 파일의 끝입니다."라는 Exception을 만나게 되는 경우가 있다.

 

이 예외는 SAX 파서의 입력 스트림이 예기치 않게 끝났을 경우에 발생한다. 대표적으로 SAX 파서에 빈 문자열을 입력하면 발생하게 된다. 다음 예제를 살펴보자.

import java.io.StringReader;

import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;

import org.w3c.dom.Document;
import org.xml.sax.InputSource;

public class Test {

	public static void main(String []args) throws Exception {

		String xml = "";
		StringReader reader = new StringReader(xml);
		InputSource inputSource = new InputSource(reader);

		DocumentBuilderFactory facotry = DocumentBuilderFactory.newInstance();
		DocumentBuilder builder = facotry.newDocumentBuilder();

		try {
			Document doc = builder.parse(inputSource);
		} catch (Exception e) {
			/* no-op */
			e.printStackTrace();
		}
	}
}

이 코드를 보면 SAX 파서로 XML 문자열을 파싱하는 부분을 Try-Catch 구문으로 감싸서 처리한 것을 확인할 수 있다. 결국 상위로는 예외가 전파되지 않는다. 문제는 Standard Error 로 에러 메시지가 출력되는 것이다. 실제로는 예외를 잘 처리했지만 Standard Error로 에러 메시지가 출력되어 사용자가 문제로 인식할 수 있는 것이다.

 

DocumentBuilder의 parse() 메소드를 따라 들어가면 SAX 파서가 문자열을 읽어 들이다가 문제가 발생했을 때, Error 핸들러를 호출하는 것을 확인할 수 있다. 사용자가 별도의 Error 핸들러를 등록하지 않으면 DefaultErrorHandler가 호출 된다. DefaultErrorHandler의 동작이 바로 System.err 스트림으로 메시지를 출력하는 것이다. 

 

이를 방지하기 위해서 org.xml.sax.ErrorHandler 인터페이스를 구현한 클래스를 만들고, builder.setErrorHandler() 메소드로 에러 핸들러를 등록해두면 된다.

 

그게 싫다면 빈문자열등을 미리 확인하여 builder.parse() 메소드가 호출되지 않도록 처리하면 된다.

 

반응형

댓글