当前位置: 首页 > 知识库问答 >
问题:

为什么我会在文件结束时收到此错误?

刘成礼
2023-03-14

我试图解析一个XML响应,但我失败得很惨。我最初认为xml只是没有在响应中返回,因此我通过直接链接到我的xml在线文件,精心编制了下面的代码。我能够毫无问题地将XML打印到屏幕上。然而,当我调用我的解析方法时,我得到了文件的过早结束。

如果我直接传递URL,它会起作用:

  • builder.parse ("");

但当我传递InputStream时失败:

>

  try {
    URL url = new URL(xml);
    URLConnection uc =  url.openConnection();
    HttpURLConnection  connection = (HttpURLConnection )uc;

    connection.setDoInput(true);
    connection.setDoOutput(true);

    InputStream instream;
    InputSource source;
    //get XML from InputStream
    if(connection.getResponseCode()>= 200){
        connection.connect();       
        instream = connection.getInputStream();         
        parseDoc(instream);     
    }
    else{
        instream = connection.getErrorStream();
    }


} catch (MalformedURLException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (IOException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (ParserConfigurationException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} catch (SAXException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}



 static void parseDoc(InputStream instream) throws ParserConfigurationException,
 SAXException, IOException{


  BufferedReader buff_read = new BufferedReader(new InputStreamReader(instream,"UTF-8"));
    String  inputLine = null;

    while((inputLine = buff_read.readLine())!= null){
        System.out.println(inputLine);
    }

  DocumentBuilderFactory factory =DocumentBuilderFactory.newInstance();
  factory.isIgnoringElementContentWhitespace();
  DocumentBuilder builder = factory.newDocumentBuilder();
  Document doc = builder.parse(instream);
}

我得到的错误:

    [Fatal Error] :1:1: Premature end of file.
org.xml.sax.SAXParseException: Premature end of file.
    at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(Unknown Source)
    at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(Unknown Source)
    at javax.xml.parsers.DocumentBuilder.parse(Unknown Source)
    at com.ameba.api.network.MainApp.parseDoc(MainApp.java:78)
    at com.ameba.api.network.MainApp.main(MainApp.java:41)

共有3个答案

解鸿运
2023-03-14

对于那些到达此职位寻求答案的人:

发生这种情况主要是因为DOM解析器正在使用的InputStream是空的

所以在我遇到的情况中,可能有两种情况:

  1. 传递到解析器的InputStream已被使用,因此被清空
  2. 文件或创建InputStream的任何内容可能是空文件或字符串或其他内容。空虚可能是造成问题的原因。所以您需要检查InputStream的源代码
阎修杰
2023-03-14

您会得到错误,因为SAXBuilder不够智能,无法处理“空白状态”。所以它至少寻找一个

祁奇略
2023-03-14

当你这样做的时候,

while((inputLine = buff_read.readLine())!= null){
        System.out.println(inputLine);
    }

你消耗了流内的一切,所以流内是空的。现在,当我们尝试这样做时,

Document doc = builder.parse(instream);

解析将失败,因为您向它传递了一个空流。

 类似资料:
  • 问题内容: 我在代码的第34行上不断收到LineUnavailableException:https://www.refheap.com/21223 错误显示为。 我正在创建Sound类的多个实例(在我的refheap粘贴中实现)。似乎最初的实例没有问题。但是,当我开始使用相同的音频文件制作Sound对象的新实例时,便开始出现此错误。 知道如何解决吗? EIDT:我认为这个问题的 想法可能是我需要

  • 问题内容: ABstractMethodError的可能原因是什么? 线程“ pool-1-thread-1”中的异常java.lang.AbstractMethodError: 问题答案: 简单的答案是这样的:一些代码试图调用一个声明的方法。抽象方法没有主体,无法执行。由于您提供的信息很少,因此我无法真正详细说明如何发生这种情况,因为编译器通常会遇到此问题- 如此处所述,这意味着该类必须在运行时

  • 问题内容: 尝试在Java应用程序中实现简单的JDBC查询时遇到一些问题。 所以我有以下查询: 如果将其运行到 Oracle SQL Developer中, 它将运行良好,并获得2条记录。 因此,我必须将此查询实现到应用程序的DAO类中,在其中定义了以下方法: 问题是,当我尝试执行上述方法时,将引发以下 SQLException : 为什么?我认为这可能是SQL语法中的问题,但是我对此不太确定(因

  • 问题内容: 为什么在代码的指定位置出现ConcurrentModificationException?我无法弄清楚自己在做什么错… 正在使用该方法在列表中找到分钟,将其删除并返回其值 问题答案: 一旦修改了从其获得的Collection,则不应认为Iterator可用。(对于java.util.concurrent。*集合类,放宽了此限制。) 您首先要获得一个Iterator ,然后进行修改。修改

  • 很抱歉,我对Java知之甚少。我得到了这个代码来接管。基本上,我在 当我运行代码时。 下面是解析XML的块 这是Improts,不确定是否需要这样做 这是XML文件

  • 问题内容: 我已经找到了这段代码,无法找出解决方法。在运行代码时,为什么不提示用户输入而不是Java确定没有输入?错误跟踪如下。 这是错误- 问题答案: 简单的答案是当您关闭扫描仪时- 基础输入流也会关闭:http : //docs.oracle.com/javase/7/docs/api/java/util/Scanner.html#close() 要修复此问题,请在主菜单中创建一次: