Следующая строка неверна:
if (c[nChoice] == null || nChoice < 0 && nChoice >= c.length) {
Вы хотите изменить ее следующим образом:
if (nChoice < 0 || nChoice >= c.length || c[nChoice] == null) {
Есть два изменения: (1) &&
стал ||
;(2) пункты были переупорядочены.
(1) &&
неверен, поскольку nChoice < 0 && nChoice >= c.length
всегда оценивается как false
, поскольку nChoice
не может быть одновременно меньше нуля и больше чемc.length
(Спасибо, @Aleks G!)
(2) В исходной версии вы пытаетесь получить доступ к c[nChoice]
, прежде чем убедиться, что nChoice
находится в пределах c
.Если это не так, это приведет к ArrayIndexOutOfBoundsException
вместо распечатки «Неверный ввод».
Оценка короткого замыкания является причиной, по которой порядок предложений имеет значение.
Наконец, перед чтением из input
вы можете вызвать hasNextInt()
, чтобы убедиться, что следующий токен может быть интерпретирован как допустимое целое число.