C# “Используя” синтаксис

Вы вызываете 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 ...

46
задан Jeff Atwood 11 April 2009 в 21:52
поделиться

10 ответов

операторы использования не едят исключения.

Весь "Используя" делает определить объем Вашего объекта к блоку использования, и автоматически звонит, Располагают () на объекте, когда это оставляет блок.

существует глюк, хотя, если поток сильно прерывается внешним источником, возможно, что Располагают, никогда не будет называться.

32
ответ дан FlySwat 26 November 2019 в 20:09
поделиться

Когда Вы видите оператор использования, думаете об этом коде:

StreadReader rdr = null;
try
{
    rdr = File.OpenText("file.txt");
    //do stuff
}
finally
{
    if (rdr != null)
        rdr.Dispose();
}

, Таким образом, реальный ответ - то, что это ничего не делает за исключением, добавленным тело блока использования. Это не обрабатывает его или повторно бросает его.

62
ответ дан Community 26 November 2019 в 20:09
поделиться

Это выдает исключение, таким образом, или Ваше содержание метода должно обработать его или передать его стек.

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! 
}
5
ответ дан stephenbayer 26 November 2019 в 20:09
поделиться

using позволяет исключению кипеть через. Это действует как попытка/наконец, где наконец располагает используемый объект. Таким образом это является только соответствующим/полезным для объектов та реализация IDisposable.

16
ответ дан Chris Marasti-Georg 26 November 2019 в 20:09
поделиться

Любые исключения, которые выдаются в выражении инициализации оператора использования, распространят объем метода и стек вызовов как ожидалось.

Одна вещь не упустить, тем не менее, состоит в том что, если исключение произойдет в выражении инициализации, то Расположение () метод не назовут на переменной выражения. Это - почти всегда поведение, которое Вы хотели бы, так как Вы не хотите потрудиться располагать объект, который не был на самом деле создан. Однако при сложных обстоятельствах могла быть проблема. Таким образом, если несколько инициализаций прокладываются под землей в конструкторе, и некоторые успешно выполняются до выданного исключения, то Расположить вызов не может произойти в той точке. Это обычно - не проблема, тем не менее, так как конструкторы обычно сохраняются простыми.

3
ответ дан Jeffrey L Whitledge 26 November 2019 в 20:09
поделиться

Если Вы конкретно не ловите исключение, оно подброшено стек, пока что-то не делает

2
ответ дан hometoast 26 November 2019 в 20:09
поделиться

using гарантии* созданный объект будет расположен в конце блока, даже если исключение будет выдано. Исключение не поймано. Однако необходимо быть осторожны относительно того, что Вы делаете, при попытке поймать его сами. Так как любой код, который ловит исключение, выходит за рамки блок, определенный using оператор, Ваш объект не будет доступен тому коду.

*barring обычные подозреваемые как сбой питания, ядерный Холокост, и т.д.

2
ответ дан Joel Coehoorn 26 November 2019 в 20:09
поделиться

Использование не вмешивается в обработку исключений кроме чистки материала в его объеме.

Это не обрабатывает исключения, но позволяет исключениям пройти.

2
ответ дан tpower 26 November 2019 в 20:09
поделиться

"использование" не ловит исключения, оно просто избавляется от ресурсов в случае необработанных исключений.

, Возможно, вопрос, он избавился бы от ресурсов, выделенных в круглых скобках, если бы ошибка также произошла в объявлении? Трудно вообразить оба случая, все же.

0
ответ дан harpo 26 November 2019 в 20:09
поделиться

Можно вообразить использование как попытка... наконец блок без блока выгоды. В наконец блоке, IDisposable. Расположите назван, и так как нет никакого блока выгоды, любые исключения подброшены стек.

1
ответ дан petr k. 26 November 2019 в 20:09
поделиться
Другие вопросы по тегам:

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