我从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)
答案 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
将被抛出(并立即被忽略)。