【JAVA】什么是异常 上

简介: 【JAVA】什么是异常

1. 什么是异常


1.1 概念

在Java中,将程序执行过程中发生的不正常行为称为异常。


比如写代码时经常会遇到的:


1.算术异常

System.out.println(10 / 0);
//分母不能为0

2.数组越界异常

int[] arr = {1, 2, 3};
System.out.println(arr[100]);
//arr数组大小为3,打印arr[100]明显超过数组大小

3.空指针异常

int[] arr = null;
System.out.println(arr.length);
//空指针没有大小

🍩java中不同类型的异常,都有与其对应的类来进行描述。


1.2 异常的体系结构

异常种类繁多,为了对不同异常或者错误进行很好的分类管理,Java内部维护了一个异常的体系结构:

30b16adb786bbd9a6018d94eb698ba24_b5159952eca34f609964e8d1dd855dd7.png


从上图中可以看到:


  • Throwable:是异常体系的顶层类,其派生出两个重要的子类, Error 和 Exception。
  • Error:指的是Java虚拟机无法解决的严重问题,比如:JVM的内部错误、资源耗尽等,典型代表:StackOverflowError和OutOfMemoryError,一旦发生,就无法挽回。
  • Exception:异常产生后程序员可以通过代码进行处理,使程序继续执行。比如:感冒、发烧。我们平时所说的异常就是Exception。

1.3 异常的分类

1.编译时异常

在程序编译期间发生的异常,称为编译时异常,也称为受检查异常(Checked Exception)

public class Person {
    private String name;
    private String gender;
    int age;
    // 想要让该类支持深拷贝,覆写Object类的clone方法即可
    @Override
    public Person clone() {
        return (Person)super.clone();
    }
}
//报错:未报告的异常错误java.lang.CloneNotSupportedException; 必须对其进行捕获或声明以便抛出

2.运行时异常

在程序执行期间发生的异常,称为运行时异常,也称为非受检查异常(Unchecked Exception)

RunTimeException以及其子类对应的异常,都称为运行时异常。比如:NullPointerException、ArrayIndexOutOfBoundsException、ArithmeticException。


注: 编译时出现的语法性错误,不能称之为异常。例如将 System.out.println 拼写错了,写成了system.out.println,此时编译过程中就会出错,这是“编译期”出错。

而运行时指的是程序已经编译通过得到class 文件了,再由 JVM 执行过程中出现的错误。


2. 异常处理


2.1 防御式编程

错误在代码中是客观存在的。因此我们要让程序出现问题的时候及时通知程序猿,其主要的方式有:


1.LBYL: Look Before You Leap。在操作之前就做充分的检查。即:事前防御型

boolean ret = false;
ret = 登陆游戏();
if (!ret) {
  处理登陆游戏错误;
  return;
}
ret = 开始匹配();
if (!ret) {
  处理匹配错误;
  return;
}
ret = 游戏确认();
if (!ret) {
  处理游戏确认错误;
  return;
}
ret = 选择英雄();
if (!ret) {
  处理选择英雄错误;
  return;
}
ret = 载入游戏画面();
if (!ret) {
  处理载入游戏错误;
  return;
}
......

上述的正常流程和错误处理流程代码混在一起,代码整体显的比较混乱。这时就有:


2.EAFP: It’s Easier to Ask Forgiveness than Permission. “事后获取原谅比事前获取许可更容易”。也就是先操作,遇到问题再处理。即:事后认错型

throw new XXXException("异常产生的原因");

优势:正常流程和错误流程是分离开的,程序员更关注正常流程,代码更清晰,容易理解代码。

在Java中,异常处理主要的5个关键字:throw、try、catch、final、throws。


🍩异常处理的核心思想就是 EAFP。


2.2 异常的抛出

在编写程序时,如果程序中出现错误,此时就需要将错误的信息告知给调用者,比如:参数检测。

在Java中,可以借助throw关键字,抛出一个指定的异常对象,将错误信息告知给调用者。


语法如下:


throw new XXXException("异常产生的原因");

实例:实现一个获取数组中任意位置元素的方法。


public class Main {
    public static int getElement(int[] array, int index){
        if(null == array){
            throw new NullPointerException("传递的数组为null");
        }
        if(index < 0 || index >= array.length){
            throw new ArrayIndexOutOfBoundsException("传递的数组下标越界");
        }
        return array[index];
    }
    public static void main(String[] args) {
        int[] array = {1,2,3};
        getElement(array, 3);
    }
}

注:


  • throw必须写在方法体内部
  • 抛出的对象必须是Exception 或者 Exception 的子类对象
  • 如果抛出的是 RunTimeException 或者 RunTimeException 的子类,则可以不用处理,直接交给JVM来处理
  • 如果抛出的是编译时异常,用户必须处理,否则无法通过编译
  • 异常一旦抛出,其后的代码就不会执行


2.3 异常的捕获

异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws 以及 try-catch捕获处理。


相关文章
|
6天前
|
Java
java自定义Service的异常
java自定义Service的异常
16 0
|
6天前
|
Java 索引
【JAVA基础篇教学】第七篇:Java异常类型说明
【JAVA基础篇教学】第七篇:Java异常类型说明
|
1天前
|
Java 编译器
Java一分钟之——异常分类:检查异常与运行时异常
【5月更文挑战第20天】Java异常处理分为检查异常(Checked Exceptions)和运行时异常(Unchecked Exceptions),两者在编译期处理方式不同。检查异常需捕获或声明,如`IOException`,而运行时异常如`NullPointerException`在运行时终止程序。常见问题包括不恰当的异常使用、过度捕获和忽略异常信息。避免策略包括正确区分异常类型、具体捕获和处理异常信息。示例代码展示了如何处理这两种类型的异常。理解并妥善处理异常能提升程序的健壮性和可维护性。
23 4
|
1天前
|
Java
Java一分钟之——异常链:追踪错误源头
【5月更文挑战第20天】Java异常处理中的异常链机制有助于追踪错误源头。通过`initCause()`和`getCause()`方法,新异常与原始异常关联,提供丰富调试信息。常见问题包括忽略原始异常、过度包装和不正确调用`initCause()`。避免策略包括始终记录原始异常、适度创建自定义异常和正确使用`initCause()`。代码示例展示了如何在异常实例化时自动链接原始异常。异常链能改善错误追踪,加速问题解决。
24 3
|
6天前
|
前端开发 Java 应用服务中间件
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
【异常解决】java程序连接MinIO报错The request signature we calculated does not match the signature you provided.
23 0
|
6天前
|
Java 关系型数据库 MySQL
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
【JAVA进阶篇教学】第八篇:Java链接MySql数据库异常
|
6天前
|
存储 Java 开发者
探索Java开发中触发空指针异常的场景
作为一名后端开发者在Java编程的世界中,想必大家对空指针并不陌生,空指针异常是一种常见而又令人头疼的问题,它可能会在我们最不经意的时候突然出现,给我们的代码带来困扰,甚至导致系统的不稳定性,而且最可怕的是有时候不能及时定位到它的具体位置。针对这个问题,我们需要深入了解触发空指针异常的代码场景,并寻找有效的方法来识别和处理这些异常情况,而且我觉得空指针异常是每个Java开发者都可能面临的挑战,但只要我们深入了解它的触发场景,并采取适当的预防和处理措施,我们就能够更好地应对这个问题。那么本文就来分享一下实际开发中一些常见的触发空指针异常的代码场景,并分享如何有效地识别和处理这些异常情况。
22 1
探索Java开发中触发空指针异常的场景
|
6天前
|
SQL 网络协议 Java
Java异常详解
Java异常详解
10 1
|
6天前
|
Java 程序员 编译器
|
6天前
Swagger2异常:java.lang.NumberFormatException: For input string: ““
Swagger2异常:java.lang.NumberFormatException: For input string: ““
21 1