Java while catch exception

Обработка исключений try-catch в Java

В предыдущем уроке мы обсуждали, что такое обработка исключений и почему мы это делаем. В этом уроке мы увидим блок try-catch, который используется для их обработки.

Блок try

Содержит набор операторов, в которых может возникнуть исключение. За этим блоком всегда следует блок catch, который обрабатывает возникающее исключение.

За блоком try должны следовать блоки catch или блок finally или оба.

Синтаксис блока try

При написании программы, если вы считаете, что определенные операторы в программе могут вызвать исключение, заключите их в блок try и обработайте это исключение.

Блок catch

В нем вы обрабатываете исключения, этот блок должен следовать за блоком try. С одним блоком try может быть связано несколько блоков catch. Вы можете ловить разные исключения в разных блоках catch. Когда в try возникает исключение, выполняется соответствующий catch, который обрабатывает это конкретное исключение. Например, если арифметическое исключение возникает в try, тогда выполняются операторы, заключенные в catch для него.

Синтаксис try catch

try < //statements that may cause an exception >catch(exception(type) e(object))‏ < //error handling code >

Пример

Если в блоке try возникает исключение, управление выполнением передается соответствующему блоку catch. С одним try может быть связано несколько catch, которые необходимо размещать таким образом, чтобы общий catch обработчика исключений был последним (см. пример ниже).

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

class Example1 < public static void main(String args[]) < int num1, num2; try < /* We suspect that this block of statement can throw * exception so we handled it by placing these statements * inside try and handled the exception in catch block */ num1 = 0; num2 = 62 / num1; System.out.println(num2); System.out.println("Hey I'm at the end of try block"); >catch(ArithmeticException e) < /* This block will only execute if any Arithmetic exception * occurs in try block */ System.out.println("You should not divide a number by zero"); >catch(Exception e) < /* This is a generic Exception handler which means it can handle * all the exceptions. This will execute if the exception is not * handled by previous catch blocks. */ System.out.println("Exception occurred"); >System.out.println("I'm out of try-catch block in Java."); > >
You should not divide a number by zero I'm out of try-catch block in Java.

Несколько блоков catch

Пример, который мы видели выше, имеет несколько блоков catch, давайте рассмотрим несколько правил для этого случая с помощью примеров.

  1. Один блок try может иметь любое количество блоков catch.
  2. Общий блок catch может обрабатывать все исключения. Будь то ArrayIndexOutOfBoundsException или ArithmeticException или NullPointerException или любой другой тип исключения.
Читайте также:  Titre de la page

Зачем нам нужны другие обработчики catch, когда у нас есть универсальный, который может обрабатывать все. Это связано с тем, что в нем отображаете сообщение, но нет уверенности, для какого типа исключения оно сработать. Поэтому оно будет отображать одно и то же сообщение для всех исключений, и пользователь может не понять, какое именно возникло исключение. Вот причина, по которой вы должны поместить его в конец всех блоков исключений

  1. Если в блоке try не возникает исключение, блоки catch полностью игнорируются.
  2. Соответствующие блоки catch выполняются для конкретного типа исключения: catch(ArithmeticException e) является блоком catch, который может обрабатывать ArithmeticException catch(NullPointerException e) является блоком catch, который может обрабатывать NullPointerException
  3. Вы также можете выбросить исключение. Это рассмотрено в других уроках: пользовательское исключение, ключевое слово throws, throw vs throws.

Пример нескольких блоков catch

class Example2 < public static void main(String args[])< try< int a[]=new int[7]; a[4]=30/0; System.out.println("First print statement in try block"); >catch(ArithmeticException e) < System.out.println("Warning: ArithmeticException"); >catch(ArrayIndexOutOfBoundsException e) < System.out.println("Warning: ArrayIndexOutOfBoundsException"); >catch(Exception e) < System.out.println("Warning: Some Other exception"); >System.out.println("Out of try-catch block. "); > >
Warning: ArithmeticException Out of try-catch block.

В приведенном выше примере есть несколько блоков catch, и эти блоки выполняются последовательно, когда в блоке try возникает исключение. Это означает, что если вы поместите последний блок catch(catch(Exception e)) на первое место, сразу после блока try, то в случае любого исключения этот блок будет выполнен, поскольку он может обрабатывать все исключения. Этот блок должен быть размещен в последнюю очередь, чтобы избежать таких ситуаций.

Finally block

На данный момент вам просто нужно знать, что этот блок выполняется независимо от того, происходит исключение или нет. Вы должны поместить операторы в блоки finally, которые должны выполняться независимо от того, происходит ли исключение или нет.

Источник

Как зациклить оператор try catch?

Как вы зацикливаете оператор try/catch? Я делаю программу, которая читает в файле с помощью сканера и читает его с клавиатуры. Так что я хочу, если файл не существует, программа скажет: «Этот файл не существует, попробуйте еще раз». затем введите тип пользователя в другое имя файла. Я попробовал пару разных способов попробовать это сделать, но все мои попытки заканчиваются сбойной программы. Вот что я

Ну, вам действительно нужно использовать for или while (или другие — in перед педантами ;-), чтобы зациклить.

5 ответов

Если вы хотите повторить попытку после сбоя, вам нужно поместить этот код внутри цикла; например что-то вроде этого:

boolean done = false; while (!done) < try < . done = true; >catch (. ) < >> 

(A do-while — немного более элегантное решение.)

Однако в этом контексте BAD PRACTICE поймает Exception . Он поймает не только те исключения, которые вы ожидаете (например, IOException ), но также и неожиданные, например NullPointerException и т.д., Которые являются признаками ошибки в вашей программе.

Лучшая практика заключается в том, чтобы поймать исключения, которые вы ожидаете (и можете обрабатывать), и позволять другим людям распространяться. В вашем конкретном случае достаточно ловли FileNotFoundException . (Это то, что объявляет конструктор Scanner(File) .) Если вы не использовали Scanner для ввода, вам может понадобиться вместо этого IOException .

Я должен исправить серьезную ошибку в голосующих ответах.

Это неверно, поскольку проверка наличия файла недостаточно:

  • файл может существовать, но у пользователя нет разрешения на его чтение,
  • файл может существовать, но быть каталогом,
  • файл может существовать, но быть недоступным из-за ошибки жесткого диска или аналогичного
  • файл может быть удален/отсоединен/переименован между тестом exists() test и последующей попыткой его открыть.
  • File.exists() ТОЛЬКО проверяет, что объект файловой системы существует с указанным путем, а не то, что он на самом деле является файлом или что пользователь имеет доступ к нему для чтения или записи.
  • Невозможно проверить, не завершится ли операция ввода-вывода из-за ошибок жесткого диска, ошибок сетевого диска и т.д.
  • Не существует решения проблемы с открытым или несвязанным/переименованным расом. Хотя это редко встречается при обычном использовании, такая ошибка может быть нацелена, если файл, о котором идет речь, является критическим для безопасности.

Правильный подход состоит в том, чтобы просто попытаться открыть файл и поймать и обработать IOException , если это произойдет. Это проще и надежнее, и, вероятно, быстрее. И для тех, кто сказал бы, что исключения не должны использоваться для «нормального управления потоком», это не нормальное управление потоком.

Источник

Конструкция try catch в цикле while. Зацикливается блок catch

Здравствуйте. Столкнулся с проблемой: при попытке запихнуть в цикл конструкцию try catch — зацикливается часть, расположенная в блоке catch.

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

Но при вводе любого значения, которое не соответствует типу int — зацикливается блок catch.

Буду очень признателен за помощь в решении.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34
import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner sc1 = new Scanner(System.in); System.out.println("Введите длинну списка:"); int number = 0; while (number  1) { try { number = sc1.nextInt(); if (number  1) { System.out.println("Введите натуральное число (целое число больше нуля)"); continue; } else { break; } } catch(Exception e ) { System.out.println("Введите натуральное число (вы ввели символ)"); } } } }

Источник

Оцените статью