2016-06-08 75 views
0

我正在嘗試製作處理「大」文本文件的程序。該文本文件顯示1000行,每個教師工作人員。每行包含名字,姓氏,等級和薪水。試圖從文本文件中讀取double值,但拋出InputMismatchException

鏈接到文本文件: http://cs.armstrong.edu/liang/data/Salary.txt

程序應該算按職級員工的數量,以及每個組的總工資。最後,應該顯示每個組的總工資以及具有給定職位的員工的平均工資。我還沒有完成整個程序,我目前正在確保文本文件被正確讀取。

代碼下面的例子:

package ch12; 
import java.util.Scanner; 
import java.io.FileNotFoundException; 
import java.io.IOException; 
import java.net.MalformedURLException; 
import java.net.URL; 

public class Chapter_12_E25_ProcessLargeDataSet { 

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

     int assistantCount = 0; 
     int associateCount = 0; 
     int fullCount = 0; 
     int facultyCount = 0; 

     double assistantSalary = 0; 
     double associateSalary = 0; 
     double fullSalary = 0; 
     double facultySalary = 0; 

     try { 
      URL url = new URL("http://cs.armstrong.edu/liang/data/Salary.txt"); 
      Scanner input = new Scanner(url.openStream()); 

      while (input.hasNext()) { 

       String firstName = input.next(); 
       String lastName = input.next(); 
       String rank = input.next(); 
       double salary = input.nextDouble(); 

       if (rank.contains("assistant")) { 
        assistantCount++; 
        System.out.println("Rank is " + rank + " and salary is " + salary); 

       } else if (rank.contains("associate")) { 
        associateCount++; 
        System.out.println("Rank is " + rank + " and salary is " + salary); 
       } else { 
        fullCount++; 
        System.out.println("Rank is " + rank + " and salary is " + salary); 
       } 
      } 
      input.close(); 
     } 
     catch (MalformedURLException ex) { 
      ex.printStackTrace(); 
      System.exit(1); 
     } 
     catch (FileNotFoundException ex) { 
      ex.printStackTrace(); 
      System.exit(2); 
     } 

    } 

} 

double salary = input.nextDouble()導致InputMismatchException線。如果我將可變工資更改爲String而不是double,則可正確讀取工資。如果我將double salary = input.nextDouble()更改爲double salary = Double.parseDouble(input.next()),我會得到正確的double值。它不會打擾我使用這種方法,但我只是好奇爲什麼scanner不接受工資作爲double價值。

任何人都可以請解釋爲什麼嗎?

此外,這是一個偏題的子問題。如果我將URL object的參數中的文件名Salary.txt更改爲不存在的文件,則FileNotFoundException中的catch statement nr2不會拋出,而是拋出InputMismatchException。爲什麼拋出InputMismatchException而不是FileNotFoundException

+0

什麼是您的語言環境和什麼是小數點分隔符? – Tunaki

+0

我住在挪威,但我沒有設置任何特定的區域或小數分隔符。 – Esben86

+0

你可以看看這個問題嗎? http://stackoverflow.com/questions/17150627/scanner-double-value-inputmismatchexception – Tunaki

回答

1

最有可能您的掃描儀使用錯誤的語言環境。根據您的Salary.txt的值,您只需將掃描儀的語言環境更改爲英語。試試這個:

import java.util.Locale; 
... 
Scanner input = new Scanner(url.openStream()); 
input.useLocale(Locale.ENGLISH); 
+0

工作就像一個魅力:) – Esben86

0

雖然我不熟悉掃描儀,但快速查看api後發現了各種「hasNext(something)」方法。如...

hasNextInt()

hasNextFloat()

hasNextDouble()

hasNextLine()

現在,你可能希望程序弄清楚它應該使用什麼下一個。如果你正確設置了程序,我想你可以簡單地用「hasNext(something)」來測試下一行的每種可能的值。當hasNext(something)返回true時,則用下一個(something)來獲取值。 在示例的概念是...

hasNextInt()返回false ...

(跳過nextInt())

hasNextDouble()返回true ...

nextDouble ()

您需要查看https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

1

而且,一個子問題是題外話。如果我將URL對象的參數中的文件名Salary.txt更改爲不存在的文件,則不會拋出catch語句nr2中的FileNotFoundException,而是會拋出InputMismatchException。爲什麼拋出InputMismatchException而不是FileNotFoundException?

服務器actuallay傳遞一個文件(最有可能的404),它不符合預期的格式打開一個流。

行double salary = input.nextDouble()會導致InputMismatchException。如果我將變量工資更改爲字符串而不是雙倍工資,則可正確讀取工資。如果我將double salary = input.nextDouble()更改爲double salary = Double.parseDouble(input.next()),則會獲得正確的double值。它不會打擾我使用這種方法,但我只是好奇爲什麼掃描儀不接受工資作爲雙重價值。

如果文件格式無法正確保存100%,那麼整個過程非常脆弱並且會崩潰(甚至更糟糕:會導致錯誤的結果)。我建議閱讀整行,然後使用正則表達式進行拆分。然後檢查所有值是否是預期的類型(例如double/String)而不是null,然後繼續將它們添加到統計信息中。如果分割失敗/值爲空/錯誤,則可以向輸出添加錯誤消息並跳過該行以繼續。