JAVA异常(Throwable)

本文深入讲解异常处理机制,包括异常的产生与分类、捕获与抛出、编译时与运行时异常的区别,以及异常处理的原则与实践。通过具体实例,帮助读者理解如何在Java中有效管理异常。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1 异常的产生和分类

异常是对不正常现象的封装(Throwable)
在这里插入图片描述【1】

严重问题Error

不可修复,程序员处理不了,也不作处理
举例
NoClassDefFoundError
OutOfMemoryError

不严重问题Exception

  • 编译时异常 (Checked Exception)
    是一类异常的称,如果发生异常,则在程序编译时发生,只要异常不是运行时异常,都是编译时异常。
  • 运行时异常 RuntimeException(Unchecked Exception)
  • 二者区别
    a) 检测时机:
    前者在编译时检测,后者在运行时检测、
    b) 程序中对异常的处理方式:
    前者需要捕获或者向上层调用链抛出,后者可以不用捕获、不用向上层抛出。
    若没有对异常进行处理,:
    前者在编译时提示“未报告的异常 xxxxException;必须对其进行捕获或声明以便抛出”,
    而后者在运行时会显示对应的运行时异常类型的全名,以及异常发生的原因。
    ——无论语句的编译时异常能不能发生,只要其存在编译时发生的可能性,就必须处理
    ——可以通过创建自定义异常,来对已知异常进行个性化具体化的处理。


    举例:
    常见的编译时异常
    1.FileNotFoundException
    2.ClassNotFoundException
    3.SQLException
    4.NoSuchFieldException
    5.NoSuchMethodException
    常见的运行时异常
    1.NullPointerException
    2.ArithmeticException
    3.ClassCastException
    4.ArrayIndexOutOfBoundsException
    5.StringIndexOutOfBoundsException

2 异常处理

(1) 捕获异常(try…catch…finally)

1) 包含的结构 try,catch,finally

  • try
    {
    可能出现异常的代码
    }

  • catch(Exception e) //实际是 Exception e=new 产生的异常名()

    ①捕获异常e,并对捕获的异常进行处理:(如提示异常信息)
    – e.getMassage()//该异常的定义
    – e.toString()//异常的名称+定义
    – e.printStackTrace()// 异常的名称+定义+栈中保存的错误语句位置. 是默认的异常处理方式

    捕获异常A,抛出异常B
    catch(AException e)
    {
    throw new BException();
    }

  • finally
    {
    必须执行的代码,如关闭IO流
    }

2) 三种形式

try{} catch(){}fianlly{}
try{} catch(){}
try{} finally{}

3) 注意:

  • finally中的内容只有一种情况下不会执行——在catch中 遇到 System.exit(0);*

  • catch块中出现throw 或者return ,则try catch finally 体系后的代码不执行

  • 异常为RuntimeExceptin 的,执行到异常发生的代码,其后的代码不再执行*

(2) 抛出异常(throw)

1)是抛出自定义异常的关键字,方法体内抛出
throw new MyException("");

2)在包含该关键字的方法中,方法声明右侧需要 throws
只抛出RuntimeException 对象及其子类对象时,不用进行throws声明

3)对于抛出异常的方法,在调用链的上层需要try…catch 捕获,也可以继续向上抛出异常

(3)声明异常(throws)

1)在某个方法声明的右侧标识,表示调用该方法时,可能出现异常,并向调用该方法的上一层方法抛出异常
但仅仅写了throws而直到最顶层的方法还没有处理的情况下,编译时会提示未报告的异常,必须对其进行捕获或声明以便抛出。

  • 在最高层(或其前面进行try…catch自定义处理
  • 声明即在该方法的方法调用链上都加上throws声明
  • 调用链:出现问题的方法…-> main方法---->虚拟机

2)可以同时声明多个异常

4 异常处理的原则

(1) 异常捕获和抛出时,异常的类型要具体化

  • 在距离相近的代码中,异常不可能同时发生,因为一旦一个异常发生,剩下的代码不会执行
  • 父类异常可以接收子类异常,多态
  • catch时需要把具体的写在靠上的位置,父类catch块放在最下方

(2) 有几个异常声明,就对应几个catch块

(3) 对用户友好

  • 错误日志
  • 捕获或者抛出都是为开发人员准备的

5 编译时检测的异常 (CheckedException)

  • 必须处理
  • 对抛出异常的方法,必须在方法声明处声明异常throws
  • 可以在调用链上 用try…catch 捕获处理

6 运行时异常 RuntimeException

  • 在某些语句产生异常,致使接下来的程序无法继续运行的情况下, 定义的异常称为运行时异常

  • 运行时异常可捕获可不捕获, 一般不建议捕获,而是需要对代码(方法传递的实参)进行修正

  • 抛出运行时异常的方法,无需进行异常声明

7 异常的继承问题

子类中抛出的异常(子) 类型不能多于父类,但是可以“捕获“”除父类抛出的异常外的异常(进化论)

8 异常体系中代码的执行

在这里插入图片描述

9 参考文献

【1】异常的体系结构简介

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值