java中异常处理机制

简介: java中异常处理机制

一 认识常见异常

在你所写过的代码中,你已经接触过一些异常了,我们可以通过一些简单的代码让我们理解一些简单的异常

1 除0异常(算术异常)

public class winning {
    public static void main(String[] args) {
        System.out.println(10/0);
    }
}

我们都知道0是不能作为除数的,那么在这里作为除数运行之后结果如下:

画出圈的地方就是我们异常的一个种类,称为算术异常

2 数组越界异常

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

运行结果:

3 空指针异常

public class winning {
    public static void main(String[] args) {
       int[] array = null;
       System.out.println(array[0]);
    }
}

运行结果:

二 异常的体系

Exception是我们所有异常的父类,其中Error以及RuntimeException是我们平时所说的一个非受查异常(运行时异常),其他的异常为受查异常(编译时异常),前面介绍的几种常见的异常,就是RuntimeException的子类。

对于这些异常的处理,我们建议统一利用try-catch去处理,而且catch处理异常时,如果有父子类的异常,我们应该要遵循先写子类的异常,在写父类的异常。


三 异常的用法(try-catch语句)

1概述与代码理解

1 对于编写了一段代码,如果其中的一行发生了异常,那么之后的语句就不再执行(这是因为没有自己处理异常,那么就会交给JVM来处理)

2 对于使用try-catch语句来处理异常,把有可能出现异常的语句放在try中,如果try语句中的一行发生了异常,那么try语句中的下一行将不执行,但不影响后面的语句执行

3 对于try-catch语句,catch后面要跟着异常的类型,以及要相对应的定义一个变量。

public class winning {
    public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array[0]);
            System.out.println("abc");
        }catch(NullPointerException e){
           //打印出异常的调用栈
            e.printStackTrace();
            System.out.println("捕获到空指针异常了");
        }
        System.out.println("执行了");
    }
}

运行结果:

2 注意事项

1 try-catch语句不能单独使用,必须联合起来处理异常

2 可以有多个catch,但不能有多个try

3 catch中可以写多个异常的类型,类型之间需要利用|隔开,但是变量必须定义到所写的最后一个类型的后面(也就是变量只能定义一个),但我们并不推荐这种写法,最好就是一种类型对应一个catch

4 catch中如果没有对应的异常类型,那么此时就会交给jvm去处理( catch 只能处理对应种类的异常)


3 finally语句

finally语句表示的是表示的善后工作,释放资源

public class winning {
    public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array[0]);
            System.out.println("abc");
        }catch(NullPointerException e){
            e.printStackTrace();
            System.out.println("捕获到空指针异常了");
        }finally {
            System.out.println("释放资源");
        }
    }
}

1 其实无论是否存在异常, finally 中的代码一定都会执行到,确保资源可以释放

2 finally语句是按情况写与不写,不是一定要有才能处理异常

3 使用的过程中,要按照try-catch-finally的顺序

利用try负责回收资源(了解)

此时我们可以把鼠标放到try这个关键字上,按下alt + enter,此时就有

83c3b845b5ef4bd9eb994b8282d0de45_watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAamF2Yei_kOiQpQ==,size_20,color_FFFFFF,t_70,g_se,x_16.png

这样子就相当于交由try来负责回收了,但这并不代表每一个异常都可以,只要是try在IDEA中报出了警告,我们可以尝试利用这样的一种快捷键让try去负责回收

finally注意事项

public class winning {
    public static void main(String[] args) {
       System.out.println(func());
    }
    public static int func(){
        try {
            return 20;
        }catch (NullPointerException e){
            e.printStackTrace();
        }finally {
            return 30;
        }
    }
}

运行结果:

30

如果try语句中有返回值,以及finally语句中也有返回值,那么此时将会返回finally语句中的返回值,我们写代码的时候,不要使用这种写法(try与finally中同时拥有返回值)。

4 异常的传递

异常是会随着调用栈的调用而传递

public class winning {
    public static void main(String[] args) {
        try {
            func();
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }
    public static void func(){
       int[] array = {1,2,3,4};
       System.out.println(array[29]);
    }
}

运行结果:

如果向上传递的没有合适的方法处理异常,那么就会返回看上一个调用它的有没有合适的方法处理异常,一直到main中也没有合适的处理异常的方法,那么就只能由jvm来处理了

5 throw与throws关键字

对于throw关键字,我们可以通过这个关键字手动抛出异常

public class winning {
    public static void main(String[] args) {
        try {
            func(0);
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
        }
    }
    public static void func(int a){
        if (a==0){
            throw new NullPointerException("空指针异常了");
        }
    }
}

throws 主要是用来提醒调用者,调用该方法可能会出现那些异常,需要进行处理

四 自定义异常

Java 中虽然已经内置了丰富的异常类, 但是我们实际场景中可能还有一些情况需要我们对异常类进行扩展, 创建符合我们实际情况的异常.

我们可以通过一个例子来说明一下:模拟用户登录,此时就可能抛出两种异常,一种是用户名错误异常,一种是密码错误异常:

我们先写出一段模拟登录的代码

public class winning {
    private static final String ID ="java";
    private static final String Password = "666";
    public static void main(String[] args) {
        System.out.println("请输入你的用户名");
        Scanner scanner=new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的密码");
        String password = scanner.nextLine();
    }
}

定义抛出用户名错误的异常类

//定义一个用户名异常
class NameException extends RuntimeException{
    public NameException(String name){
        super(name);
    }
}

定义抛出密码错误的异常

//定义一个密码异常
class PasswordException extends RuntimeException{
    public PasswordException(String password){
        super(password);
    }
}

我们在进一步完善我们异常处理机制:

public class winning {
    private static final String ID ="java";
    private static final String Password = "666";
    public static void main(String[] args) {
        System.out.println("请输入你的用户名");
        Scanner scanner=new Scanner(System.in);
        String name = scanner.nextLine();
        System.out.println("请输入你的密码");
        String password = scanner.nextLine();
        if (!ID.equals(name)){
            throw new NameException("用户名错了");
        }
        if (!Password.equals(password)){
            throw new PasswordException("密码有误");
        }
    }
}

通过这个例子,让我们了解什么是自定义异常类,如何使用异常类,当然以上代码可以进行优化,可以利用设置一个login登录函数,在利用try-catch进行捕获异常。


注意事项

对于自定义异常类:

1 一定要继承一个异常类(通常为Exception或者RunException)

2 继承Exception说明该类是可受查的

3 继承RunException说明该类是非受查类


结语

关于异常的认识,其实并没有像其他语法一样难理解,如果对你理解异常这一块也有帮助,别忘了给博主点个👍👍哦,之后的学习将会更新一些数据结构的知识!!

目录
相关文章
|
1天前
|
Java 程序员
Java中的异常处理:从基础到高级
【8月更文挑战第30天】在Java编程的世界中,异常处理是一块重要的拼图。它不仅确保了程序的健壮性,还提高了代码的可读性和可维护性。本文将带你深入理解Java的异常处理机制,从基本的try-catch块到高级的自定义异常和最佳实践,我们将一起探索如何优雅地处理那些不请自来的错误信息。
25 17
|
1天前
|
Java 数据库连接 UED
Java中的异常处理:从基础到高级
【8月更文挑战第30天】在Java的世界里,异常是程序运行中不可避免的挑战。本文将引导你理解Java的异常处理机制,从基本的try-catch语句到高级的自定义异常和最佳实践。我们将一起探索如何优雅地处理错误,确保程序的健壮性和可靠性。
19 13
|
2天前
|
存储 搜索推荐 Java
探索安卓开发中的自定义视图:打造个性化UI组件Java中的异常处理:从基础到高级
【8月更文挑战第29天】在安卓应用的海洋中,一个独特的用户界面(UI)能让应用脱颖而出。自定义视图是实现这一目标的强大工具。本文将通过一个简单的自定义计数器视图示例,展示如何从零开始创建一个具有独特风格和功能的安卓UI组件,并讨论在此过程中涉及的设计原则、性能优化和兼容性问题。准备好让你的应用与众不同了吗?让我们开始吧!
|
1天前
|
消息中间件 算法 Java
深入浅出操作系统:进程管理的艺术掌握Java中的异常处理机制
【8月更文挑战第30天】在数字世界的舞台上,操作系统扮演着导演的角色,精心安排着每一个进程的表演。本文将揭开进程管理的神秘面纱,从进程的诞生到终结,探究它们如何在操作系统的指挥下和谐共舞。通过生动的比喻和直观的代码示例,我们将一同走进操作系统的核心,理解进程调度、同步与通信的内在机制,以及它们对计算生态的重要性。让我们跟随代码的节奏,一起感受操作系统的魅力吧!
|
2天前
|
Java 开发者
Java中的异常处理:从基础到高级
【8月更文挑战第30天】在Java的世界中,异常处理是每个开发者必须面对的挑战。本文不仅教你如何在代码中优雅地处理异常,还将深入探讨如何设计异常类和自定义异常,让你的Java程序更加健壮和易于维护。让我们一起探索Java异常处理的秘密,从新手到高手,只需一篇文章的距离!
|
1天前
|
Java 编译器 开发者
Java中的异常处理机制
【8月更文挑战第30天】在Java编程中,异常处理是不可或缺的一部分。本文将探讨Java的异常处理机制,包括异常的概念、分类以及如何处理异常。我们将通过实际代码示例来展示如何在Java程序中捕获和处理异常,确保程序的稳定性和可靠性。无论你是初学者还是有经验的开发者,这篇文章都将帮助你更好地理解和应用Java的异常处理机制。
5 1
|
2天前
|
Java
深入浅出Java异常处理
【8月更文挑战第29天】在Java的世界中,异常是程序运行中不可忽视的“小石子”。它们可能让你的程序“绊倒”,但正确的异常处理策略能让这些“小石子”变成“垫脚石”。本文将带你了解Java异常处理的奥秘,从异常的基本概念到高级应用,让你的程序更加健壮。
|
2天前
|
Java UED
深入浅出Java异常处理
【8月更文挑战第29天】在Java的世界里,异常是程序运行中不可忽视的“小石头”。它们可能让代码执行路径发生偏移,甚至导致程序崩溃。掌握好Java异常处理的技巧,就像学会在崎岖的道路上稳稳行走。本文将带你了解如何优雅地处理这些“小石头”,确保你的程序能够稳健前行。
|
2天前
|
Java 数据库
震惊!Guava Throwables 类如魔法棒般神奇,让 Java 异常处理华丽变身!
【8月更文挑战第29天】在 Java 开发中,异常处理至关重要,而 Guava 库中的 `Throwables` 类则提供了强大的异常处理工具。它包含了一系列静态方法,如 `propagateIfInstanceOf` 和 `propagateIfPossible`,可以帮助我们有条件地传播异常。此外,`getRootCause` 方法可以深入分析异常的根本原因,有助于快速定位问题所在。无论是构建大型分布式系统还是电商平台,`Throwables` 类都能显著提升异常处理的效率和准确性,使我们的程序更加稳定和可靠。
10 1
|
1天前
|
安全 Java
深入浅出Java异常处理机制
【8月更文挑战第30天】在Java编程世界中,异常处理是维护程序健壮性的重要手段。本文将带你一探Java异常处理的奥秘,从基本的异常类型到高级的处理策略,我们用简单的语言和生动的比喻,让你像拼图一样轻松掌握每个部分。准备好,让我们一起揭开异常处理的面纱,学会如何优雅地应对程序中的“意外惊喜”。
下一篇
云函数