浅谈Java中异常处理

本篇博客将根据现有知识对Java中异常处理做以小结,以下博客仅作为个人学习过程的小结,如能对各位博友有所帮助不胜荣幸。
本篇博客将简单介绍Java中异常的认识,以及Java中异常如何捕获,只做本人小结,后期随学习深入再做补充修改。

了解异常

所谓异常就是指程序在运行时出现的错误时通知调用者的一种机制,其最重要的方面之一就是如果发生问题,它将不允许程序沿着其正常的路径走下去,异常带来的另一个好处是它往往能降低错误处理代码的复杂度

数组越界异常
在这里插入图片描述
空指针异常
在这里插入图片描述

如何捕获异常

前置知识:
弄明白异常时如何被捕获的,首先要理解监控区域(guarded region)的概念,它是一段可能产生异常的代码,并且下面紧跟着处理这些异常的代码。

Java异常处理涉及到五个关键字,分别是:try、catch、finally、throw、throws

  • try块:用于监听代码,将有可能产生异常的代码放在其中,如出现异常,代码停止运行,抛出异常
try{
    
    
	//此处放置可能出现异常的代码
}
  • catch块:用于捕获异常,将try语句块中抛出的异常捕获并处理,其必须紧跟在try语句块之后,每个catch子句看起来就像是接收一个且仅接收一个特殊类型的参数的方法
try{
    
    
	//此处放置可能出现异常的代码
}catch(Type1 id1){
    
    
	//处理Type1异常
}catch(Type2 id2){
    
    
	//处理Type12异常
}...
  • finally:主要用于回收try语句块中的资源(如:数据库连接 Connection,网络连接socket,IO),finally语句块总会被执行,如果try语句块,catch语句块,finally语句块中都有return语句,则总是返回finally语句块中的返回值
  • throw:用于catch语句中将异常抛出,抛给上一级进行处理
  • throws:用于方法声明时,表示将制定异常抛出

异常处理的方式

由于异常的种类繁多,所以会根据不同的业务场景来进行异常的处理

  • 对于严重的异常问题(如银行线上支付之类的场景),直接让程序崩溃掉,防止更加严重的后果
  • 对于一般的异常问题(多数情况),可打印错误日志,通过监控报警及时通知工程师
  • 对于可以恢复的异常(网络传输相关场景),可尝试进行重试操作

多数情况下我们会执行第二种方式,记录日志的内容为出现异常的方法的调用信息,以方便我们很快速的定位到异常的位置
方法调用栈:在JVM中有一块内存空间称为"虚拟机栈"专门用来存储方法间的调用关系,当代码出现异常时,就可以使用e.printStackTrace()的方式查看出现异常的方法调用位置

异常处理流程

  1. 程序先执行try语句块
  2. 如果try块中的代码出现异常,则会跳出try块,查看下面有无与所出现异常类型相同的catch语句
    2.1. 如果找到匹配,则执行该catch语句块
    2.2. 如果没有找到匹配,则会将异常向外传递,即传递到方法调用的上层调用者
    2.3. 如果上层调用者没有找到匹配,则继续向外传递
    2.4. 一直到 main 方法也没有匹配的异常处理,就会交给JVM进行处理,此时程序就会异常终止
  3. 无论最终是否找到匹配的异常类型,finally中的代码都会在该方法结束之前被执行到

Java 异常体系

Java中内置了丰富的异常体系,用来表示不同情况的异常
在这里插入图片描述

  • 最顶层的类 Throwable 派生出两个子类,Error,Exception
  • Error 指Java运行时内部错误和资源消耗错误,程序不抛出此类异常.这种异常系统无能为力解决,只能告知用户并终止程序
  • Exception 是编写程序所使用的所有异常类的父类
  • Exception 下有一个子类 RunTimeException ,其下又派生了很多常见的异常类

Java规定由 Error 和 RuntimeException 派生的异常为非受查异常/运行时异常,除此外其他为受查异常/编译时异常

扫描二维码关注公众号,回复: 14764901 查看本文章

非受查异常(这里指RuntimeException):一般是由没有细心检查代码,程序错误而导致的异常,如空指针异常、数组越界、类型转换异常等由于代码编写错误导致,这些异常是在编码过程中是能够避免的。

受查异常:一般与代码编程无关,为程序运行时所处的环境有关,如访问某个文件,但文件不存在,其本身与程序问题关系不大

非受查异常与受查异常的区别:

  • 非受查异常,属于RuntimeException类及子类范围的类(以及衍生类),运行时会报出错误
  • 受检查异常,在Exception范围内,除了非受查异常的类都是受检查异常,编译时抛出异常
  • 如果一段代码可能抛出受查异常, 那么必须显式进行处理,try{…}catch{…}或throw到上一层

以上便是对Java异常的知识点小结,随着后续学习的深入还会同步的对内容进行补充和修改,如能帮助到各位博友将不胜荣幸,敬请斧正

猜你喜欢

转载自blog.csdn.net/m0_46233999/article/details/117740695