Приветствую Вас ГостьВторник, 14.05.2024, 13:46

Программирование на Java, Android, Delphi


Блог

Главная » 2013 » Январь » 30 » Обработка исключений в Java
15:58
Обработка исключений в Java
Java поддерживает обработку исключений. Исключение — это объект, который передается блоку обработки исключений. Все объекты исключения наследуются от суперкласса Trowable. От него наследются 2 класса: Error (системные ошибки) и Exception (логические ошибки). Мы в программе обрабатываем объекты класса Exception и его подклассы.
Блок try могут обрабатывать несколько блоков catch. Обрабатывать будет первый блок, который сможет обработать ошибку, все остальные пропускаются. При этом обработка для ошибки суперкласса не может стоять раньше блока с  обработкой ошибки-подкласса. Так как в этом случае код обработки ошибки-подкласса будет недостижимым. Пример использования:
 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
int a, b;
a = 10; b = 0;


try{
//вызываем ошибку доступа к массиву
int[] arr = new int [10];
arr[10] = 0;
}

catch(ArithmeticException e){
JOptionPane.showMessageDialog(null, e + " in ArithmeticException");
}

catch(ArrayIndexOutOfBoundsException e){
JOptionPane.showMessageDialog(null, e + " in ArrayIndexOutOfBoundsException");
}

catch(Exception e){
JOptionPane.showMessageDialog(null, e + " in Exception");
}

JOptionPane.showMessageDialog(null, "Продолжаем после catch");
}
Операторы try допускается вкладывать один внутрь другого. Если возникает ошибка во внутреннем блоке и она не может быть обработана внутренним блоком, то делается попытка обработать внешним блоком и так вверх по стеку. В конце концов если ошибка не будет обработана пользовательским кодом, её обработает система Java. Пример вложенных блоков try:
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 
int a, b;
a = 10; b = 0;

//внешний блок try
try{

//внутренний блок try
try{
//здесь - ошибка доступа к массиву
int[] arr = new int [10];
arr[10] = 0;
}

//обработка ошибок внутреннего блока rty
catch(ArithmeticException e){
JOptionPane.showMessageDialog(null, e + " Обработали ошибку внутренним блоком");

}
JOptionPane.showMessageDialog(null, "Продолжаем после обработки во внутреннем блоке");
}
//обработка ошибок внешнего блока try - он обработает ошибку
catch(ArrayIndexOutOfBoundsException e){
JOptionPane.showMessageDialog(null, e + " Обработали ошибку внешним блоком");
}

JOptionPane.showMessageDialog(null, "Продолжаем после обработки во внешнем блоке");
}
Мы можем создать объект-исключение, для того чтобы прекратить выполнение операторов и передать управление в блок обработки ошибок catch, для этого используется оператор throw.
 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 

//внешний блок try
try{
//внутренний блок try
try{
//генерируем исключение класса С (создаем объект исключения класса С)
throw new ExceptionC();
}
//этот блок обрабатывает ошибки класса A и все его подклассы, в том числе и C
catch(ExceptionA a){
JOptionPane.showMessageDialog(null, a.toString());
//снова генерируем ошибку класса С, для дальнейшей обработки во внешнем блоке
throw a;
}
}
//обработчик для ошибок класса С
catch(ExceptionC c){
JOptionPane.showMessageDialog(null, c.toString());
}

}
Если метод генерирует в своем теле объекты-исключения и не обрабатывает их, он обязан перечислить их классы после ключевого слова throws, чтобы вызывающий метод мог корректно обработать ошибки.
class ExceptionTest{
//если в методе генерируется объект исключение и он его не обрабатывает, то нужно указать тип исключения после throws
//для того, чтобы вызывающий метод (то есть внешний по отношению к этому) смог корректно его обработать
void A() throws ExceptionB{
throw new ExceptionB();
}

//можно задать после throws суперкласс объекта-исключения, генерируемого в данном методе
void B() throws Exception{
throw new ExceptionC();
}
}

Для корректного освобождения ресурсов используется блок finally. Этот блок выполняется независимо — произошло или нет исключение в блоке try. Блок try требует либо блок catch либо finally, либо оба эти блока.
 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 

try{
//создаем исключение
throw new RuntimeException();
}
finally{
JOptionPane.showMessageDialog(null, "Блок finally выполнится всегда");
}

}



void TestMethod() throws ExceptionC{

try{
throw new ExceptionC();
}
finally{
JOptionPane.showMessageDialog(null, "Блок finally выполнится всегда");
}

}
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {

try{
TestMethod();
}
catch(ExceptionC e){
JOptionPane.showMessageDialog(null, "Обработка исключения в catch");
}
}

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

try{
String str;
str = JOptionPane.showInputDialog("Введите число");

if(str == "1") {
//генерируем не проверяемое исключение
throw new RuntimeException();
}
else
if(str == "2") {
//генерируем не проверяемое исключение
throw new IllegalArgumentException();
}
else
if(str == "3"){
//генерируем не проверяемое исключение
throw new ArrayStoreException();
}

}
finally{
JOptionPane.showMessageDialog(null, "Блок finally выполнится всегда");
}

}



void TestMethod2() throws ClassNotFoundException, InterruptedException, ExceptionB{

try{
String str;
str = JOptionPane.showInputDialog("Введите число");

if(str == "1") {
//генерируем проверяемое исключение
throw new ClassNotFoundException();
}
else
if(str == "2") {
//генерируем проверяемое исключение
throw new InterruptedException();
}
else
if(str == "3"){
//генерируем проверяемое исключение
throw new ExceptionB();
}

}
finally{
JOptionPane.showMessageDialog(null, "Блок finally выполнится всегда");
}

}
Категория: Java (Общие вопросы) | Просмотров: 1506 | Добавил: alex | Теги: обработка исключений, исключения, Java, заказать программу, разработка программ в Рыбинске | Рейтинг: 5.0/3
Категории раздела
Java (Общие вопросы) [17]
Java (Библиотека, пакеты Java) [17]
Java (Разработка программного обеспечения на Java) [5]
Java (Среда разработки NetBeans) [5]
JSF + PrimeFaces [21]
Java EE [11]
Разное [3]
Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0
Форма входа
Поиск
Календарь
«  Январь 2013  »
ПнВтСрЧтПтСбВс
 123456
78910111213
14151617181920
21222324252627
28293031
Архив записей