笔上得来终觉浅,绝知此事要躬行
🔥 个人主页:星云爱编程
🔥 所属专栏:javase
🌷追光的人,终会万丈光芒
🎉欢迎大家点赞👍评论📝收藏⭐文章
![]()
一、异常
1.1基本介绍
java中,将程序执行中发生的不正常情况称为异常。
开发过程中的语法错误和逻辑错误不是异常。
执行过程中发生的异常事件可分为两大类:
(1)Error(错误):java虚拟机无法解决的严重问题。
例如:jvm系统内部错误,资源耗尽等严重情况
(2)Exception(异常):其他因编程错误或偶然的外在因素导致的一般性问题,可以使用针对性的代码进行处理。
例如:空指针访问,试图读取不存在的文件,网络连接中断等。
注:
①异常分为两大类,运行时异常和编译时异常
②运行时异常,编译器检查不出来。一般指的是编程时的逻辑错误,是程序员应该避免其出现的异常。
③对于运行时异常,可以不做处理。
④编译时异常,编译器要求必须处置的异常。
1.2常见的运行时异常
(1)NullPointerException 空指针异常
(2)ArithmeticException 数学运算异常
(3) ArrayIndexOutOfBoundsException 数组下标越界异常
(4)ClassCastException 类型转换异常
(5)NumberFormatException 数字格式不正确异常[]
1.3编译异常
1.3.1介绍
编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译。
1.3.2常见的编译型异常
(1)SQLException:操作数据库时,查询表可能发异常
(2)IOException:操作文件时,发生的异常
(3)FileNotFoundException:当操作一个不存在的文件时,发生异常
(4)ClassNotFoundException:加载类,而该类不存在时发生异常
(5)EOFException:操作文件到文件末尾,发生异常
(6)IllegalArguementException:参数异常
二、异常处理
2.1基本介绍
异常处理就是当异常发生时,对异常的处理方式。
2.2异常处理方式
(1)try - catch -finally
程序员在代码中捕获发生的异常,自行处理。
(2)throws
将发生的异常抛出,交给调用者(方法)来处理,最顶级的处理者就是JVM。
2.3异常处理机制
(1)try - catch -finally:
try{
//可能有异常的代码
}catch (Exception e){
//捕获到异常
//(1)当异常发生时
//系统将异常信息封装成Exception对象e,传递给catch
//得到异常后,程序员自己处理。
//(2)若没有发生异常,catch代码块不执行
}finally {
//(1)不管try代码块有无异常发生,finally代码块都会执行
//(2)通常将释放资源的代码,放在finally
}
(2)throws:
2.4 try - catch 异常处理
2.4.1基本介绍
java提供try和catch块来处理异常。
try块用于包含可能会出现异常的代码,catch块用于处理try块中发现的异常。
2.4.2基本语法
try{ //可能有异常的代码 //将异常生成对应的异常对象,并传递给catch块 }catch (Exception e){ //对异常的处理 }注:没有finally,语法也可以通过
2.4.3案例
被除数为0:
public class Test2 {
public static void main(String[] args) {
int a=10;
int b=0;
try{
int c=a/b;
}catch (ArithmeticException e){
System.out.println(e.getMessage());
}
}
}
2.4.4注意事项
(1)如果异常发生了,则发生异常的代码后面不会执行,而是直接进入到catch块。
eg:
public class Test2 {
public static void main(String[] args) {
int a=10;
int b=0;
try{
System.out.println("异常发生前");
int c=a/b;
System.out.println("异常发生后");
}catch (ArithmeticException e){
System.out.println(e.getMessage());
}
}
}
(2)如果异常没有发生,则正常执行try代码块中的代码,不会进入到catch代码块中。
(3)如果有不管异常发布发生都要执行的代码(如,关闭连接,释放资源等),则使用try-catch-finally,并将其放到finally代码块中。
(4)可以有多个catch语句,捕获不同的异常(进行不同的业务处理)要求父类异常在后,子类异常在前。如果发生异常,只会匹配一个catch。
eg:
public class Test2 {
public static void main(String[] args) {
int a=10;
int b=0;
try{
int c=a/b;
}catch (ArithmeticException e){
System.out.println(e.getMessage()+"子类异常");
}catch (Exception e){
System.out.println(e.getMessage()+"父类异常");
}
}
}
(5)可以进行try-finally配合使用,这种用法相当于没有捕获异常,因此程序会直接退出。
应用场景:执行一段代码,不管是否发生异常,都必须执行某个业务逻辑。
2.4.5try - catch -finally执行顺序结论
(1)如果没有出现异常,则执行try块中的所有语句,不执行catch块中的语句,如果有finally,最后还需执行finally块中的语句。
(2)如果出现异常,则try块中异常发生后,try快剩下的语句不再执行,而是执行catch块中的语句,如果有finally,最后还需要执行finally里的语句。
2.5throws异常处理
2.5.1基本介绍
(1)如果一个方法(方法中的语句执行时)可能生成某种异常,但是并不能确定如何处理该异常,则此方法应显式地声明抛出异常,表示该方法将不对这些异常进行处理,而由该方法的调用者处理。
(2)在方法声明中用throws语句可以声明抛出异常的列表,throws后面的异常类型可以是方法中产生的异常类型,也可以是它的父类。
2.5.2注意事项
(1)对于编译异常,程序中必须处理。例如:t-c-f 或throws
(2)对于运行时异常,程序中如果没有处理,默认就是throws的方式处理。
(3)方法重写父类的方法时,对抛出异常的规定:子类的重写方法,所抛出的异常类型要么和父类抛出的类型一致,要么为父类抛出的异常类型的子类型。
(4)在throws过程中,如果有方法try-catch,就相当于处理异常,就可以不必throws。
三、自定义异常
3.1基本介绍
当程序中出现了某些“错误”,当该错误信息并没有在Throwable子类中描述处理,这个时候就可以自己设计异常类,用于描述该错误信息。
3.2自定义异常的步骤
(1)定义类:class 自定义异常名 继承Exception或RuntimeException。
例如:
class NameNull extends Exception{ }
(2)如果继承Exception属于编译异常。
(3)如果继承RuntimeException,属于运行异常。
注:一般情况下,我们自定义异常是继承RuntimeException,即把自定义异常做成运行时异常;这样做的好处是我们可以使用默认的处理机制。
3.3throw和throws的区别
意义 | 位置 | 后面跟的东西 | |
---|---|---|---|
throws | 异常处理的一种方式 | 方法声明处 | 异常类型 |
throw | 手动生成异常对象的关键字 | 方法体中 | 异常对象 |
结语
感谢您的耐心阅读,希望这篇博客能够为您带来新的视角和启发。如果您觉得内容有价值,不妨动动手指,给个赞👍,让更多的朋友看到。同时,点击关注🔔,不错过我们的每一次精彩分享。若想随时回顾这些知识点,别忘了收藏⭐,让知识触手可及。您的支持是我们前进的动力,期待与您在下一次分享中相遇!
路漫漫其修远兮,吾将上下而求索。