Как остановить событие NoSuchElementException? [Дубликат]

Вам нужно использовать общедоступные свойства из Main, а не пытаться напрямую изменять внутренние переменные.

40
задан fortune 24 October 2012 в 03:04
поделиться

3 ответа

Это действительно озадачило меня какое-то время, но это то, что я нашел в конце.

Когда вы вызываете sc.close() в первом методе, он не только закрывает ваш сканер, но и закрывает ваш System.in. Вы можете проверить его, напечатав его статус в верхней части второго метода как:

    System.out.println(System.in.available());

Итак, теперь, когда вы повторно создаете экземпляр Scanner во втором методе, он не находит открытого 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.**

Единственный хорошим решением для вашей проблемы является инициирование Scanner в вашем основном методе, передать это как аргумент в ваших двух методах и снова закрыть его в основном методе, например:

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
 }

Надеюсь, это даст вам некоторое представление о сбое и возможном разрешении.

94
ответ дан Half Genius 22 August 2018 в 01:25
поделиться
  • 1
    Спасибо за ответ. Ваше объяснение того, что на самом деле происходит за кулисами, очень полезно – fortune 24 October 2012 в 13:20
  • 2
    Благодарю за ваш ответ. Это действительно так! – d3vpasha 28 April 2016 в 19:52
  • 3
    О, боже, я так долго застрял, пока не нашел этот пост. Спасибо огромное! Ты восхитителен. – Jake Stokes 10 August 2017 в 11:51

После этой строки:

qty = scan.nextInt();

Всегда добавляйте еще одну строку для очистки сканера:

scan.nextLine();

Кроме того, используйте

sc.nextLine();

вместо

sc.next();
0
ответ дан Lai Xin Chu 22 August 2018 в 01:25
поделиться
  • 1
    Добавлено scan.nextLine (); и изменил sc.next () на sc.nextLine () ;, но я все еще получаю ошибку. – fortune 24 October 2012 в 03:49

Проблема заключается в

Когда сканер закрыт, он закрывает свой входной источник, если источник реализует интерфейс Closeable.

http://docs.oracle.com/javase/1.5.0/docs/api/java/util/Scanner.html

Таким образом, scan.close() закрывает System.in.

Чтобы исправить это, вы можете сделать

Scanner scan static и не закрывать его в 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);   
}

static Scanner scan;

public static void PromptCustomerQty(Customer customer, ArrayList<Product> ProductList)               {
// Initiate a 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

}

public static void PromptCustomerPayment (Customer customer) {
// Variables
String payment = "";

// Prompt User
do {
System.out.println("Would you like to pay in full? [Yes/No]");
System.out.print("> ");

payment = scan.next();

} while ((!payment.toLowerCase().equals("yes")) && (!payment.toLowerCase().equals("no")));

// Check/set result
if (payment.toLowerCase() == "yes") {
    customer.setPaidInFull(true);
}
else {
    customer.setPaidInFull(false);
}
}

На боковой ноте вы не должны использовать == для сравнения строк, вместо этого используйте .equals.

17
ответ дан user 22 August 2018 в 01:25
поделиться
  • 1
    Но они находятся в разных методах правильно? Где они созданы и закрыты. – Bhesh Gurung 24 October 2012 в 03:24
  • 2
    В исходном коде они есть. В фиксированном коде я использую один экземпляр сканера для обоих методов. – user 24 October 2012 в 03:25
  • 3
    Я все еще озадачен тем, почему sc.next() или даже sc.nextLine() во втором методе вызывают исключение. – Yogendra Singh 24 October 2012 в 03:25
  • 4
    @YogendraSingh: Является ли nextLine () также тем же исключением? – Bhesh Gurung 24 October 2012 в 03:26
  • 5
    @Bhesh Gurung: да это редактирование: я стою исправлен – user 24 October 2012 в 03:28
Другие вопросы по тегам:

Похожие вопросы: