2016-04-14 10 views
-1

私は現在、Javaの割り当てを書こうとしています。Javaがテキストファイルを読み込もうとしているときにランタイムエラーが発生しました

  1. 文字列に
  2. 電源を入れ
  3. がオブジェクトにこれらの変数を割り当て、二重、独自の個々の文字列/ INT /に各ラインの各部分をあらかじめ記述テキストファイル
  4. 電源を入れ、各ラインの各ラインを読みます私はまた、この割り当て
  5. 印刷クラスのいずれかを使用して、オブジェクトの各変数の一部として作成したクラスの(オブジェクトのアレイの一部である)メソッド

しかし、このエラーメッセージが表示されているランタイムの問題が繰り返し発生しています。 java.util.Scanner.nextでjava.util.Scanner.throwForで

スレッドの例外 "メイン" java.util.NoSuchElementException (Scanner.java:862) (Scanner.java:1371) Lab2.main(Lab2.java:27)

これはおそらく私が誤ってテキストファイルを読んでいると信じています。しかし、私が何をしても、正しく読むことができないようです。それは、名字、姓、3つの別々のコンポーネント(1つの文字列に連結する)、都市、州、郵便番号(整数として)、電話番号(文字列として)ドル金額(ダブル)。

私は、都市名から問題が発生する可能性があると考えています。都市名にはいくつかのスペースがあるためです。私は私がこれを解決したと思った。各文字列をタブ(これは他のすべての要素が区切られている)に読み込むスキャナの区切り文字を設定することによって解決したと思ったが、これはうまくいかなかった(そして状態名を整数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

対応する 'next〜':hasNextLine'、 'hasNext'を実行する前に多くのチェックが存在します。 –

+0

サンプルテキストファイルはタブで実際に区切られていません。私は5人の詳細レコードのテキストファイルであなたのための作業コードを投稿しています –

答えて

0

オーケー(whileループで)、ここでは、すべての

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

を宣言する習慣をつけましょう、あなたのコードでは、私は"\n"に置き換え"\t" delimterを使用していました。第1の人物と第2の人物の名前の寄付が同じものであれば、"\t"を使用することができましたが、「\ n」で区切られています。

だから、Scanner fileScanは、 String tempValwhile(fileScan.hasNext())に格納されますので、スキャナが読み取る線がある間だけ読み取りを継続します。

ここで、すべての行には、異なる情報が"\t"で区切られています。そこで、私はtempVal.split("\t")を使ってそれらを区切りました。また、カウンタint iを使用し、forループを削除しました。私はコードの残りの部分はかなり基本的で、あなたとはあまり変わらないと思います。ここで

** EDIT ****

は出力

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]; 


      ... 
     } 
存在するかどうかをチェックする nextメソッドを呼び出す前に、 hasNextXXX方法スキャナの使用を使用する場合

追加にはいくつかの問題があります。 最初:文字列は不変です。 LineScannerは空のStringで作成されます。この文字列を後で変更すると、このステップで新しい文字列を作成するため、このスキャナは何も表示されません。

次に、次の要素を確認する必要があります。 (私のwhileループを参照してください)

データを解析するには、文字列を分割してクラスに入力するのが簡単です。あなたはScannerクラスを使用する場合でも、あなたはあなたのファイルの行ごとのインスタンス上で作成する必要があります。