Java getStacktrace返回错误的行号
TL;DR:e.getStackTrace()[0]。getLineNumber()无法按预期工作 有例外Java getStacktrace返回错误的行号,java,Java,TL;DR:e.getStackTrace()[0]。getLineNumber()无法按预期工作 有例外 org.xml.sax.SAXParseException; lineNumber: 61; columnNumber: 9; Auf Elementtyp "Test" müssen entweder Attributspezifikationen, ">" oder "/>" folgen. at com.sun.
org.xml.sax.SAXParseException; lineNumber: 61; columnNumber: 9; Auf Elementtyp "Test" müssen entweder Attributspezifikationen, ">" oder "/>" folgen.
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
at com.sun.org.apache.xerces.internal.jaxp.DocumentBuilderImpl.parse(DocumentBuilderImpl.java:339)
我想得到第一行(61和9)的行号和列号。
我试过了
获取最近异常的行号。但是,在本例中,它返回257而不是61
我已通过以下代码片段通过暴力手段提取了所需的行号:
StringWriter errors = new StringWriter();
e.printStackTrace(new PrintWriter(errors));
String str = errors.toString();
Matcher m = Pattern.compile("[^0-9]*([0-9]+)[^0-9]*([0-9]+).*").matcher(str);
if (m.matches()) {
line = Integer.parseInt(m.group(1));
pos = Integer.parseInt(m.group(2));
}
是否有更好的方法来实现期望的行为,最重要的是:
为什么返回的不是最近异常的行号,而是另一个?第一行中的
lineNumber
和columnNumber
似乎与您试图解析的XML中的某个位置有关(请参见构造函数)它返回正确的行号。这不是你要找的电话号码
e.getStackTrace()[0].getLineNumber();
这将返回引发异常的Java源代码中的行号。它不是解析失败的XML的行号
此stacktrace元素及其行号是stacktrace中第一行的:
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)
如果需要XML的行(和列),则需要使用e.getLineNumber()
(和e.getColumnNumber()
),假设e
是类型的引用,否则需要先强制转换
当试图从异常中获取特定数据时,最好先阅读API文档以查看该数据是否已公开(在SAXParseException
中就是这样),然后再使用正则表达式等工具
另外,如果您确实希望或需要从异常消息中提取数据,我建议使用e.getMessage()
而不是打印整个stacktrace。我的理解是数组包含“at”子句,而不是首字母。每个项目都是一个单独的堆栈框架,用于跟踪错误。throwable包含/表示触发错误的实际帧,跟踪将提供导致错误的帧。因此,print方法先打印可丢弃文件,然后打印跟踪文件。但是,自从我在Java 7中使用这些东西以来,情况可能发生了变化……在我看来,您似乎混淆了一些东西,SAXParseException
(61)中的行号指的是您试图解析的xml中的行号。我假设257是代码中发生异常的那一行。for printStackTrace似乎证实了我没有完全偏离目标。第一行是异常上的toString。后续行(“at…”)是堆栈跟踪元素。是的,正如达尼奥指出的,第257行是行号。你可以用NPE测试你的东西,它们在结构上更简单,没有额外的数字把东西弄乱。
at com.sun.org.apache.xerces.internal.parsers.DOMParser.parse(DOMParser.java:257)