Это:
try (Scanner scanner = new Scanner(System.in)) {
// ...
}
- это блок проб с ресурсами.Когда блок завершит выполнение, он вызовет scanner.close()
.
. Проблема с этим для вашего случая использования в том, что сканер, в свою очередь, вызывает System.in.close()
.После того, как поток был закрыт, вы не можете читать его снова, поэтому вы получите исключение при попытке создать другое чтение сканера из System.in
впоследствии.
Самое простое исправление вашего кода -объединить два блока try-with-resources и повторно использовать один и тот же сканер, чтобы не закрывать его между ними.В любом случае нет веской причины иметь два отдельных сканера.
Но на самом деле вам вообще не следует использовать try-with-resources.
Общее правило: незакройте поток, который вам не принадлежит , что примерно означает не закрывайте поток, который вы не открыли , учитывая, что в Java нет понятия «владение».Вы не открыли System.in
, JVM открыла.
Вы не знаете, что еще в вашей программе полагается на то, что она продолжает открываться.Если вы закроете такой поток, вы испортите состояние потока для будущих читателей потока.
Теперь вы можете подумать , что вам нужно использовать twr, потому что ваша IDEв противном случае помечает предупреждение о утечке ресурсов на сканере.Как правило, вы можете закрыть сканер;в этом конкретном случае вы этого не сделаете.Игнорируйте (или подавляйте) это предупреждение, если именно поэтому вы используете twr.