2016-04-14 62 views
-1

我正在嘗試編寫按順序排列的Java任務;Java嘗試讀取文本文件時遇到運行時錯誤

  1. 閱讀預先編寫的文本文件
  2. 打開每一行的每一行轉換成字符串
  3. 打開每一行的每一部分到它自己的獨立字符串/ INT /雙
  4. 分配這些變量中的對象(這是一個對象的陣列的一部分),我也創建此分配
  5. 打印使用類中的一個對象的每個變量的一部分的一類方法

但是,我反覆遇到運行時問題,我收到此錯誤消息;

在java.util.Scanner.next(Scanner.java:1371)在線程 「主」 java.util.NoSuchElementException 在java.util.Scanner.throwFor(Scanner.java:862) 異常 在Lab2.main(Lab2.java:27)

這使我相信我可能讀錯文本文件。但是,無論我做什麼,我都無法使其正確讀取。它應該讀取一個名字,一個姓氏,一個地址(它連接成一個字符串),一個城市,一個州,一個郵政編碼(作爲一個整數),一個電話號碼(作爲一個字符串)和一美元的金額(作爲一個雙)。

我認爲這個問題可能來自城市名稱,因爲它們中的一些之間有空間。我認爲我已經通過設置掃描器的分隔符來解決這個問題,該掃描器將每個單獨的字符串讀取到一個標籤(這是每個其他元素被分隔的東西),但是這沒有工作(並且因此試圖將狀態名稱變成一個整數通過Integer.parseInt()靜態方法),或者不是問題。正如我所說,我沒有想法,並會非常感謝任何能夠幫助我的人!

我會列出下面的代碼。首先是主文件;

public class Lab2 
{ 
    public static void main(String[] args) throws IOException 
    { String FirstName, LastName, Address1, Address2, Address3, AddressFull, City, State, Phone, ZipString, DonString, line = "blank"; 
     int Zip; 
     double Donation; 

     Scanner fileScan = new Scanner(new File("Lab2.txt")), lineScan = new Scanner(line); 
     lineScan.useDelimiter("\t"); 

     PersonStats[] Donators = new PersonStats[25]; 

     for (int i = 0; i < Donators.length; i++) 
     { line = fileScan.nextLine(); 

     FirstName = lineScan.next(); 
     LastName = lineScan.next(); 

     Address1 = lineScan.next(); 
     Address2 = lineScan.next(); 
     Address3 = lineScan.next(); 
     AddressFull = Address1 + " " + Address2 + " " + Address3; 

     City = lineScan.next(); 
     State = lineScan.next(); 

     ZipString = lineScan.next(); 
     Zip = Integer.parseInt(ZipString); 

     Phone = lineScan.next(); 

     DonString = lineScan.next(); 
     Donation = Double.parseDouble(DonString); 

     Donators[i] = new PersonStats(FirstName, LastName, AddressFull, City, State, Zip, Phone, Donation); 
     Donators[i].PrintOut(); 
     } 

    } 
} 

接下來,我爲這個任務寫下了類文件;

public class PersonStats 
{ private String FirstName, LastName, Address, City, State, Phone; 
private int Zip; 
private double Donation; 

public PersonStats(String first, String last, String area, String town, String feifdom, int postcode, String telegraph, double given) 
{ FirstName = first; 
    LastName = last; 
    Address = area; 
    City = town; 
    State = feifdom; 
    Zip = postcode; 
    Phone = telegraph; 
    Donation = given; 
} 

public void PrintOut() 
{ System.out.println(FirstName + " " + LastName); 
    System.out.println(Address); 
    System.out.println(City + ", " + State + " " + Zip + "\n"); 
    System.out.println(Phone + " " + Donation); 
} 

} 

然後終於文本文件的程序應該從被讀取(可能是有點難以閱讀,只記得除了在城市名稱的那些每個空間實際上是一個標籤);

Rick James 8276 Carlos Ave Las Vegas NV 87126 5553451567 23.95 
John Gibson 9127 Oak Dr Corvallis OR 97330 5552812313 156.78 
Ron Wills 1155 Ivy Pl Atlantic Ga 37339 5552123145 189.56 
Rita Jones 1259 Chase Ave Las Vegas NV 87126 5554445671 2145.60 
Jason Knight 7154 Pine Dr Gresjam  OR 97380 5558124545 3157.44 
Clara Swanson 1944 Main Pl Springfield OR 97339 5552123144 212.99 
Robert Peck 1866 First Ave Las Vegas NV 87126 5553455425 250.00 
Dora Garcia 2179 Fir Dr Corvallis OR 97330 5552812919 350.00 
Peter Keck 1465 Circle Pl Gold Beach OR 97339 5552123256 2150.00 
Stuart Smith 2387 Sweek Ave Las Vegas NV 87126 5553455489 650.99 
Tyler Wild 1313 Spooky Ln Corvallis OR 97330 5552813213 587.45 
Laretta Peters 2224 Chase Pl Monmouth OR 97361 5552124465 123.45 
Kristi Emry 3465 Cerrito Ave Las Vegas NV 87126 5553455567 3212.65 
Kelli Gard 1894 Elm Dr Corvallis OR 97330 5552816678 51.00 
Jacob Andrews 8159 Rose Ct Mill City OR 97322 5552127879 64.00 
Ryan Perkins 7546 Prince Ave Las Vegas NV 87126 5553451989 13.00 
Joshua Gilbert 9278 Monroe Dr Corvallis OR 97330 5552832656 95.00 
Miles Crain 4578 Chester Dr Corvallis OR 97331 5552345678 1544.00 
Butch Cassidy 5498 Sutton Pl Gresham  OR 97380 5416565797 1798.56 
Perry Winkle 8185 Shaver Ave Las Vegas NV 87126 5553812346 195.66 
Loni Day 4598 Holmen Dr Corvallis OR 97330 5555289741 1878.50 
Nikita Benson 1787 Grant Pl Portland OR 97321 5553569898 1500.00 
Rusty Krouger 8829 Simeon Ave Las Vegas NV 87126 5555677847 2100.00 
Wally Wallace 2898 Wilson Blvd Jackson Center OH 23466 5552222222 2222.22 
Joe  Jones 1212 Water St Millersburg OR 97366 5555555555 55.55 

再次,如果有任何人可以幫助我,這個建議可能會挽救生命!或者至少本實驗的得分:S

+0

檢查http://stackoverflow.com/questions/13102045/skipping-nextline-after-using-next-nextint-or-other-nextfoo-methods。順便說一句,你爲什麼不使用'FileReader' +'BufferedReader'? – TheLostMind

+0

有許多檢查_before_做相應的'next〜':'hasNextLine','hasNext'。 –

+0

您的示例文本文件實際上並未通過製表符分隔。我在5人詳細記錄文本文件 –

回答

0

好,這裏是

import java.io.IOException; 
import java.io.*; 
import java.util.Scanner; 
public class Lab2 
{ 
    public static void main(String[] args) throws IOException 
    { String FirstName, LastName, Address1, Address2, Address3, AddressFull, City, State, Phone, ZipString, DonString, line = "blank"; 
     int Zip; 
     double Donation; 

     Scanner fileScan = new Scanner(new File("F:/test.txt")).useDelimiter("\n"); 

     PersonStats[] Donators = new PersonStats[5]; 
     String tempVal=""; 
     int i = 0; 
     while(fileScan.hasNext()) 
     { 
     tempVal = fileScan.next(); //Storing person records one at a time in the string line by line 
     String tempArr[] = tempVal.split("\t"); //Splitting each person record string by tab and storing it in a String array 

      FirstName = tempArr[0]; 
      LastName = tempArr[1]; 

      Address1 = tempArr[2]; 
      Address2 = tempArr[3]; 
      Address3 = tempArr[4]; 
      AddressFull = Address1 + " " + Address2 + " " + Address3; 

      City = tempArr[5]; 
      State = tempArr[6]; 

      ZipString = tempArr[7]; 
      Zip = Integer.parseInt(ZipString); 

      Phone = tempArr[8]; 

      DonString = tempArr[9]; 
      Donation = Double.parseDouble(DonString); 
      Donators[i] = new PersonStats(FirstName, LastName, AddressFull, City, State, Zip, Phone, Donation); 
      Donators[i].PrintOut(); 
      i++; 
     } 
    } 
} 

首先,我會喜歡指出你的變量名應該以小寫字母開頭。我沒有在代碼中編輯它們,因爲它們在很多地方都被使用過。做一個習慣申報String firstName代替String FirstName

的代碼,在代碼中你用了一個"\t" delimter我與"\n"取代,因爲在文本文件中的每一行擁有整個人的詳細信息。您可以使用"\t"如果第一個人的捐贈和第二個人的名字被相同的分隔開,但它們之間用「\ n」分隔

所以現在Scanner fileScan將逐行讀取文件將存儲在String tempValwhile(fileScan.hasNext())確保掃描儀將保持只讀,只要有線要讀取。

現在,每行有不同的信息,由"\t"分隔。所以我用tempVal.split("\t")來分開它們。另外,使用了一個計數器int i並刪除了for循環。我猜測代碼的其餘部分是非常基本的,與你的代碼沒有多大區別。

**編輯****

這裏是輸出

Rick James 
8276 Carlos Ave 
Las Vegas, NV 87126 

5553451567 23.95 
John Gibson 
9127 Oak Dr 
Corvallis, OR 97330 

5552812313 156.78 
Ron Wills 
1155 Ivy Pl 
Atlantic, Ga 37339 

5552123145 189.56 
Rita Jones 
1259 Chase Ave 
Las Vegas, NV 87126 

5554445671 2145.6 
Jason Knight 
7154 Pine Dr 
Gresjam, OR 97380 

5558124545 3157.44 

這裏是我使用的樣本text.file。

Rick James 8276 Carlos Ave Las Vegas NV 87126 5553451567 23.95 
John Gibson 9127 Oak Dr Corvallis OR 97330 5552812313 156.78 
Ron Wills 1155 Ivy Pl Atlantic Ga 37339 5552123145 189.56 
Rita Jones 1259 Chase Ave Las Vegas NV 87126 5554445671 2145.60 
Jason Knight 7154 Pine Dr Gresjam OR 97380 5558124545 3157.44 
+0

你的修復工作完美!謝謝你的建議。 – Scoopicus

0
Scanner fileScan = new Scanner(new File("Lab2.txt")); 


     //PersonStats[] Donators = new PersonStats[25]; 

     while(fileScan.hasNext()) { 


     line = fileScan.nextLine(); 

     String parts[] = line.split("\t");   

     if(parts.length == 10) { 

      FirstName = parts[0]; 


      ... 
     } 

加入時有一些問題。 第一:字符串不可變。因此,您的lineScanner將使用空字符串創建。如果稍後更改此字符串,則此掃描程序沒有任何內容,因爲您使用此步驟創建了一個新字符串。

第二,你必須檢查下一個元素。 (請參閱我的while循環)

要解析您的數據,請將部分字符串拆分並使用它填充您的類。但是,如果你想使用的掃描儀類,你在你的文件中創建的實例每行(在while循環)

相關問題