gpt4 book ai didi

java - 有没有办法获取 java.util.Scanner 失败的输入文件的行号(和列号)?

转载 作者:行者123 更新时间:2023-12-01 23:44:48 25 4
gpt4 key购买 nike

当输入文件出现错误时,是否可以找出扫描器在输入文件的哪一行失败?

以下代码始终打印阅读器中的总行数,而不是发生错误的行号:

import java.io.LineNumberReader;
import java.io.StringReader;
import java.util.NoSuchElementException;
import java.util.Scanner;
import org.junit.Test;

public class ScannerTests {

static private final String text = "FUNCTION_BLOCK Unnamed_project\n\tVAR_INPUT\n\t\tUnnamed_variable1::REAL;\n\tEND_VAR\nEND_FUNCTION_BLOCK";

@Test
public void scannerLineNumberFailedTest() {

LineNumberReader reader = new LineNumberReader(new StringReader(text));

int lineNumber = -1;

try {
Scanner sc = new Scanner(reader);
sc.useDelimiter("\\s*\\b\\s*");

sc.next("(?i)FUNCTION_BLOCK");
String blockName = sc.next();
assert sc.hasNext("(?i)VAR_INPUT");
sc.next("(?i)VAR_INPUT");
String variableName = sc.next();
sc.next(":"); // line of failure - got a unexpected '::'
String type = sc.next("\\w+");
sc.next(";");
sc.next("(?i)END_VAR");
sc.next("(?i)END_FUNCTION_BLOCK");

assert "Unnamed_project".equals(blockName);
assert "Unnamed_variable1".equals(variableName);
assert "REAL".equals(type);

sc.close();
} catch (NoSuchElementException ex) {

lineNumber = reader.getLineNumber() + 1;
System.err.println("Error in line: " + lineNumber);
}

assert lineNumber == 3;
}
}

最佳答案

扫描仪不会跟踪行号或字符号。

您可以尝试使用可计算行数和字符数的自定义 FilterReader 来实现此目的,但我认为这并非在所有情况下都准确。它会告诉您扫描仪在流中走了多远,但它无法考虑到扫描仪可以在 hasNext 方法中提前读取多个字符,然后回滚并返回的事实。使用不同 next 方法读取输入。例如:

if (sc.hasNext("[A-Z ]+")) {
sc.nextInteger();

如果 nextInteger() 方法调用失败,FilterReader 报告的“当前位置”可能会超过流许多字符检测到坏整数的位置。

在最坏的情况下,这种回绕可能会让您回到行边界...取决于您如何配置分隔符。因此(理论上)即使是行号也无法确定地跟踪。

<小时/>

在所有情况下 100% 准确地跟踪行号和字符号的唯一方法是实现您自己的输入解析系统,该系统可以跟踪这些内容本身......通过其输入流光标的所有向前和向后移动。

关于java - 有没有办法获取 java.util.Scanner 失败的输入文件的行号(和列号)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17261116/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com