1

我收到 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();
    }
}

例外(从评论中复制):

在 OrderBook.InterpretOrderBookUpdateMessage.InterpretMessageFromFile(InterpretOrde‌ rBookUpdateMessage.java:20) 在 OrderBook.MainMethod.main(MainMethod.java:50)

4

1 回答 1

1

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

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

您可以使用的一件事是:

public boolean hasNext(String pattern) 

代替

next()

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

所以而不是:

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 等是否是一种好习惯。我更喜欢个人在方法内消费。

希望能帮助到你。

于 2013-10-31T16:59:43.503 回答