本文是课上资料的总结非原创没有转载地址
目录
- 异常
-
- 1.异常的概念
-
- 什么是异常
- 2.异常的分类
-
- 常见运行时异常
- 3.异常的产生
- 4.异常的传递
- 5.异常的处理
-
- 异常处理try...catch
- 异常处理try...catch...finally
- 异常处理 多重catch
- 异常处理 多重catch
- 总结异常处理
- 6.声明异常
- 7.抛出异常
-
- 方法覆盖(重写)
- 8.自定义异常
- 总结
- 面试题
异常
1.异常的概念
什么是异常
-
概念:
程序在运行过程中出现的特殊情况。
-
异常处理的必要性:
任何程序都可能存在大量的位置问题、错误;如果不对这些问题进行正常处理,则可能导致程序的中断,造成不必要的损失。
- 异常处理:Java编程语言使用异常处理机制为程序提供了异常处理的能力。
2.异常的分类
- Throwable:可抛出的,一切错误或异常的父类,位于java.lang包中。
- Error:JVM、硬件、执行逻辑错误,不能手动处理。
- StackOverflowError:栈溢出错误
- OutOfMemoryError:内存不足错误
- Exception:程序在运行和配置中产生的问题,可处理。
- RuntimeException:运行时异常,可处理,可不处理。
- CheckedException:检查时异常,必须处理。(没有实体,除去RuntimeException都属于CheckedException)
- Error:JVM、硬件、执行逻辑错误,不能手动处理。
常见运行时异常
类型 | 说明 |
---|---|
NullPointerException | 空指针异常 |
ArrayIndexOutOfBoundsException | 数组越界异常 |
NegativeArrayException | 数组负下标异常 |
ClassCastException | 类型转换异常 |
NumberFormatException | 数字格式化异常 |
ArithmeticException | 算术异常 |
SecturityException | 违背安全原则异常 |
EOFException | 文件已结束异常 |
FileNotFoundException | 文件未找到异常 |
SQLException | 操作数据库异常 |
IOException | 输入输出异常 |
NoSuchMethodException | 方法未找到异常 |
| 并发修改异常 |
3.异常的产生
- 当程序在运行时遇到不符合规范的代码或结果时,会产生异常或程序员使用throw关键字手动抛出。
4.异常的传递
- 按照方法的调用链反向传递,如始终没有处理异常,最终会由JVM惊醒默认异常处理(打印堆栈跟踪信息)。
5.异常的处理
- Java的异常处理是通过5个关键字来实现的:
- ** — try**:执行可能产生异常的代码
- ** — catch**:捕获异常,并处理
- ** — finally**:无论是否发生异常,代码总能执行
- ** — throw**:手动抛出异常
- ** — throws**:声明方法可能要抛出的各种异常
异常处理try…catch
try{
// 可能出现异常的代码
} catch(Exception e) {
// 异常处理的相关代码,如:getMessage()、printStackTrace()
}
三种情况:
- 正常请求
- 出现异常并处理
- 异常类型不配备
异常处理try…catch…finally
try{
// 可能出现异常的代码
} catch(Exception e) {
// 异常处理的相关代码,如:getMessage()、printStackTrace()
} finally {
// 是否发生异常都会执行,可以释放资源等...
}
(1)finally块是否发生异常都执行
(2)finally块不执行的唯一情况,退出Java虚拟机(JVM)
异常处理 多重catch
try{
// 可能出现异常的代码
} catch(异常类型1) {
// 满足异常类型1执行的相关代码
} catch(异常类型2) {
// 满足异常类型2执行的相关代码
} catch(异常类型3) {
// 满足异常类型3执行的相关代码
}
(1)子类异常在前,父类异常在后(否则会有检查错误)
(2)发生异常时按顺序逐个匹配
(3)只执行第一个与异常类型匹配的catch语句
(4)finally根据需要可写或不写
注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后。
异常处理 多重catch
try{
// 可能出现异常的代码
} finally {
// 是否发生异常都会执行,可以释放资源等...
}
- try…finally不能捕获异常,仅仅用来当发生异常时,用来释放资源。
- 一般用在底层代码,只释放支援不做异常处理吗,把异常向上抛出。
总结异常处理
- try{ } catch { }
- try{ } catch { } finally { }
- try{ } catch { } catch { }
- try{ } finally { }
注意:多重catch,遵循从子(小)到父(大)的顺序,父类异常在最后。
6.声明异常
- 如果在一个方法体中抛出了异常,如何通知调用者?
- throws关键字:声明异常
- 使用原则:底层代码向上声明或则抛出异常,最上层一定要处理异常,否则程序中断。
7.抛出异常
- 除了系统自动抛出异常外,有些问题需要程序员自行抛出异常。
- throw关键字:抛出异常
- 语法:throw异常对象;
方法覆盖(重写)
带有异常声明的方法覆盖(重写):
- 方法名、参数列表、返回值类型必须和父类相同。
- 子类的访问修饰符和父类相同或是比父类更宽。
- 子类中的方法,不能抛出比夫雷更多、更宽的异常(检查时异常)。
8.自定义异常
- 需要继承Exception或Exception的子类,常用RuntimeException。
- 必要提供的构造方法:
- 无参数构造方法
- String message 参数的构造方法
总结
-
异常的概念:
程序在运行过程中出现的特殊情况。
-
异常的分类:
RuntimeException:运行时异常,可处理,可不处理。
CheckedException:检查时异常,必须处理。
-
异常的产生:
程序遇到错误,或手动抛出异常
-
异常的传递:
按照方法的调用链反向传递,如始终没有处理异常,最终会有JVM进行默认异常处理(打印堆栈跟踪信息)。
-
异常的处理:
try { } catch { } finally { }
-
带有异常声明的方法覆盖:
子类中的方法,不能抛出比父类更多、更宽的异常。
面试题
(1)try catch finally 是否可以使用return ?如果包含请说明执行过程?
- try、catch、finally都可以添加return,但是不建议在finally中添加return,返回结果可能有问题。
- 如果try 中没有异常,先执行try 再执行finally ,最后再执行try中的return
- 如果try 中有异常,则执行catch, 再执行finally,最后再执行catch中return
public static int getNum(){
try{
//代码
int n=10/0;
return 10;
}catch (Exception e){
return 20;
}finally {
System.out.println("释放资源");
//资源释放
//return 30;
}
}
(2)try catch finally 中return嵌套++
public static int getNum(){
int n = 10;
try{
return n++;
}catch (Exception e){
return n++;
}finally {
return n++;
System.out.println(n);
}
}
// 返回值是“11”、n = 12;