2016-06-24 8 views
2

私はちょうどJavaの70ビデオシリーズを見てきました。トレーニングホイールを取り外す時間ですので、クラスの2つのテキスト入力を取る非常に簡単なプログラムを作っています。それはCarの最初の作成を動作させますが、2番目のエラーをスローします。なぜ私は理解できません。スキャナーはセカンドクラスの読み込みで失敗する

import java.util.Scanner; 

class Car{ 

    public int cost; 
    public double mpg; 

    public void enterInfo() { 
     Scanner reader = new Scanner(System.in); // Reading from System.in 
     System.out.println("Enter cost: "); 
     this.cost = reader.nextInt(); // Scans the next token of the input as an int. 
     System.out.println("Enter MPG: "); 
     this.mpg = reader.nextDouble(); 
     reader.close(); 
    } 




} 

public class App { 

    public static void main(String[] args) { 

     Car car1 = new Car(); 
     car1.enterInfo(); 

     Car car2 = new Car(); 
     car2.enterInfo(); 

     System.out.println(car1.cost); 
    } 

} 

は、ここでの問題は、あなたがそれから最初Carオブジェクトを読んだ後、スキャナをクローズしていることであるエラー

Exception in thread "main" java.util.NoSuchElementException 
    at java.util.Scanner.throwFor(Unknown Source) 
    at java.util.Scanner.next(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at java.util.Scanner.nextInt(Unknown Source) 
    at uda01.Car.enterInfo(App.java:13) 
    at uda01.App.main(App.java:32) 
+3

は1台のスキャナを使用し、 ' – Reimeus

+0

ああ、今理にかなって一番最後にそれをclose'。 –

+0

関連:http://stackoverflow.com/questions/14962082/close-scanner-without-closing-system-in – Caramiriel

答えて

1

です。あなたがいることを行うと、Scannercloses its underlying stream、すなわちSystem.in

その根底にある読み込み可能な場合には、このスキャナがまだ閉じられていない場合にも、その後の読み近いメソッドが呼び出されますCloseableインタフェースを実装しています。

これが、2回目の読み取りが失敗した理由です。

public static void main(String[] args) { 
    Car car1 = new Car(); 
    Car car2 = new Car(); 
    // Try with resource automatically closes your Scanner 
    try(Scanner scanner = new Scanner(System.in)){ 
     car1.enterInfo(scanner); 
     car2.enterInfo(scanner); 
    } 
    System.out.println(car1.cost); 
    System.out.println(car2.cost); 
} 
+0

非常に感謝しています。 –

+1

@TylerRinkerよろしくお願いします!ところで、これは新しいプログラミング言語のビデオコースの後の最初のプログラムにとってはとても良いことです。一つの静的メソッドで 'enterInfo'と' new Car() 'を組み合わせることで、' car car1 = enterInfo(scanner) 'と' new Car() 'を' enterInfo' 。 – dasblinkenlight

1

私はちょうどdasblinkenlightと同じことを言いたかった。この問題を解決するために

一つの方法は、mainが終わったら、あなたのmainScannerを作るenterInfoに渡し、そして近いことです。このメソッドを呼び出すたびにスキャナを作成すべきではありません。より適切な方法はScanner as a paramを送信することです。 だから、あなたは自分のコードを更新できます。

public class Car { 
    public int cost; 
    public double mpg; 

    public void enterInfo(Scanner reader) { 
     System.out.println("Enter cost: "); 
     this.cost = reader.nextInt(); // Scans the next token of the input as an int. 
     System.out.println("Enter MPG: "); 
     this.mpg = reader.nextDouble(); 
    } 
} 


public class App { 
    public static void main(String[] args) { 
     try (Scanner reader = new Scanner(System.in)) { 
      Car car1 = new Car(); 
      car1.enterInfo(reader); 

      Car car2 = new Car(); 
      car2.enterInfo(reader); 

      System.out.println(car1.cost); 
     } 
    } 
} 
+0

追加情報はありがとうございます。非常に役立ちます。 –

関連する問題