Вы вызываете sc.next()
несколько раз - поэтому, если вход не 1, он будет ожидать большего ввода, чтобы увидеть, будет ли вход next равен 2 и т. д. Каждый вызов sc.next()
будет ждать ввода more . Он не имеет ни малейшего представления о том, что «это не тот вход, который вы искали, поэтому я буду возвращать то же значение при следующем вызове».
Используйте локальную переменную, чтобы сохранить результат sc.next()
while (true) {
String next = sc.next();
if (next.equals("1"))
System.out.println("--1--");
else if (next.equals("2"))
System.out.println("--2--");
else if (next.equals("3"))
System.out.println("--3--");
else if (next.equals("4"))
System.out.println("--4--");
else if (next.equals("help"))
System.out.println("--help--");
}
Также рассмотрите использование инструкции switch ...
операторы использования не едят исключения.
Весь "Используя" делает определить объем Вашего объекта к блоку использования, и автоматически звонит, Располагают () на объекте, когда это оставляет блок.
существует глюк, хотя, если поток сильно прерывается внешним источником, возможно, что Располагают, никогда не будет называться.
Когда Вы видите оператор использования, думаете об этом коде:
StreadReader rdr = null;
try
{
rdr = File.OpenText("file.txt");
//do stuff
}
finally
{
if (rdr != null)
rdr.Dispose();
}
, Таким образом, реальный ответ - то, что это ничего не делает за исключением, добавленным тело блока использования. Это не обрабатывает его или повторно бросает его.
Это выдает исключение, таким образом, или Ваше содержание метода должно обработать его или передать его стек.
try
{
using (
StreamReader rdr = File.OpenText("file.txt"))
{ //do stuff
}
}
catch (FileNotFoundException Ex)
{
// The file didn't exist
}
catch (AccessViolationException Ex)
{
// You don't have the permission to open this
}
catch (Exception Ex)
{
// Something happened!
}
using
позволяет исключению кипеть через. Это действует как попытка/наконец, где наконец располагает используемый объект. Таким образом это является только соответствующим/полезным для объектов та реализация IDisposable
.
Любые исключения, которые выдаются в выражении инициализации оператора использования, распространят объем метода и стек вызовов как ожидалось.
Одна вещь не упустить, тем не менее, состоит в том что, если исключение произойдет в выражении инициализации, то Расположение () метод не назовут на переменной выражения. Это - почти всегда поведение, которое Вы хотели бы, так как Вы не хотите потрудиться располагать объект, который не был на самом деле создан. Однако при сложных обстоятельствах могла быть проблема. Таким образом, если несколько инициализаций прокладываются под землей в конструкторе, и некоторые успешно выполняются до выданного исключения, то Расположить вызов не может произойти в той точке. Это обычно - не проблема, тем не менее, так как конструкторы обычно сохраняются простыми.
Если Вы конкретно не ловите исключение, оно подброшено стек, пока что-то не делает
using
гарантии* созданный объект будет расположен в конце блока, даже если исключение будет выдано. Исключение не поймано. Однако необходимо быть осторожны относительно того, что Вы делаете, при попытке поймать его сами. Так как любой код, который ловит исключение, выходит за рамки блок, определенный using
оператор, Ваш объект не будет доступен тому коду.
*barring обычные подозреваемые как сбой питания, ядерный Холокост, и т.д.
Использование не вмешивается в обработку исключений кроме чистки материала в его объеме.
Это не обрабатывает исключения, но позволяет исключениям пройти.
"использование" не ловит исключения, оно просто избавляется от ресурсов в случае необработанных исключений.
, Возможно, вопрос, он избавился бы от ресурсов, выделенных в круглых скобках, если бы ошибка также произошла в объявлении? Трудно вообразить оба случая, все же.
Можно вообразить использование как попытка... наконец блок без блока выгоды. В наконец блоке, IDisposable. Расположите назван, и так как нет никакого блока выгоды, любые исключения подброшены стек.