2016-10-27 104 views
1

我正在做AP CS分配,其中一條指令要求我將我的文本文件中的每列數據讀入1個單獨的一維數組。到目前爲止我還沒有弄清楚,可以使用一些建議/幫助。當我嘗試運行該程序我也得到了錯誤「java.util.InputMismatchException null(在java.util.Scanner中)java中的輸入不匹配錯誤

1980 Aug 945 100 Allen 
1983 Aug 962 100 Alicia 
1984 Sep 949 100 Diana 
1985 Jul 1002 65 Bob 
1985 Aug 987 80 Danny 
1985 Sep 959 100 Elena 

上面是文本文件,並在下面是我目前使用的代碼。

import java.util.Scanner; 
import java.io.File; 
import java.io.IOException; 

public class Hurricanes2 
{ 
    public static void main(String[] args)throws IOException 
    { 
     //declare and initialize variables 

     File fileName = new File("hurcdata2.txt"); 
     Scanner inFile = new Scanner(fileName); 
     int arrayLength = 59; 
     int [] year = new int[arrayLength]; 
     String [] month = new String[arrayLength]; 
     int [] pressure = new int[arrayLength]; 
     int [] windSpeed = new int[arrayLength]; 



     //INPUT - read data in from the file 
     int n = 0; 
     while (inFile.hasNext()) 
     { 
      year[n] = inFile.nextInt(); 
      month[n] = inFile.next(); 
      pressure[n] = inFile.nextInt(); 
      windSpeed[n] = inFile.nextInt(); 
      System.out.println (year[n] + "\n"); 
      n++; 
     } 
     inFile.close(); 
+0

錯誤引用哪行代碼? –

回答

1

你的文件的每一行都有5個項目,但你的代碼只讀取前4個。所以當它認爲它開始下一行時,它實際上是試圖讀取當前行的最後一項,這是不是int

即使您沒有任何需要存儲的地方,解決辦法之一就是閱讀每行的第5項。

+0

是啊,我一直在想爲什麼它不會讀,我認爲這可能是因爲它在int「1980」之後繼續讀下一個字符串。但是我試圖弄清楚的是如何讀取列,以便它不會繼續到字符串。所以在整年內它只會讀1980,1983等。 – Shenshi

1

看看輸入數據

1980 Aug 945 100 Allen 
1983 Aug 962 100 Alicia 
1984 Sep 949 100 Diana 

而你抓住了什麼:

 while (inFile.hasNext()) 
     { 
      year[n] = inFile.nextInt(); 
      month[n] = inFile.next(); 
      pressure[n] = inFile.nextInt(); 
      windSpeed[n] = inFile.nextInt(); 
      System.out.println (year[n] + "\n"); 
      n++; 
     } 

有輸入5個領域,而你只抓4.當第二次循環,它預計抓住year(int),而不是抓住名字(字符串)。

1

您並未選取while循環中的最後一列。因此,在第二個循環中,掃描儀嘗試將第五列讀爲int。 即使您不使用結果,您也必須在while循環的末尾添加inFile.next(),因此掃描程序在下一個循環時不會移位。

0

您同時擁有Stringint所以,要麼始終索要String(後來到int解析它),或者,如果你知道你的文件的formatation,你可以對你有利使用它。在你的例子中,你有一個intString,int,int, String,然後換行符。

從這裏你可以在幾種方式的事情。

一種解決方案意味着使用Scanner來讀取整個行,然後使用String的方法.split(String regex),我們創建字符串,我們現在可以解析的陣列。但是,對於正確使用的方法,您需要在分離文本的方式上保持一致。在我的例子中,我使用了tab。我用你的例子,並把它們全部標籤。我不會在這裏顯示,因爲編輯器不會保存選項卡。

File fileName = new File("hurcdata2.txt"); 

int arrayLength = 6; //I used 6 since you showed 6 lines 
//You could use an ArrayList or an algorithm to dynamically 
//increase the size of the arrays. 
int [] year = new int[arrayLength]; 
String [] month = new String[arrayLength]; 
int [] pressure = new int[arrayLength]; 
int [] windSpeed = new int[arrayLength]; 

Scanner fileScanner = null; 
try { 
    fileScanner = new Scanner(fileName); 
} 
catch (FileNotFoundException ex) { 
    //Exception handling; 
} 


int n = 0; 
while(fileScanner.hasNext()) { 
    String toParse = fileScanner.nextLine(); 
    String[] splitedString = toParse.split("\t"); 

    year[n] = Integer.parseInt(splitedString[0]); 
    month[n] = splitedString[1]; 
    pressure[n] = Integer.parseInt(splitedString[2]); 
    windSpeed[n] = Integer.parseInt(splitedString[3]); 
    n++; 
} 
fileScanner.close(); 

//I will include my test to check it. 
for (int i = 0 ; i < arrayLength; i++) { 
    System.out.print("\ni: " + i); 
    System.out.print(" - year: " + year[i]); 
    System.out.print("; month: " + month[i]); 
    System.out.print("; pressure: " + pressure[i]); 
    System.out.println("; windSpeed: " + windSpeed[i]); 
} 

另一種解決方案是使用的StringReader代替.split(String regex);StringReader就像是Scanner,但它專門用於字符串。

您也可以使用包裝在BufferedReader中的FileReader來讀取文件。

FileReader myFileReader = null; 
BufferedReader myBufferedReader = null; 

try { 
    myFileReader = new FileReader(fileName); 
    myBufferedReader = new BufferedReader(myFileReader); 

    int n = 0; 
    String toParse = null; 
    while((toParse = myBufferedReader.readLine()) != null) { 
     //Is this confusing for you?^
     String[] splitedString = toParse.split("\t"); 

     year[n] = Integer.parseInt(splitedString[0]); 
     month[n] = splitedString[1]; 
     pressure[n] = Integer.parseInt(splitedString[2]); 
     windSpeed[n] = Integer.parseInt(splitedString[3]); 
     n++; 
    } 

} 
catch (FileNotFoundException ex) { 
    //Exception handling; 
} 
catch (IOException ex) { 
    //Exception handling; 
} 
finally { 
    try { 
     myFileReader.close(); 
    } 
    catch (IOException ex) { 
     //Exception handling; 
    } 

    try { 
     myBufferedReader.close(); 
    } 
    catch (IOException ex) { 
     //Exception handling; 
    }   
} 

我希望我能幫上忙。

祝您有愉快的一天。 :)