[英]java.util.NoSuchElementException error don't know how to fix
[英]java.util.NoSuchElementException error, looked for possible reasons, still can't fix it
我收到java.util.NoSuchElementException錯誤。 我們收到此錯誤的原因如下。
我認為我正在使用的文件格式是正確的,並且在讀取文件之前我也在檢查下一行,但是仍然出現錯誤。
當我使用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.