簡體   English   中英

java.util.NoSuchElementException錯誤,出於可能的原因尋找,仍然無法修復

[英]java.util.NoSuchElementException error, looked for possible reasons, still can't fix it

我收到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‌)的java.util.Scanner.next(Scanner.java:1416)處java.util.Scanner.throwFor(Scanner.java:907)處的線程“ main”中的java.util.NoSuchElementException異常rBookUpdateMessage.java:20)在OrderBook.MainMethod.main(MainMethod.java:50)

您正在嘗試使用不存在的令牌。 您可以執行多個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等是否是一種好習慣的事情。 我更喜歡親自使用該方法。

希望能幫助到你。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM