2011-12-07 4 views
0

プログラムの開始時にテキストファイルの行数を読み込み、その多くのオブジェクトを新しい(Vehicle [])配列(最大4)に格納します。無限ループからループを止めようとするが、実行ごとに "中断"しないようにする

public boolean addVehicle(Vehicle[] Honda) throws FileNotFoundException 
{ 
    Scanner reader = new Scanner(file); 
    String strLine = ""; 

     if(canAddVehicle() == true) 
     { 

     for(int i = 0; i < vehicles.length;i++) 
     { 
      System.out.println("This file is: " + file); 
      int counter = 0; 

      if(vehicles[i] == null) 
      { 
       try{ 
        // Open the file that is the first 
        // command line parameter 
        FileInputStream fstream = new FileInputStream(this.file); 

        // Get the object of DataInputStream 
        DataInputStream in = new DataInputStream(fstream); 
         BufferedReader br = new BufferedReader(new InputStreamReader(in)); 

        //Read File Line By Line 
        while ((strLine = br.readLine()) != null) { 

         //Declare objects inside the array. 
         Honda[counter] = new Vehicle(); 
         Honda[counter].readRecord(reader); 
         vehicles[counter] = Honda[counter]; 
         counter++; 

        } 
        strLine = ""; 

        //Close the input stream and scanner 
        reader.close(); 
        in.close(); 
        }catch (Exception e){//Catch exception if any 
         System.err.println("Error: " + e.getMessage()); 
        } 
        } 
       break; 
      } 
     } 
      return true; 
     } 

私はとのトラブルを抱えている部分は、この行です:プログラムが起動した後

if(vehicles[i] == null) 

、ユーザーは、配列に新しい車を追加することを選択することができます。行ごとにコードを調べると、i = 0で始まり、プログラムが最初に実行したときに2行の値が見つかり、2つのオブジェクトが配列に格納されたとしましょう。 値0と1が使用されます。つまり、ユーザーが新しいVehicleを追加すると、if(vehicles[i] == null)をスキップします。これは、spot [0]がNULLではないため、プログラムの先頭からの値が含まれているためです。

次に、break;に至り、forループを遡って配列に他のヌル値がないかどうかをチェックすることなく、メソッドを起動します。 私はここで何ができますか?

+0

プログラムを理解したい場合は、デバッガでコードをステップ実行することをお勧めします。うまくいけば、これはあなたが 'break;を置く必要があるところで動くのを助けるでしょう –

+0

、どこで' i'を増やしますか? –

+0

彼は "i ++"と言う場所を増やす –

答えて

0

感謝の原因となります。私は約12時間プログラミングしていました。私が質問したとき、私の心はちょうど死んでいました。私が何をしているのか分かりません。

public boolean addVehicle(Vehicle[] Honda) throws FileNotFoundException 
{ 
    boolean found = false; 
    int position = 0; 
     if(canAddVehicle() == true) 
     { 
      for(int i = 0; i < vehicles.length && !found; i++) 
      { 
       if(vehicles[i] == null) 
       { 
        position = i; 
        found = true; 
       } 
      } 

       Scanner reader = new Scanner(file); 
       while(reader.hasNext()) 
       { 
        Honda[position] = new Vehicle(); 
        Honda[position].readRecord(reader); 
        vehicles[position] = Honda[position]; 
        position++; 

       } 
       reader.close(); 
       return true; 
     } 
     return false; 
} 
0

なぜあなたはそこに休憩を取ったのですか?それはちょうどあなたが説明するものとまったく同じようにするつもりです。それを取り除くと、すべてがうまくいくでしょう。

+0

ファイルを読み込むと、行数に応じて新しいオブジェクトを書き込むのではなく、配列内のすべてのnull値に対して新しいオブジェクトを配列に書き込むので – MJ93

1

2つのもの、 a。スイッチブレークを続行し、必要な場所にブレークを置きます。

b。 fStreamを開くときにファイルストリームを閉じる必要があります fStreamを閉じるまで "ファイルを開いている"と使用できなくなるまで

1

ソースをフォーマットすると、ブレークは現在位置しています。次に、プログラムを手動でステップ実行する方法について考えてみてください。それは通常私を助けます。あなたはあなたのループの中でいつも壊れたいのか、新しい車をロードしたのかだけを決めることができます。

Peter Lawreyは、あなたのプログラムが何をするかを考え出した後、期待通りに動作しない場合、デバッガを使用してデバッガを使用すると良いコメントを出しました(ほとんどのIDEでは非常に簡単です)それぞれのアクションを確認し、各ステップで変数の値を確認してください。

1

あなたのコードは実際にはほとんど意味をなさない。私はあなたの問題の説明を理解して何から、以下のコードは、またはあなたが何をしたいのかではないかもしれませんがあります

import java.io.File; 
import java.io.IOException; 
import java.util.ArrayList; 
import java.util.Arrays; 
import java.util.List; 
import java.util.Scanner; 

public class VehicleList { 

    public class Vehicle { 
     private final String brand; 
     private final String make; 
     private final String year; 

     public Vehicle(String[] args) { 
      if (args.length < 3) { 
       throw new IllegalArgumentException("Too few args: " + args.length); 
      } 
      this.brand = args[0]; 
      this.make = args[1]; 
      this.year = args[2]; 
     } 

     @Override 
     public String toString() { 
      return String.format("%s %s %s", year, brand, make); 
     } 
    } 

    public List<Vehicle> readVehicles(String fileName) throws IOException { 
     List<Vehicle> vehicles = new ArrayList<Vehicle>(); 
     System.out.println(String.format("Reading vehicles from %s:", fileName)); 
     readVehicles(vehicles, new Scanner(new File(fileName)), false); 
     System.out.println(String.format("Reading vehicles from user:")); 
     readVehicles(vehicles, new Scanner(System.in), true); 
     return vehicles; 
    } 

    private void readVehicles(List<Vehicle> vehicles, Scanner scanner, boolean skipLineCheck) { 
     int count = 0; 
     while (skipLineCheck || scanner.hasNextLine()) { 
      String[] tokens = scanner.nextLine().split("\\s+"); 
      if (tokens.length < 3) { 
       break; 
      } 
      vehicles.add(new Vehicle(tokens)); 
      count++; 
     } 
     scanner.close(); 
     System.out.println(String.format("Read %s vehicles", count)); 
    } 

    public static void main(String[] args) throws IOException { 
     VehicleList instance = new VehicleList(); 
     List<Vehicle> vehicles = instance.readVehicles("vehicles.txt"); 
     System.out.println("Read the following vehicles:"); 
     System.out.println(Arrays.toString(vehicles.toArray())); 
    } 
} 

ブールskipLineCheckは、ファイル内の最後の行を超えて読み、投げてからスキャナを停止するために必要とされていますNoSuchElementException。ユーザーが入力するためには、ユーザーが入力を終了するために余分なRETURNを与えなければならないので、このチェックをしたくありません。

Volvo Station 2008 
Audi A4 2009 
Honda Civic 2009 
Toyota Prius 2008 

テストの実行は、以下のような出力が得られます:

Reading vehicles from vehicles.txt 
Read 4 vehicles 
Reading vehicles from user 
Nissan Micra 2002 
BMW cabriolet 1996 

Read 2 vehicles 
Read the following vehicles: 
[2008 Volvo Station, 2009 Audi A4, 2009 Honda Civic, 2008 Toyota Prius, 2002 Nissan Micra, 1996 BMW cabriolet] 
を使用すると、以下の内容の例についてのあなたの作業ディレクトリに「vehicles.txt」と呼ばれるファイルを作成する必要があり、これを実行するには

0

このステートメントに基づいて:それは休憩につながります。配列に他のヌル値があるかどうかを調べるためにforループに戻ることなく、メソッドからあなたを追い出す。

あなたは休憩がどこにあるかを続けたいと思うようです。 (上から下へ)読まれるためにループ内のコードを引き起こします継続しながら、私は(この場合は)1つインクリメントして

ブレークは、破るためにループのための答えを皆のため

関連する問題