Java getStacktrace返回错误的行号

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.

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.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)