Это действительно озадачило меня какое-то время, но это то, что я нашел в конце.
Когда вы вызываете 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
}
Надеюсь, это даст вам некоторое представление о сбое и возможном разрешении.
Вы также можете использовать анонимную функцию, если вам нужна поддержка es3:
function openSubNavs2()
{
var allToggleBs = document.querySelector('ul#nav').getElementsByTagName('b');
for (var i=0; i<allToggleBs.length; i++)
{
(function(toggleB) {
toggleB.addEventListener('click', function() {
toggleB.className = 'show';
});
})(allToggleBs[i]);
}
}
Объявите переменную с let
вместо var
, что создаст отдельную область.
for (let i=0; i<allToggleBs.length; i++)
Я думаю, что вы теряете контекст i
. Вы можете объявить переменную i с помощью let
вместо var
. Или все еще используя ES5, оборачивая i
в замыкание (поэтому i
не изменит свое значение):
function openSubNavs2()
{
var allToggleBs = document.querySelector('ul#nav').getElementsByTagName('b');
for (var i=0; i<allToggleBs.length; i++)
{
(function(i) {
var toggleB = allToggleBs[i];
toggleB.addEventListener('click', function()
{
toggleB.className = 'show';
});
})(i);
}
}
window.addEventListener('load', function() {openSubNavs2();});
Объявите переменную с let
вместо var
. Вы можете использовать
for (let i=0; i<allToggleBs.length; i++)