前言
该文介绍了Java异常的概述,运行代码时,异常的捕捉,及其使用 try-catch语句的处理。Java自带自动捕捉异常,但try-catch语句可以让我们更加便利地应对代码中的问题。
一、异常是什么?
异常概述:
(1)程序中的异常:程序员没有预料到的情况,或者超出程序员控制的情况。
(2)异常的分类
Exception(非致命异常)
定义:Exception 是会影响程序正常运行,但可以被解决的问题。
例如:RuntimeException 在Java虚拟机正常运行期间抛出异常的类。
public class Demo{ public static void main(String[] args){ Object obj = null; //运行时错误:空指针异常 System.out.println(obj.hashCode()); } }
运行结果:
Error(致命错误)
定义:不应该试图捕获的严重错误。
例如:
a.字节码文件无法解析
b.Java虚拟机资源耗尽
c.配置文件格式不规范
解决方法:1.重新编写程序
2.重新分配系统资源(重启)
例如(代码编写时的严重错误):
public class Demo{ public static void main(String[] args){ System.out.println(“你好”) //致命性错误,没有分号结尾。 } }
运行结果:
二、捕捉异常
1.自动捕捉异常
运行后,java API中自动捕捉并在控制台中显示报错的异常
例如:
2.try-catch语句捕捉异常
定义:try-catch 语句用于处理代码中可能出现的错误信息。 错误可能是语法错误,通常是程序员造成的编码错误或错别字。 也可能是拼写错误或语言中缺少的功能。
语法:
try{ //被捕获的代码 }catch(异常类型 e){ //对异常的处理 }
实例:
public class Demo{ public static void main(String[] args) { try { for(int i = 0;i<5;i++) { System.out.println("输出"+i+"行"); int a = 1/i; //发生运算异常的代码,i = 0 时,除数为0,运算异常。 } }catch(Exception e){ System.out.println("发生了异常,请管理员尽快处理!"); //做出代码异常的反馈 } }
运行结果:
注:
a.只能反馈或修改非致命的异常,Error错误无法解决。
b.最好在catch代码块中写入处理异常的代码,不要省懒事,不然发生时很难查找出来。
catch代码块中处理异常常用的3个函数:
getMessage()函数:输出错误性质。
toString()函数:给出异常的类型与性质。
printStackTrace()函数:指出异常的类型、性质、栈层次及出现在程序中的位置。
a.多重try-catch代码块
语法:
try { //some codes }catch(some Exception1 e){ //some codes } catch(some Exception2 e){ //some codes } catch(some Exception3 e){ //some codes }
运行逻辑:try语句中发生的每一个异常,依次对照每个catch语句的异常类型,直到输出对应的catch语句,反馈或者解决异常。
实例:
public class Demo { public static void main(String[] args) { try { int a = 1/0; //该行代码具有算数异常 }catch(NullPointerException e) { System.out.println("发生了空指针异常,请管理员及时处理!"); }catch(ArithmeticException e) { System.out.println("发生了算数异常,请管理员及时处理!"); //对应找到了属于算数异常的catch语句,反馈输出。 }catch(ClassCastException e) { System.out.println("发生了类转换异常,请管理员及时处理!"); } } }
输出结果:
b.异常的中断机制
解释:当try代码块中的语句发生异常时,程序就会调转到对应的catch代码块中执行,反馈或者解决问题,然后继续运行后面的代码。
示例:
public class Demo { public static void main(String[] args) { for(int i = 0;i<5;i++) { try { System.out.println("输出"+i+"行"); int a = 1/i; }catch(Exception e) { e.printStackTrace(); System.out.println("发生了异常,请管理员尽快处理!"); } } } }
运行结果:
注:由图可见,发生异常反馈后,后续代码仍被执行。Java的异常处理是结构化的,不会因为一个异常影响整个程序的运行
c.finally代码块恢复机制
finally代码块:完整的异常处理语句,包含finally语句。无论try-catch语句是否顺利执行完毕,都会执行 finally 语句。往往用于程序崩溃后,保存崩溃前的工作内容。
语法:
try{ //被捕获的代码 }catch(异常类型 e){ //对异常的处理 }finally{ //最后一定会执行的代码 }
实例:
public class Demop { public static void main(String[] args) { try { System.out.println("打开连接池"); int a = 1/0; System.out.println("通过连接池读取数据"); }catch(Exception e){ System.out.println("打印堆栈跟踪异常,请管理员及时处理!"); e.printStackTrace(); }finally { System.out.println("系统提示:已保存工作内容"); System.out.println("关闭连接池"); } } }
运行结果:
由此可见,当代码运行异常时,finally代码块仍可以正常运行,可以实现及时自动保存的功能。
finally块一般都会得到执行,但在以下四种情况中不会执行:
- finally块中的代码发生了异常。
- 在finally块前面中使用了System.exit() 方法,终止了程序运行。
- 程序所在线程死亡。
- 关闭CPU(电脑关闭)
总结
以上就是对异常的概述,捕捉异常,try-catch-finally语句的解读。如果有什么疑问或者补充或纠错的内容,欢迎在评论区中留言,博主会及时做出反馈的。