异常
1.异常概述与异常体系结构
在java语言中,将程序执行中发生的不正常情况称为"异常"。(语法错误和逻辑错误不是异常)
异常事件可分为两类:
-
Error:java虚拟机无法解决的严重问题。如:资源耗尽等情况。
-
Exception:其它因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。例如:
-
空指针访问
-
试图读取不存在的文件
-
网络连接中断
-
数组角标越界
-
对于这些错误,在编写程序时,就考虑到错误的检测,错误消息的提示,以及错误的处理
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-87t8ZR7P-1654065751736)(C:\Users\dell\AppData\Roaming\Typora\typora-user-images\image-20220530161735609.png)]
红色为编译时异常
蓝色为运行时异常
2.异常处理方式
java提供的是异常处理的抓抛模型
过程一:抛——程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出。一旦抛出后,其后的代码不再执行。
过程二:抓——可以理解为异常的处理方式。
2.1 try-catch-finally
说明:
- finally是可选的
- 使用try将可能出现异常代码包装起来,在执行过程中,一旦出现异常,就会生成一个对应异常类的对象,根据对象的类型,去catch中进行匹配。
- 一旦try中的异常对象匹配到某一个catch中,就进入catch中进行异常的处理,一旦处理完成,就跳出当前的try-catch结构(没有finally的时候),继续执行其后的代码
- 注意:catch中的异常类型如果满足子父类关系,则要求子类一定要声明在父类之上。否则,报错。
- 常用的异常对象处理的方式:1. getmessage() 2.printStackTrace()
- 在try结构中声明的变量,出了try结构以后不能被调用
- 使用try-catch-finally处理编译时的异常,是程序在编译时就不报错了,运行时仍有可能报错,相当于我们使用try-catch-finally将一个编译时可能出现的异常,延迟到运行时出现。
try {
//可能出现异常的代码
}catch (){//异常类型1 变量名1
//处理异常的方式一
}catch (){//异常类型2 变量名2
//处理异常的方式二
}finally {
//一定会执行的代码
}
2.1.1 Finally
finally是可选的
finally中声明的是一定会被执行的代码。即使catch中又出现了异常
像数据库连接,输入输出流等资源,jvm是不能回收的,我们需要手动释放。此时的资源释放,就需要声明在finally中。
public static int method(){
try {
int[] ints = new int[10];
System.out.println(ints[10]);
return 1;
}catch (ArrayIndexOutOfBoundsException e){
e.printStackTrace();
return 2;
}finally {
System.out.println("666");
}
}
先会输出666,再返回2
2.2 throws+异常类型
说明:
1."throws+异常类型"写在方法的声明处。指明此方法执行时,可能会抛出的异常类型。一旦当方法执行时,出现异常,仍会在异常代码处生成一个异常类的对象,此对象满足throws后异常类型时,就会被抛出。异常代码后续的代码,就不会执行。
体会:
try-catch-finally:真正的将异常处理掉了。
throws:只是将异常抛给了方法的调用者。并没有将异常处理掉。
public void text01() throws FileNotFoundException, IOException {
FileInputStream inputStream = new FileInputStream("yyh.txt");
int len;
byte[] bytes = new byte[1024];
while ((len=inputStream.read())!=-1){
int str = inputStream.read(bytes,0,len);
System.out.println(str);
}
}
3.手动抛出异常
throw new +异常类型
public class Throwtest {
private int id;
public void yyh(int id) throws Exception {
if (id>0){
this.id=id;
}else {
throw new Exception();
}
}
public static void main(String[] args) {
Throwtest throwtest = new Throwtest();
try {
throwtest.yyh(-8);
} catch (Exception e) {
throw new RuntimeException(e);
}
}
}
4.自定义异常类
- 继承于现有的异常结构:RuntimeException,Exception
- 提供全局常量:serialversionuid 序列号
- 提供重载的构造器
public class MyException extends Exception{
static final long serialVersionUID = -3387516993124229948L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
5.总结
sionUID = -3387516993124229948L;
public MyException(){
}
public MyException(String msg){
super(msg);
}
}
## 5.总结
![总结](https://img-blog.csdnimg.cn/df97b59891fc460b8ecb44800c5f2162.png#pic_center)