Чистый JavaScript - цикл работает с элементами [0], но не с элементами [i]

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

Когда вы вызываете 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
 }

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

2
задан EricBln 26 February 2019 в 13:16
поделиться

4 ответа

Вы также можете использовать анонимную функцию, если вам нужна поддержка 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]);
    }
}
0
ответ дан deathangel908 26 February 2019 в 13:16
поделиться

Объявите переменную с let вместо var, что создаст отдельную область.

for (let i=0; i<allToggleBs.length; i++)
0
ответ дан Mamun 26 February 2019 в 13:16
поделиться

Я думаю, что вы теряете контекст 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();});
0
ответ дан José Antonio Postigo 26 February 2019 в 13:16
поделиться

Объявите переменную с let вместо var. Вы можете использовать

for (let i=0; i<allToggleBs.length; i++)
0
ответ дан Khushal Agarwal 26 February 2019 в 13:16
поделиться
Другие вопросы по тегам:

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