gpt4 book ai didi

java.util.NoSuchElementException错误,查找了可能的原因,仍然无法修复

转载 作者:行者123 更新时间:2023-12-01 04:13:05 25 4
gpt4 key购买 nike

我收到 java.util.NoSuchElementException 错误。我们收到此错误的原因如下。

  1. 如果我们在读取文件之前不检查文件是否有下一行,然后它在读取最后一行后抛出异常,因为它正在尝试读取不存在的行。
  2. 文件格式困惑

我认为我正在使用的文件的格式是正确的,我还在阅读之前检查下一行,但我仍然收到错误。

当我使用 print 语句调试它时,它会打印所有行并在读取最后一行后抛出 java.util.NoSuchElementException 错误。

请帮帮我

这是代码:

 public static void InterpretMessageFromFile() throws FileNotFoundException{

File inputfile = new File("filepath");
Scanner reader = new Scanner(inputfile);

try {
while (reader.hasNextLine()) {
String MessageType = reader.next();
int IsAdd = MessageType.compareToIgnoreCase("A");
int IsCancel = MessageType.compareToIgnoreCase("X");
int IsDelete = MessageType.compareToIgnoreCase("D");
int IsExecute = MessageType.compareToIgnoreCase("E");
int IsReplace = MessageType.compareToIgnoreCase("U");

//if the type of order is add order to existing Order Book
if (IsAdd == 0) {
String retrieve_ts = reader.next();
int ts = Integer.parseInt(retrieve_ts);

String retrieve_id = reader.next();
int id = Integer.parseInt(retrieve_id);

String or_side = reader.next();
String retrieve_share = reader.next();
int share = Integer.parseInt(retrieve_share);

String retrieve_price = reader.next();
int price = Integer.parseInt(retrieve_price);

System.out.println("Add Order : Id is " + id );
AddOrderToExistingBook.AddNewOrder(id, ts, or_side, share, price);
}

//if it is cancel order
if (IsCancel == 0){
String retrieve_ts = reader.next();
int ts = Integer.parseInt(retrieve_ts);

String retrieve_id = reader.next();
int id = Integer.parseInt(retrieve_id);
System.out.println("Cancel Order : Id is " + id + " time stamp is : " + ts );

CancelOrder.CancelPartOfOrder(id, ts);
}
}
}
}
finally {
reader.close();
}
}

异常(exception)(从评论复制):

Exception in thread "main" java.util.NoSuchElementException at java.util.Scanner.throwFor(Scanner.java:907) at java.util.Scanner.next(Scanner.java:1416) at OrderBook.InterpretOrderBookUpdateMessage.InterpretMessageFromFile(InterpretOrde‌​rBookUpdateMessage.java:20) at OrderBook.MainMethod.main(MainMethod.java:50)

最佳答案

您正在尝试使用不存在的 token 。您执行了多次 next() 调用,而不检查是否有下一个。就您而言,我怀疑文件末尾的换行符会为您提供一个空行作为输入。扫描仪将看到一个新行,但由于它不包含标记,因此调用“next()”将导致错误。

如果文件中的 block 之间有空行,也会发生同样的情况。

您可以使用的一件事是:

public boolean hasNext(String pattern) 

而不是

next()

这将让您在不消耗 token 的情况下进行前瞻。

所以代替:

String MessageType = reader.next();
int IsAdd = MessageType.compareToIgnoreCase("A");
int IsCancel = MessageType.compareToIgnoreCase("X");
// .... left out other classes

//if the type of order is add order to existing Order Book
if (IsAdd == 0){
// .. do stuff
}

你可以这样做:

if (reader.hasNext("A") {
reader.next(); // consume A
int ts = reader.nextInt(); // get id
// ... etcetera
} else if (reader.hasNext("X") {

}

我还建议您使用 nextInt() 而不是 nextString,然后调用 parseInt

另一件事:您甚至可以通过执行以下操作使代码更易于阅读:

if (reader.hasNext("A") {
handleAddition(reader);
}

然后定义一个仅处理这种情况的方法。你的主要方法将如下所示:

try
{
while (reader.hasNextLine())
{
if (reader.hasNext("A")) {
handleAdd(reader);
} else if (reader.hasNext("X")) {
handleCancel(reader);
} else if (reader.hasNext("D")) {
handleDelete(reader);
} else if (reader.hasNext("E")) {
handleExecute(reader);
} else if (reader.hasNext("R")) {
handleReplace(reader);
} else {
// unexpected token. pretty sure this is the case that triggers your exeception.
// basically log as info and ignore.
reader.nextLine();
}
}
}
finally
{
reader.close();
}

现在您的方法既漂亮又简短,并且所有特定操作都在具有自己名称的方法中执行。

唯一我不是 100% 认为在主循环或实际处理程序方法中使用 A、X、R 等是否是好习惯。我个人更喜欢在方法内部使用。

希望有帮助。

关于java.util.NoSuchElementException错误,查找了可能的原因,仍然无法修复,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19711841/

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