JavaRush /Java Blog /Random-TL /Mga pagbubukod sa Java
Roman
Antas

Mga pagbubukod sa Java

Nai-publish sa grupo
Nang makita ko ang paksang "Mga Pagbubukod," maraming tanong ang lumitaw kung saan kailangan kong maghanap ng mga sagot sa iba't ibang sulok ng Internet upang maunawaan nang detalyado kung paano gumagana ang lahat. Bilang resulta, nag-compile ako ng sarili kong paliwanag, na maaaring mas mauunawaan para sa mga baguhan na nakatagpo lamang ng hindi pangkaraniwang bagay na ito. Исключения в Java - 1Sa mga computer, ang interrupt ay isang papasok na signal sa processor na may nagaganap na kaganapan na nangangailangan ng agarang tugon. Ang isang interrupt na signal ay nangangailangan ng processor na i-pause ang isang tumatakbong programa upang maipagpatuloy ito nang kaunti mamaya, iyon ay, dapat tandaan ng computer ang lahat ng impormasyon na nauugnay sa pagpapatupad ng programa. Ang ganitong mga pagkaantala ay pansamantala, kung hindi man nakamamatay. Ang ganitong mga pagkaantala ay maaaring sanhi ng alinman sa program code o ng ilang functionality ng hardware (halimbawa, simpleng pagpindot sa mga key sa keyboard; mga timer, halimbawa, upang awtomatikong patayin ang computer). Ang bilang ng mga Interrupts ay limitado sa isang tiyak na numero, na binuo sa paggawa ng isang partikular na processor, iyon ay, ang mga espesyal na "channel" ng komunikasyon ay inilalaan para dito, na nagpapahintulot sa iyo na ma-access ang processor na lumampas sa lahat ng iba pang mga proseso. Awtomatikong nabubuo din ang mga interrupt kapag may naganap na error sa code ng pagpapatupad ng program (halimbawa, kung may naganap na dibisyon sa zero). Ang ganitong mga pagkaantala ay tradisyonal na tinatawag na mga bitag o mga eksepsiyon . Sa ganitong mga kaso, kaugalian na sabihin: "Ang pagbubukod ay itinapon," iyon ay, ang isang Pagbubukod ay na-trigger o ang isang Pagbubukod ay itinapon (itinapon), iyon ay, isang kahilingan para sa isang Interrupt. с вопросом «что делать?» послан процессору. В этот момент процессор останавливает работу, запоминая точку, в которой он остановился, точнее кластер следующей ячейки, информация из которой должна быть выполнена. Запоминается вся цепочка выполненных инструкций и НЕ выполненных. После чего, процессор считывает из памяти инструкции для действий при подобной ошибке. В соответствии с этой инструкцией, он может занести новые значения в определённые кластеры, добавить некоторые цепочки действий or новый цикл (например, цикл возврата or кольцевания) и т.д., то есть в зависимости от ошибки выполняются ранее заложенные инструкции. В систему компьютера само по себе встроено много автоматических Прерываний, которые запускаются через определённое количество времени, например, для контроля запущенных на компьютере процессов or выполнения заложенных будильников, сбора входящих внешних сигналов, различных конвертеров данных. Стоит помнить, что большое количество Прерываний по ряду причин, может окончательно «повесить» систему. Ошибка в программном codeе вызовет в автоматическом режиме Прерывание в процессоре, которое тот попробует обработать в соответствии с заложенными инструкциями. Но не для всех прерываний заложена их обработка or она может выдавать proceduresу, которая нас не устраивает, например, просто свернёт приложение. Поэтому в программировании существует возможность организовать собственное прерывание для определённого участка codeа, в котором программист потенциально видит вероятность наличия ошибки. В этом случае ошибка обработается внутри программы и не будет обращаться за инструкциями по обработке к процессору. Задание таких блоков организуется созданием Объекта «Исключение» (Exception). Этот an object автоматически создаётся в блоке try-catch. В блоке >tryпроизводится проверка на наличие ошибки и, если она есть, программа следует в блок catch, где производятся действия предупреждающие or нивелирующие ошибку. Например, если мы вводим с клавиатуры Числа, которые должны в последствии складываться и вычитаться, то введение с клавиатуры Букв приведёт к невозможности их сложения с Числами (обозначим сумму этих двух переменных буквой S). Поэтому в команде try мы должны проверить способно ли число А, содержащее Цифры, быть сложено с числом Б, содержащим Буквы (то есть S = А + Б ), и если это невозможно, а это невозможно, то должны быть приняты определённые меры, чтобы Ошибки НЕ произошло и к процессору не полетело новое Прерывание с вопросом «что делать?». В случае отсутствия в программе Исключения, её выполнение прервётся процессором. При наличии Исключения, когда оно «поймано» командой try, управление переходит команде catch, которая может задать альтернативный вариант решения, например, не будем складывать эти два числа, а зададим S = А.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 } catch (Exception igogo1) {
   S = a;
 }
 return S;
/* строка «int r = 1;» не выполняется, так How случилась ошибка и программа перенаправляет работу сразу к обработчику исключения блок catch*/ Таким образом, наличие Исключений – это возможность решить проблему внутри программы, не забрасывая её на уровень процессора. В an object «Исключение», который автоматически создаётся в блоке try при обнаружении ошибки, заносится meaning типа ошибки. Назовём его «НашеИсключение» – для нашего конкретного случая с описанием нашей конкретной ошибки. Создатели языка Java, заранее создали некоторый список типовых ошибок и типовые варианты их исправления, то есть в java существует некоторая библиотека Исключений, к которой мы можем обратиться для обработки случившейся ошибки, чтобы самим не писать code обработки и поэтому НашеИсключение скорее всего уже кем-то было описано, поэтому нам надо просто знать название Howого из этих исключений вставить в нашу программу для обработки codeа, где потенциально может случиться сбой. Если мы ошибёмся и выберем из библиотеки неверное Исключение, то обработчик его не «поймает», ошибка не найдёт решения внутри программы и полетит request к процессору. Но существует путь для ленивых. Если мы не знаем название нужного нам исключения из библиотеки, то можем взять общее с названием «Exception», How в вышеописанном примере. Это Исключение способно обработать любой тип ошибки, только не способно выдать конкретную информацию о происшествии, которое мы могли бы занести в логи. Библиотека ранее написанных Исключений состоит из проверяемых (checked) и непроверяемых (unchecked) Исключений. Проверяемые – это те, которые можно поправить, не обрывая работу программы, то есть, если мы пытаемся открыть файл в папке, в которой его нет, то система даст нам об этом знать, мы можем закинуть файл в нужную папку и продолжить работу программы. То есть по факту к процессору послан request на Прерывание, но без вопроса: «ищи, что делать с этой проблемой?!?!». Мы послали Прерывание, которое сами обнаружor, с готовой инструкцией, которую процессор обработал и продолжил выполнение программы. Непроверяемые – это те ошибки, которые нельзя поправить и программа будет закрыта до своего завершения, то есть к процессору полетит request на Прерывание, которое в любом случае оборвёт выполнение программы. Единственный смысл прописывать такие исключения в программе – это дать пользователю понять, что произошло, так How, поймав это прерывание, мы можем вывести информационное сообщение на экран из-за чего программа свернулась. Второй причиной ловить такие прерывания является возможность занести их в логи для последующего анализа (вас хакнули, но зато вы знаете через Howое место). Следствием наличия подобных библиотек является необходимость не забыть их подключить. (Список проверяемых и непроверяемых Исключений с библиотеками можно посмотреть, например, здесь) Если мы не знаем точно Howую библиотеку включить or существует несколько вариантов ошибки, то можем в нескольких catch перечислить нужные Исключения. Система сама выберет правильный обработчик, если он есть в списке. Вместо конкретного Исключения можно написать общее «Exception», которое может обработать любой тип Исключения, если оно не обработалось в предыдущих блоках.
int a = 4;
String b = “hello”;
int S = 0;
 try {
   S = a + b;
   int r = 1;
 }
catch(NullPointerException blabla2) {
   System.out.println("Exception handling code for the NullPointerException.");
 }
catch (ArithmeticException ex1) {
   S = a;
 }
catch(Exception uups1) {
   System.out.println("Exception occured");
 }
 return S;
В случае наличия блока try Исключение создаётся автоматически. Если нам надо принудительно в Howой-то момент времени вызвать Исключение, то используется команда throw. То есть мы самостоятельно создаём an object new throw… после чего, программа останавливает свою работу, посылает процессору request на Прерывание и переносится к разделу программы catch, откуда пытается почерпнуть инструкции по дальнейшим действиям. Создавая вручную Исключение, мы можем указать его конкретный тип из библиотеки:

throw new ArithmeticException("Access denied - You must be at least 18 years old.");
тогда обработчик будет искать блок catch, с именно этим Исключением – искать по всей программе, по всем бокам catch. После команды throw обработки Исключения, весь оставшийся code программы НЕ будет выполнен, за исключением того, который находится в блоке catch. Если обработчик в программе не найден, процессору задаётся вопрос: «решай сам, что делать» и тот прерывает программу. Вызов new throw… может производиться How в блоке >try, так и вне его (в любом месте программы)
try {
   /* функция or действие, в котором есть сомнения. То есть: «попробуй выполнить это, а если не получится, а, если не получится, запускай режим исключения» */
   throw new CallForException(); /* Назначаем исключение, которое будет работать в случае наличия ошибки в функции, описанной выше. Здесь исключение «CallForException» - берется из библиотеки существующих исключений */
} catch (CallForException ee1) {
   /* Корректируем ошибку, чтобы программа не «отвалилась» or выводим сообщение об ошибке or что-то ещё */
} finally {
   /* этот блок работает всегда независимо от того была ошибка or нет. А если была, то сработало ли решение в catch or нет */
   /* часто используется для подчистки хвостов, например, для закрытия запущенного file or базы данных */
   /* в ряде случаев блок catch вообще может быть опущен и оставлен только блок finally и наоборот finally может быть опущен и оставлен только catch */
   /* Не допускается использование этого блока в ряде случаев, например, когда функция System.exit() запущена or другие системные Исключения, типа «отключение электроэнергии» и т.п. */
}

Оповещение о наличии Исключения

Ранее написанные кем-то методы могут включать в себя вызов Исключений. Просто на всякий случай программист, который писал code, предупредил последующих программистов, что в написанном им методе может случится ошибка. Так, например, метод создания file, описанный ниже, предусматривает, что при создании file может произойти ошибка (нет file по заданному пути), а значит нужен будет её обработчик:
public void createFile(String path, String text) throws IOException {
    FileWriter writer = new FileWriter(path, true);
    writer.write(text);
    writer.close();
}
Но при этом самого обработчика нет, а значит теперь просто вызвать написанный метод в своей программе в обычном режиме мы не сможем. Теперь мы обязаны написать обработчик ошибки и вызывать этот метод в блоке try:
String filePath = "hello.txt";
String text = "Hello World";

try {
    createFile(filePath, text);
} catch (IOException ex) {
    System.err.println("Error creating file: " + ex);
}

Собственные исключения

Существует возможность написать собственные исключения для обработки тех or иных ошибок, если нам недостаточно уже существующих библиотек. Для этого мы просто создаём класс-наследник от класса Исключения
public class StudentNotFoundException extends Exception {

    public StudentNotFoundException (String message) {
        super(message);
    }
}
При создании собственных исключений следует учитывать два правила:
  1. Название нашего класса должно оканчиваться на «Exception»
  2. Класс должен содержать конструктор со строковой переменной, описывающей детали проблемы Исключения. В конструкторе вызывается супер-конструктор с передачей messages.
Пример использования созданного исключения:
public class StudentManager {
    public Student find(String studentID) throws StudentNotFoundException {
        if (studentID.equals("123456")) {
            return new Student();
        } else {
            throw new StudentNotFoundException(
                "Could not find student with ID " + studentID);
        }
    }
}
Отлавливаем это Исключение codeом:
public class StudentTest {
    public static void main(String[] args) {
        StudentManager manager = new StudentManager();
         try {
            Student student = manager.find("0000001");
        } catch (StudentNotFoundException ex) {
            System.err.print(ex);
        }
    }
}
Результатом выполнения программы будет: StudentNotFoundException: Could not find student with ID 0000001

Зачем нужно писать Исключения

В 1996 году разбилась ракета Ariane 5 из-за неверной конвертации переменной float в переменную integer. Исключений и обработчиков этой ситуации предусмотрено не было. Если при загрузке file произошел обрыв связи с интернетом, то наличие Исключения позволит продолжить закачку, после того How соединение восстановится. При отсутствии Исключения закачку придётся начинать заново.

Использованная литература:

Mga komento
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION