为什么XmlSlurper抛出NumberFormatException?

时间:2013-07-30 18:56:16

标签: grails groovy

我从IDE启动Grails 2.1.5应用程序,并为NumberFormatException设置了异常断点(意味着每当抛出此异常时应用程序都会中断)。

如果我然后从Grails控制台执行以下代码:

import  groovy.util.*
import groovyx.net.http.*

def uri = 'http://ws.audioscrobbler.com/2.0/?artist=Yelle&mbid=f43d43c8-eedf-4628-99b0-04120e7124c8&method=artist.gettopalbums&api_key=6e331f856413a5e3dfc91ec41cea5415&limit=6'

XmlSlurper().parse(uri)

由于Long.parseLong

中的以下代码,触发了异常断点
public static long parseLong(String s, int radix)
          throws NumberFormatException
{
    if (s == null) {
        throw new NumberFormatException("null");
    }

    // rest of method omitted
}

然而,XmlSlurper().parse(uri)似乎返回了预期的值,所以我想这个异常是在某处处理的,但我无法弄清楚在哪里。我很困惑为什么Long.parseLong被调用第一个参数的空值。这是XmlSlurper中的错误还是一些奇怪的实现细节?

更新

根据要求,这是调用堆栈。我正在使用JDK 7和Groovy 1.8.8。我自己尝试过调试,但正如你所看到的,我错过了很多相关的源文件。

  at java.lang.Long.parseLong(Long.java:404)
  at java.lang.Long.parseLong(Long.java:483)
  at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:1571)
  at org.apache.xerces.impl.XMLEntityManager.setupCurrentEntity(Unknown Source:-1)
  at org.apache.xerces.impl.XMLVersionDetector.determineDocVersion(Unknown Source:-1)
  at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source:-1)
  at org.apache.xerces.parsers.XML11Configuration.parse(Unknown Source:-1)
  at org.apache.xerces.parsers.XMLParser.parse(Unknown Source:-1)
  at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source:-1)
  at org.apache.xerces.jaxp.SAXParserImpl$JAXPSAXParser.parse(Unknown Source:-1)
  at groovy.util.XmlSlurper.parse(XmlSlurper.java:146)
  at groovy.util.XmlSlurper.parse(XmlSlurper.java:212)

1 个答案:

答案 0 :(得分:4)

据我所知,this file from the OpenJDK mercurial repository是Java 7更新25中sun.net.www.protocol.http.HttpURLConnection的版本,相关摘录是

 1570     try {
 1571         cl = Long.parseLong(responses.findValue("content-length"));
 1572     } catch (Exception exc) { };

所以每当HTTP响应没有NumberFormatException标题时,Content-Length将被抛出(并立即被忽略)。