[解決済み】 java.util.NoSuchElementException - ユーザー入力を読み取るスキャナ
質問
私はJavaを使うのは初めてですが、C#の使用経験はあります。私が抱えている問題は、コンソールからのユーザー入力を読み取ることにあります。
この部分のコードで "java.util.NoSuchElementException" というエラーに遭遇しています。
payment = sc.next(); // PromptCustomerPayment function
ユーザーの入力を得るための2つの関数があります。
- プロンプトCustomerQty
- プロンプトカスタマーペイメント
PromptCustomerQtyを呼び出さない場合は、このエラーは発生しませんので、スキャナで何か間違ったことをしていると思われます。以下は、私の完全なコード・サンプルです。ご協力をお願いします。
public static void main (String[] args) {
// Create a customer
// Future proofing the possabiltiies of multiple customers
Customer customer = new Customer("Will");
// Create object for each Product
// (Name,Code,Description,Price)
// Initalize Qty at 0
Product Computer = new Product("Computer","PC1003","Basic Computer",399.99);
Product Monitor = new Product("Monitor","MN1003","LCD Monitor",99.99);
Product Printer = new Product("Printer","PR1003x","Inkjet Printer",54.23);
// Define internal variables
// ## DONT CHANGE
ArrayList<Product> ProductList = new ArrayList<Product>(); // List to store Products
String formatString = "%-15s %-10s %-20s %-10s %-10s %n"; // Default format for output
// Add objects to list
ProductList.add(Computer);
ProductList.add(Monitor);
ProductList.add(Printer);
// Ask users for quantities
PromptCustomerQty(customer, ProductList);
// Ask user for payment method
PromptCustomerPayment(customer);
// Create the header
PrintHeader(customer, formatString);
// Create Body
PrintBody(ProductList, formatString);
}
public static void PromptCustomerQty(Customer customer, ArrayList<Product> ProductList) {
// Initiate a Scanner
Scanner scan = new Scanner(System.in);
// **** VARIABLES ****
int qty = 0;
// Greet Customer
System.out.println("Hello " + customer.getName());
// Loop through each item and ask for qty desired
for (Product p : ProductList) {
do {
// Ask user for qty
System.out.println("How many would you like for product: " + p.name);
System.out.print("> ");
// Get input and set qty for the object
qty = scan.nextInt();
}
while (qty < 0); // Validation
p.setQty(qty); // Set qty for object
qty = 0; // Reset count
}
// Cleanup
scan.close();
}
public static void PromptCustomerPayment (Customer customer) {
// Initiate Scanner
Scanner sc = new Scanner(System.in);
// Variables
String payment = "";
// Prompt User
do {
System.out.println("Would you like to pay in full? [Yes/No]");
System.out.print("> ");
payment = sc.next();
} while ((!payment.toLowerCase().equals("yes")) && (!payment.toLowerCase().equals("no")));
// Check/set result
if (payment.toLowerCase().equals("yes")) {
customer.setPaidInFull(true);
}
else {
customer.setPaidInFull(false);
}
// Cleanup
sc.close();
}
解決方法は?
これは本当にしばらく困惑していたのですが、最終的にこういうことがわかりました。
を呼び出すと。
sc.close()
最初のメソッドでは、スキャナを閉じるだけでなく
System.in
入力ストリームも同様です。このことは、2番目のメソッドの一番上にある.NETの状態を表示することで確認できます。
System.out.println(System.in.available());
では、次に再インスタンス化するとき。
Scanner
を使用すると、2 番目のメソッドでは、開いている
System.in
のストリームで、例外が発生します。
を再開する方法はないのだろうか。
System.in
というのも
public void close() throws IOException --> Closes this input stream and releases any system resources associated with this stream. The general contract of close is that it closes the input stream. A closed stream cannot perform input operations and **cannot be reopened.**
あなたの問題に対する唯一の良い解決策は、「Space」を起動することです。
Scanner
をメインメソッドで開き、それを2つのメソッドで引数として渡し、メインメソッドで再び閉じます(例)。
main
メソッドに関連するコードブロックです。
Scanner scanner = new Scanner(System.in);
// Ask users for quantities
PromptCustomerQty(customer, ProductList, scanner );
// Ask user for payment method
PromptCustomerPayment(customer, scanner );
//close the scanner
scanner.close();
あなたのメソッド
public static void PromptCustomerQty(Customer customer,
ArrayList<Product> ProductList, Scanner scanner) {
// no more scanner instantiation
...
// no more scanner close
}
public static void PromptCustomerPayment (Customer customer, Scanner sc) {
// no more scanner instantiation
...
// no more scanner close
}
これで、障害と可能な解決策について、何らかのヒントが得られると思います。
関連
-
[解決済み】"|="の意味は何ですか?(パイプ等号演算子)
-
[解決済み】Javaクラスの "型に解決できない"
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】どういう意味か。Serializableクラスがstatic final serialVersionUIDフィールドを宣言していないとは?重複している] [重複している] [重複している] [重複している
-
[解決済み】スキャナはnext()またはnextFoo()を使用した後、nextLine()をスキップしていますか?)
-
[解決済み] ngModel' は 'input' の既知のプロパティではないため、バインドできません。
-
[解決済み] HTML5でfloat入力タイプはありますか?
-
[解決済み] Javaでプレーンテキストファイルを読み込む
-
[解決済み] input type="date "のフォーマットを変更する方法はありますか?
-
[解決済み] Chromeのオートコンプリートで入力の背景色を削除する?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Doubleはdereferencedできない?
-
[解決済み】 java.lang.ClassNotFoundException: oracle.jdbc.driver.OracleDriver [重複]。
-
[解決済み】-XX:MaxPermSizeは何をするのですか?
-
[解決済み] メソッドがそのスーパークラスのメソッドをオーバーライドしない
-
[解決済み】Javaでユーザー入力を待機させる方法
-
[解決済み】純粋なJUnitテストにVisibleForTestingを使用する方法
-
[解決済み】予期しない型エラー
-
[解決済み] エラー - trustAnchors パラメータは空であってはなりません。
-
[解決済み】Javaの".class expected "について
-
[解決済み] "java.nio.charset.MalformedInputException" を避けるために、すべての包括的なCharset。入力の長さ= 1"?