2012-03-24 6 views
0

ファイルから入力を読み取るプログラムがあります。私はコンマの後にトークンを返すだけで入力を区切りたい。しかし、それは動作していないようです。ここに私のコードは、これまでのところです:ここではファイルからのスキャナ入力の区切り

package usegradebook; 
import java.io.File; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 

public class GradeBook { 

private static Object[][] studentRecords = new Object[8][8]; 

public void compileRecord() throws FileNotFoundException 
{  

    File file = new File("SomeData.txt");     
    Scanner input = new Scanner(file); 
    input.useDelimiter(","); 

    for(int row = 0; row < studentRecords.length; row++) 
    { 
     for(int column = 0; column < studentRecords[row].length; column++) 
     { 
      studentRecords[row][column] = input.next();      
     } 

    }     
    input.close(); 
} 

はデータです: 姓、姓、Exam1、ASG1、ASG2、Exam2、Asg3、Asg4 KARR、アーレン、91、86、94、100、98、93 Rao、Sista、91,86,94,100,98,93 Stotz、Ralph、81,83、93、78 Yi、Yu、99,88,101,76,90,94 Rao、Sista、91,86,94,100,98,93 Christopher、Thomas、 78,79,88,88,88,91 McClurg、Andrew、91,87,99,87、93 貴族、リッチ、84,79,85,88,90,91 Johnson、Mark、100、100 、100,100,100,100

"スレッド内の例外" main "java.util.NoSuchElementException"を返します

答えて

0

入力に問題があります。 1つのレコードに1つのデータがありません。だから、最後のレコードの最後のデータになると、データがないときにはinput.next()が呼び出されます。また、next()をスキャナオブジェクトに呼び出す前にhasNext()にチェックすることを忘れないでください。

+0

ありがとうございます。レコードは実際には1レコードが欠けていました。 if文の中のinput.hasNext()でコードを置き換え、問題は解決されました。 – Eric

0

1行に8個のレコードを持つ入力に頼るのではなく(実際には別のものが存在するかどうかをチェックせずにinput.next() token)には、input.hasNext()を使用して別のトークンがあるかどうかを確認する必要があります。これにより、あなたが期待しているものと一致しない行を受け取ったときに、これをよりうまく見ることができ、これをデバッグするのに役立ちます。

は、それはあなたの質問から、あなたの入力ファイルの正確な形式を見ることは難しいですが、私は何かが間違っているsuspct http://docs.oracle.com/javase/tutorial/essential/io/scanning.html

を参照してください。処理されるたびに各行を出力したり、スローされたときに例外を捕捉して行を印刷したりすることがあります。これは、入力ファイルのどのビットがあなたの期待通りでないかを絞り込みます。

+0

あなたの助言をいただき、ありがとうございました。実際にはフォーマット上の問題が発生していました。 if文内でinput.next()をinput.hasNext()に置き換えると、この問題が修正されました。 – Eric

関連する問題