Java异常

定义

运行时期发生的不正常情况

处理思想

java通过面向对象的思想用类的形式对异常进行描述,即异常类。
语句try-throw catch 将正常流程代码和问题处理代码分离,提高了程序阅读性。

分类

这里写图片描述
Throwable:

  • Error
    程序运行时由JVM抛出的严重性问题,无法恢复或不能捕获,一般应用程序无法处理.
    常见的两种ERROR:OutOfMemoryError, StackOverflowError

    • StackOverflowError
      线程请求的栈深度大于虚拟机所允许的深度时抛出。是栈特有的异常。
    • OutOfMemoryError
      Java虚拟机无法申请到足够的内存时抛出。除了程序计数器外,其他部分的JVM内存都会抛出该异常。

      例子:

      • 堆溢出:不断创建对象(如通过递归)或者创建很大的对象
        解决办法:通过内存映像分析工具对Dump出来的堆转储快照进行分析,重点确认内存中的对象是否是有必要的,也就是确定到底是出现了内存泄露(对象没必要存在,需要调整代码)还是内存溢出(对象需要存在,需要调整JVM堆内存大小配置)。
      • 栈溢出:当栈出现异常时,内存太小(OutOfMemoryError)还是已使用的栈空间太大(StackOverflowError),并没有明确的界限,两者有重叠。单线程情况下,无论是栈帧太大还是虚拟机容量太小,都抛出StackOverflowError异常。而多线程时,线程栈占用内存一定时,创建线程数量太多,就会抛出OutOfMemoryError。此时,则需要相应地减小每个线程占用的栈来创建更多线程。
      • 方法区:1. 运行时常量池中字符串常量太多;2. 调入的类文件太多;
  • Exception

    • Checked异常:(Exception的子类中,除了RuntimeException子类体系的异常,编译异常)
      必须显示处理(注意,不一定非用throw才能抛出)
      处理方式
      1、不知如何处理,定义异常所在方法时,需使用throws声明抛出该异常(表示该函数不能解决这个异常,也就是说,函数本身不能处理时,必须让别人知道自己不能处理)
      2、知道如何处理,在异常可能出现的地方,使用try-catch检查并捕获处理
    • Runtime异常:(Exception中的RuntimeException子类体系,运行时异常)
      无需显示处理
      处理方式:
      系统自动向上抛出,若遇到程序显示编写的对应处理方式,则对其进行处理,否则最终抛给JVM

特点

  • Throwable及其所有子类都具有可抛性
    即他们都可以被throw和throws操作
  • JAVA自己给出的Error和Exception的子类都以Error和Exception作为后缀名,可读性强
  • 从发生异常的地方,创建异常对象,将其抛给调用目前程序的地方,给调用者处理,调用者处理不了,就一直向上抛出,直至抛给JVM,抛给DOS控制台显示
  • 用户可以自己定义异常类
  1. 自定义异常类需要继承异常体系(Exception/RuntimeException->对应Checked异常和Runtime异常),从而可被throw/throws抛出
    1. 自定义异常类类名以Exception结尾,以便于识别
  • 子类覆盖父类方法时,子类方法抛出的异常只能是父类异常本身或其子类
    因为要确保处理父类异常的所有函数还能处理子类异常

throw和throws的区别

  • throws
    含义: 对本函数内可能抛出的异常类的声明,即告知他人本函数内部对该异常不作处理(一种静态的告知)
    语法: 出现在函数名上,后面接1个或多个异常类名,逗号隔开
    使用场景: 想告知他人本函数内部对该异常不作处理时用
    其中,对Checked异常不作处理时,必须用
    注意:如果函数内部有try-catch语句对异常进行了处理,虽然编译通过,并且可以对异常进行捕获并处理,但是含义上矛盾
  • throw
    含义: 抛出异常对象(一种动态的行为)
    语法: 出现在函数内部,可以单独使用,后面接1个异常对象
    使用场景: 系统无法对该异常自动抛出,需要程序员手动抛出时使用

异常处理的位置

在出错最初出现的语句上使用try-catch处理(即在异常出现的最上层的函数上处理异常),之前调用的各个函数上使用抛出

语句

  • try-catch-finally
    a) try块必须有,且只有1个
    b) catch和finally可选,但是至少有一个
    c) catch可以有多个
    d) finally必须位于所有catch之后,且只能有1个
    e) try, catch, finally后必须有{ },即使只有一条语句
    c) 从Java7开始,一个catch块可以捕获多种类型的异常,多种异常用|隔开
  • try
    作用: 存放运行时可能出现异常的代码
  • catch
    作用: 捕获并处理运行时可能出现的异常
  • finally
    作用: 通常用于关闭(释放)资源
    性质:
    1. 想用finally,必须和try-catch语句一起使用,但是try-catch语句可以没有finally try-finally :异常无法直接处理,但是资源需要关闭
    2. 不论是否有异常,执行完try-catch语句后必定会执行,除非finally前是System.exit(0); 即退出JVM
    3. 当try块或catch块中遇到return或throw语句,会先查找是否有finally语句,有,则先跳转执行finally的语句,执行完后才转会执行自己的return或throw

参考文献:
[1] https://blog.csdn.net/youngstar70/article/details/62227032

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值