0
public static void main(String[] args) throws FileNotFoundException {

    File file = new File("data.txt"); // select file
    try{
    Scanner sc = new Scanner(file); // set scanner to file
        try{
            while (sc.hasNextLine()){ 
    Employee employee = new Employee(); //create employee to hold data
            assignData(sc); //read data into employee
            employee.getGross(); //calculate gross pay
            addEmployee(employee);//assign employee to array
            }//end while
        }//end try2
        finally {
            sc.close(); // close file, saving resource usage
        }//end finally
    }//end try1
    catch(IOException e) {
        e.printStackTrace();
    }

public static void assignData(Scanner input){ 
        //accept scanner
        //read necessary input for employee
        EmpID = input.next();****
        LastName = input.next();****
        FirstName = input.next();****
   (LINE 36)Hours = input.nextDouble();
        Rate = input.nextDouble();
    }

データファイルの内容

42345 Bruch Max 40 21.50 
23456 Elgar Eddie 43 20.0 
34567 Bach John 30 30 
12345 Wagner Rick 41 30 
88888 Mozart Wolfie 36 40 
65432 Chopin Fred 45 23.25 
72345 Strauss Butch 50 25

コンパイルすると、エラーが発生します

"Exception in thread "main" java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:909)
at java.util.Scanner.next(Scanner.java:1530)
at java.util.Scanner.nextDouble(Scanner.java:2456)
at programassignment1c.Employee.assignData(Employee.java:36) (
at programassignment1c.ProgramAssignment1C.main(ProgramAssignment1C.java:44)

Java 結果: 1


上で強調表示されている Employee クラスの 36 行目は、nextDouble() です。小数点以下がなくても double をスキャンできますか?

これを手で書き出すと、スキャナーが 42345 で始まることがわかり、これが EmpID に設定され、スキャナーは空白を超えて次のように進みます。

Bruch でこれを LastName に設定すると、scanner は空白を超えて Max に進み、これを FirstName に設定します。次に、scanner は空白を超えて 40 に進み、これを Hours に設定する必要があります???? スキャナを正しくフォローしていませんか?

4

3 に答える 3

1

ここで特定のデータ型メソッドを使用する必要があると思います:

    EmpID = input.nextLine();
     LastName = input.nextLine();
    FirstName = input.nextLine();

nextInt/nextの代わりに使用してみてくださいnextLine。AsnextLineは行全体を読み取り、それをint値に割り当てようとするとスローしInputMismatchExceptionます。

于 2013-09-16T20:37:18.313 に答える
0

nextLine()要件に適合しません(ファイル内のデータは改行ではなくスペースで区切られているため)。

このスキャナーを現在の行を超えて進め、スキップされた入力を返します。このメソッドは、最後の行セパレーターを除いて、現在の行の残りを返します。位置は次の行の先頭に設定されます。

だからこれを試してください

public static void assignData(Scanner input)
{ 
        empID = input.nextInt();
        lastName = input.next();
        firstName = input.next();
        hours = input.nextDouble();
        rate = input.nextDouble();
 }  

注: Java 命名規則に従うように変数名を変更しました。

于 2013-09-16T20:40:21.837 に答える
0

毎回行を読み取る(およびスキップしますが、行区切りを消費しません)nextLine()代わりに呼び出しています。next()あなたが持っている

    EmpID = input.nextLine();
    LastName = input.nextLine();
    FirstName = input.nextLine();
(LINE 36)Hours = input.nextDouble();
    Rate = input.nextDouble();

そう

42345 Bruch Max 40 21.50 // EmpID
23456 Elgar Eddie 43 20.0  // LastName 
34567 Bach John 30 30 // FirstName, but not the new line characters
12345 Wagner Rick 41 30 
88888 Mozart Wolfie 36 40 
65432 Chopin Fred 45 23.25 
72345 Strauss Butch 50 25

コメントを参照してください。

nextLine()状態の javadoc

このメソッドは、最後の行セパレーターを除いて、現在の行の残りを返します。

そのため、nextDouble()呼び出しはタイプではない行セパレーターを読み取ろうとしているdoubleため、InputMismatchException.

ライン上の各トークンが必要な場合は、使用します

EmpID = input.next();
LastName = input.next();
FirstName = input.next();
Hours = input.nextDouble();
Rate = input.nextDouble();

next()状態の javadoc

このスキャナーから次の完全なトークンを検索して返します。完全なトークンの前後には、区切り文字パターンに一致する入力が続きます。

デフォルトの区切り文字は

Pattern.compile("\\p{javaWhitespace}+");

すなわち。空白文字。


Java の命名規則では、変数名は小文字の英字で始める必要があります。

于 2013-09-16T20:36:51.080 に答える