1
import java.io.File;
import java.io.FileNotFoundException;
import java.util.*;

public class CSVReader
{
public static void main(String[] args) throws FileNotFoundException
{
    Scanner scanner = new Scanner(new File("Lunch.csv"));
    ArrayList<String> AccountNum = new ArrayList<String>();
    ArrayList<String> AccountBal = new ArrayList<String>();
    scanner.useDelimiter(",");
    while(scanner.hasNext())
    {
       AccountNum.add(scanner.next());
       AccountBal.add(scanner.next());
    }
    scanner.close();
    display(AccountNum, AccountBal);
 }

 public static void display(ArrayList AccountNum, ArrayList AccountBal)
 {
     System.out.println("\nThe size of the list is " + AccountNum.size());
     for(int x = 0; x < AccountNum.size(); ++x)
     {
        System.out.println("position " + x + " Number: " + AccountNum.get(x));
        System.out.println("position " + x + " Number: " + AccountBal.get(x));
     }
 }


}

このプログラムは、CSV ファイルから 2 つの配列に読み取ることになっています。正常にコンパイルされますが、実行すると NoSuchElementException がスローされます。このプログラムは、配列が 1 つだけ使用されている場合に機能します。この例外がスローされる理由と解決方法を知っている人はいますか?

4

3 に答える 3

4

編集: ChrisCM のコメントに対する私の回答を修正するには、これにより、スキャナー入力を交互に行っている間に受け取る例外を防ぐことができます。

while(scanner.hasNext())
{
   AccountNum.add(scanner.next());
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

不均一なリストになる場合があります (AccountNum の最後の要素は空白になります)。これを修正するには、

if(AccountNum.get(AccountNum.size() - 1).trim().equals("")) {
    AccountNum.remove(AccountNum.size() - 1);
}

それでも不均一なリストがある場合は、プログラムをデバッグして問題を解決する必要があります。

入力を解析する別の方法:

while(scanner.hasNext())
{
   String temp = scanner.next();
   if(temp.trim().equals("") && scanner.hasNext()) {
       throw new Exception("This shouldn't happen");
   } else { 
       AccountNum.add(temp);
   }
   if(scanner.hasNext())
       AccountBal.add(scanner.next());
}

入力ファイル内の空白のばかげたことを処理できるopencsvなどのライブラリの使用に切り替えることもできます。

于 2013-05-01T17:14:41.633 に答える
1

入力ファイルに奇数の項目が含まれている可能性があります。あなたのコードは、すべての口座番号に 1 つの残高があることを前提としています。ファイルが実際にこの要件を満たしている場合は、次のものを使用できます。

scanner.useDelimeter(",");

あなたがなりたいと思うもの

scanner.useDelimiter(",|\\n");
于 2013-05-01T17:16:13.017 に答える