当前位置: 首页 > news >正文

Java—异常体系

Java的异常体系是Java语言中用于处理程序运行过程中可能出现的错误的机制。通过异常处理,程序可以在遇到问题时自动反馈,从而避免程序崩溃。Java异常体系中包含两大类:错误(Error)和异常(Exception)。

一、错误(Error)

1.1 概念

错误是指程序在运行时发现的非法操作,例如语法错误、逻辑错误或资源未找到等,会导致程序崩溃,无法继续执行后续代码。错误是由JVM产生和抛出的。

1.2 Error举例

1.2.1 栈溢出错误

public class test {public static void main(String[] args) {run();}public static void run(){run();}
}

运行结果 

二、异常(Exception)

2.1 概念

异常是在程序正常执行过程中由于某个意外条件引发的事件,异常可以由错误引起的,也可以是应用程序中不小心出现的问题。

异常又可分为受检异常(非运行时异常)和非受检异常(运行时异常)。

2.2 受检异常(非运行时异常)

受检异常时程序还未执行是就发现了的异常,从语法角度上是必须处理的异常,如果不解决就无法编译通过。包括ClassNotFoundException、IOException等。

将鼠标移动到forName处,会提示添加异常到方法签名,即代码为

public class test {public static void main(String[] args) {run();}public static void run() throws ClassNotFoundException {Class clazz = Class.forName("com.qcby.util");}
}

2.3 非受检异常(运行时异常)

非受检异常是由程序逻辑产生的异常,编译器检测不到,在运行期间被发现的异常,包括数组越界IndexOutOfBoundsExpection、空指针异常NullPointerExpection等。

数组越界异常

public class test {public static void main(String[] args) {run();}public static void run(){int[] arr = {1,2,3};System.out.println(arr[3]);}
}

运行结果 

注:错误(Error)异常(Exception)有一个共同的父类:Thorwable,Java异常体系整体结构如下:

三、处理异常

Java中处理异常的方式分为两大类:throws(抛出异常)try-catch-finally(解决异常的方式)

3.1 try-catch-finally

3.1.1 try-catch-finally讲解

try-catch-finally:检查异常的代码,不会影响到其他代码的执行

比如在受检异常的例子中我们对forName异常进行了抛出:

抛出后会发现main()中的run()方法也被标红,这是因为run()方法抛出了异常,main()作为run()方法的调用者,也要抛出异常,但是在这里可以使用try-catch环绕进行解决:

public class test {public static void main(String[] args) {try {run();} catch (ClassNotFoundException e) {e.printStackTrace();   //打印异常}}public static void run() throws ClassNotFoundException {Class clazz = Class.forName("com.qcby.util");}
}

try-catch-finally解释:尝试执行try代码块之中的代码,若不能正常执行,则执行catch代码块中的代码,catch代码块之中的代码用于抛出异常,如上述代码为打印出异常。无论代码能否正常执行,finally之中的代码都会执行。

try-catch-finally结构如下(可以有多个catch{}):

try{//可能出现异常的代码块
}catch(ExpectionName1 e){//一旦产生了这个异常应该做的措施
}catch(ExpectionName2 e){//一旦产生了这个异常应该做的措施
}finally{//无论成功还是失败都要执行的代码//一般都是做资源的清除
}

补充:所有的异常的父类都是Expection异常。

因此,多个catch{}可以合并为:

try{//可能出现异常的代码块
}catch(Expection e){//产生异常应该做的措施
}finally{//无论成功还是失败都要执行的代码//一般都是做资源的清除
}

3.1.2 try-catch-finally使用举例

(1)不采用try-catch-finally

public class test {public static void main(String[] args) throws ClassNotFoundException {run();System.out.println("--------------------");}public static void run() throws ClassNotFoundException {int[] arr = {1,2,3};System.out.println(arr[3]);}
}

运行结果

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at com.qcby.test.test.run(test.java:10)at com.qcby.test.test.main(test.java:5)

(2)采用try-catch-finally

public class test {public static void main(String[] args) {try {run();} catch (ClassNotFoundException e) {e.printStackTrace();}finally {System.out.println("--------------------");}}public static void run() throws ClassNotFoundException {int[] arr = {1,2,3};System.out.println(arr[3]);}
}

运行结果

--------------------
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3at com.qcby.test.test.run(test.java:15)at com.qcby.test.test.main(test.java:6)

try-catch-finally包裹住异常的代码,不会影响其他代码的执行

3.2 throws

throws:不尝试解决异常,将异常抛出,交给有能力解决的方法取解决。

throw关键字:抛出异常,thorw用来自定义异常,提示方法的调用者

3.2.1 相关代码

public class test {public static void main(String[] args) throws Exception {run();System.out.println("--------------------");}public static void run() throws Exception {throw new Exception("这个方法可能存在问题");}
}

3.2.2 运行结果

Exception in thread "main" java.lang.Exception: 这个方法可能存在问题at com.qcby.test.test.run(test.java:9)at com.qcby.test.test.main(test.java:5)

http://www.xdnf.cn/news/499033.html

相关文章:

  • 【Linux笔记】——Linux线程封装
  • Ulyssess Ring Attention
  • Python文件与JSON操作全解:从基础到企业级实践
  • A级、B级弱电机房数据中心建设运营汇报方案
  • Ankr:Web3基础设施的革新者
  • Zephyr OS 中的 FIFO 接口应用介绍
  • SECERN AI提出3D生成方法SVAD!单张图像合成超逼真3D Avatar!
  • Windows系统部署MongoDB数据库图文教程
  • 机器学习-人与机器生数据的区分模型测试-数据处理 - 续
  • 【漫话机器学习系列】263.线性插值(Interpolation)
  • img.dims() <= 2 in function ‘cv::matchTemplate报错
  • Mysql 刷题 day05
  • 数学复习笔记 19
  • 1.2.1电商平台
  • 探索C++对象模型:(拷贝构造、运算符重载)成员函数的深度解读(中篇)
  • 力扣HOT100之二叉树:98. 验证二叉搜索树
  • 【网络入侵检测】基于Suricata源码分析运行模式(Runmode)
  • STM32烧录程序正常,但是运行异常
  • 实战2:利用Python与AI模型实现文本分类
  • STM32F103定时器1每毫秒中断一次
  • 机器学习中的过拟合及示例
  • 咖啡叶子病害检测数据集VOC+YOLO格式1468张4类别均为单叶子
  • mac-M系列芯片安装软件报错:***已损坏,无法打开。推出磁盘问题
  • PySide6 GUI 学习笔记——常用类及控件使用方法(常用类颜色常量QColorConstants)
  • JavaScript 中的 for...in 和 for...of 循环详解
  • 深入理解 TypeScript 中的 unknown 类型:安全处理未知数据的最佳实践
  • Qt Widgets模块功能详细说明,基本控件:QLabel(一)
  • 园区综合能源系统容量优化配置全流程解析:从业务逻辑到 MATLAB 实现
  • 计算机视觉与深度学习 | Matlab实现EMD-LSTM和LSTM时间序列预测对比(完整源码和数据)
  • 计算机视觉与深度学习 | Python实现EMD-SSA-VMD-LSTM-Attention时间序列预测(完整源码和数据)