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

【Java学习笔记】异常

异常(Exception)

一、基本介绍

在 Java 程序中,将运行中发生的不正常情况称为 “异常”,开发过程中的语法错误和运行时发生的异常情况是不一样的。

二、异常的分类

三、处理异常的方法

四、异常体系图(重点!!)

异常体系图体现了继承关系

请添加图片描述

说明

五、throwsthrow 的区别


一、编译异常

(1)介绍:编译异常是指在编译期间,就必须处理的异常,否则代码不能通过编译

(2)常见的编译异常


二、运行异常

(1)介绍:在编译时不会发现,在程序运行时出现的逻辑错误导致的异常,若不做处理,默认抛出(throws)异常,交给 父类 或 上一级 来处理

(2)常见类型

异常演示

(1)NullPointerException:空指针异常

public class NullPointerException_ {public static void main(String[] args) {String name = null;System.out.println(name.length());}
}

异常:获取空字符窜的长度

(2)ArithmeticException:数学运算异常

public class ArithmeticException_ {public static void main(String[] args) {int a = 1;int b = 0;System.out.println("a / b = " + a / b);}
}

异常:分母为 0

(3)ArrayIndexOutOfBoundsException:数组下标越界异常

public class ArrayIndexOutOfBoundsException_ {public static void main(String[] args) {int[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}

异常:数组只有三个元素,却访问了第四个元素

(4)ClassCastException:类型转换异常

public class ClassCastException_ {public static void main(String[] args) {person p_a = new A(); // 向上转型A a = (A)p_a; // 向下转型// 两个不相关的类进行转换会报异常B b = (B) p_a; // A 和 B 之间无关系,不可以把指向 A 的转换为 B}
}class person {}class A extends person{}class B extends person{}

异常:A 类 和 B 类 没有关系,不可以把指向 A 类 的对象转成指向 B 类 的对象

(5)NumberFormatException:数字格式不正确异常

public class NumberFormatException_ {public static void main(String[] args) {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name);System.out.println(num);}
}

异常:无法将字符串转化为整数


三、异常处理

1. try - catch - finally

使用方法:选中可能出现异常的代码部分,使用快捷键ctrl + alt + t,在弹窗中选择需要的结构即可

1. 三种结构

2. 基本结构图

请添加图片描述

3. 代码示例

public class main {public static void main(String[] args) {try {String name = "异常";// 将 String 转成 intint num = Integer.parseInt(name);  // 会抛出 NumberFormatExceptionSystem.out.println(num);} catch (NumberFormatException e) {System.out.println(e.getMessage());} finally {System.out.println("程序执行到 finally 部分.....");}}
}

说明:在catch结构中,使用getMessage()方法获取异常信息

4. try - catch结构的使用细节

5. try - finally结构的使用细节

该用法相当于没有捕获异常,因此程序会直接退出==崩掉 / 退出

应用场景:执行一段代码后,不管是否发生异常,都必须执行某个业务逻辑(finally部分的代码)

解释:为什么子类在前,父类在后?

package exception_;public class main {public static void main(String[] args) {try {// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}} catch (NullPointerException e) {System.out.println("空指针异常:" + e.getMessage());} catch (ArrayIndexOutOfBoundsException e){System.out.println("数组下标越界异常:" + e.getMessage());}System.out.println("程序继续执行......");}
}// 运行结果
空指针异常:null
程序继续执行......

代码解析

NullPointerException(子类)和ArrayIndexOutOfBoundsException(子类)都是RuntimeException(父类)的子类,然而运行异常又是Exception的子类,如果把父类Exception写在前面,即包含了所有子类,后面再写子类就没有意义了

6. try - catch的练习题

public class ExceptionExe01 {public static int method() {int i = 1;try {i++;String[] names = new String[3];if (names[1].equals("tom")) {System.out.println(names[1]);} else {names[3] = "jack";}return 1;} catch (ArrayIndexOutOfBoundsException e) {return 2;} catch (NullPointerException e) {return ++i;} finally {++i;System.out.println("i = " + i);}}public static void main(String[] args) {System.out.println(method());}
}

程序执行结果

i = 4
3

解释


2. throws

1. 基本介绍:抛出异常

2. 基本原理图

请添加图片描述

3. 代码示例

(1)抛出方法中的异常

public static void method() throws NullPointerException,ArrayIndexOutOfBoundsException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}

(2)抛出方法中的异常的父类

public static void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());// ArrayIndexOutOfBoundsExceptionint[] arr = {1,2,3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}System.out.println("程序继续执行......");
}

代码解释

父类:RuntimeException

子类

4. throws 的使用细节

代码解析:子类重写父类方法抛出异常

class a {public void method() throws RuntimeException{// NullPointerExceptionString name = null;System.out.println(name.length());}
}class b extends a {@Overridepublic void method() throws ArrayIndexOutOfBoundsException{// ArrayIndexOutOfBoundsExceptionint[] arr = {1, 2, 3};for (int i = 0; i <= arr.length; i++) {System.out.println("arr[" + i + "] = " + arr[i]);}}
}

代码解析

b 类是 a 类的子类,则b 类抛出的异常必须是 a 类抛出异常类型的子类,然而 a 类抛出异常的类型NullPointerExceptionRuntimeException子类,抛出的异常类型用其父类代替是没有问题的

但是!!!

若将子类抛出异常的类型换成Exception,必然会报错,因为扩大了父类抛出异常的类型(本质还是继承关系)


3. 自定义异常

1. 基本介绍

程序出现了某些"错误",但该错误信息并没有在Throwable子类中描述处理,这个时候可以自己设计异常类,自定义异常的描述信息

2. 构建方法

3. 应用案例

要求:接收 person 对象年龄时,要求年龄范围在 18 - 120 之间,否则抛出一个自定义异常,并给出提示信息

代码示例

package exception_;public class main {public static void main(String[] args) {int age = 180;if(!(age >= 18 && age <= 120)){throw new AgeException("年龄需要在 18 - 120 之间");}System.out.println("你的年龄范围正确");}
}class AgeException extends RuntimeException {// 调用 RuntimeException 的构造器,修改异常信息public AgeException(String message) {super(message);}
}

输出结果

Exception in thread "main" exception_.AgeException: 年龄需要在 18 - 120 之间at exception_.main.main(main.java:7)

代码解析

思路:创建了一个类,通过调用父类的构造器,在创建自定义异常调用构造器来传入自定义异常信息

如何理解 new?

异常是一个类,抛出的必须是异常类的一个对象实例,所以需要 new,创建对象时通过调用构造器传入信息来完成对象实例的初始化


4. throwsthrow的区别

意义位置后面跟的东西
throws方法声明处异常类型
throw方法体中异常对象
http://www.xdnf.cn/news/10653.html

相关文章:

  • Chapter 10 Inductive DC–DC Converters
  • MCP (模型上下文协议):AI界的“USB-C”标准,开启大模型应用新纪元
  • C语言基础(10)【二维数组 字符数组 字符串相关操作】
  • 代码随想录算法训练营第十一天 | 150. 逆波兰表达式求值、239. 滑动窗口最大值、347.前 K 个高频元素、栈与队列总结
  • 光伏功率预测 | LSTM多变量单步光伏功率预测(Matlab完整源码和数据)
  • 用“照片放大/缩小”来通俗理解多尺度
  • QT入门学习(二)---继承关系、访问控制和变量定义
  • Dockerfile常用指令介绍
  • 【Redis】Set 集合
  • Python列表、字典、元组、集合
  • 推荐一款使用html开发桌面应用的工具——mixone
  • 39. 组合总和【 力扣(LeetCode) 】
  • 从万物互联到万体智联:论智能体互联网带来的产业革命
  • 可视化大屏如何制作
  • SQL快速入门【转自牛客网】
  • 强人工智能 vs 弱人工智能:本质区别与未来展望
  • CppCon 2014 学习:Defensive Programming Done Right.
  • 嵌入式Linux 期末复习指南(下)
  • Java递归编程中的StackOverflowError问题分析与解决方案
  • 软件测评师教程 第9章 基于质量特性的测试与评价 笔记
  • 新版智慧社区(小区)智能化弱电系统解决方案
  • 记录一次由打扑克牌测试国内各家大模型的经历
  • 序列搜索策略
  • 探秘 Minimax:AI 领域的创新先锋
  • CangjieMagic 智能体框架嵌入式系统实测:以树莓派 4B 为例
  • 【Redis技术进阶之路】「系统架构系列中篇」高可用之Master-Slave主从架构的复制问题(分析旧版点制功能)
  • rabbitmq Direct交换机简介
  • K-匿名模型
  • 强类型语言和弱类型语言
  • 振动力学:有阻尼单自由度系统