我的编程空间,编程开发者的网络收藏夹
学习永远不晚

Java Exception异常全方面分析

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

Java Exception异常全方面分析

如下实例:


public class Demo {
    public static void main(String[] args) {
        int num = 2/0;
    }
}

这段代码中“除0”的逻辑在C语言中就只是报个警告,但是Java是比较安全的语言,在编译运行的时候会直接抛出异常

那么到底什么是异常?

一、什么是异常?

异常指的是在程序运行过程中发生的异常事件,通常是由外部问题(如硬件错误、输入错误)所导致的。在Java等面向对象的编程语言中异常属于对象.

异常本身是一个对象,产生异常就是产生了一个异常对象

Java的异常体系

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-oL91wEfr-1645859727173)(C:\Users\LY\AppData\Roaming\Typora\typora-user-images\image-20220110210046681.jpg)]

我们都知道Java中所有类都是继承自Object的,Throwable这个类也是如此,如下Java官方文档

我们可以看到

继承于throwable类的有两个,一个是Error(错误),一个是Exception(异常),throwable是Java中所有错误和异常的父类

而异常又分为受查异常和非受查异常(我们之前碰到过的除0发生的异常就是非受查异常)

非受查异常:Java语言规范将派生于 Error 类或 RuntimeException 类的所有异常称为非受查异常(因为程序的代码Bug导致的问题,空指针异常,数组下标越界异常)

受查异常:所有的其他异常称为 受查异常(程序编译时抛出的异常),必须处理,否则代码编译不能通过(一些可以经过重试或者程序自动修复可以解决的问题)

错误:因为设备或其他硬性环境导致的,程序根本无法修复的问题

如何排查异常

如下代码:

在文章开头写的一个"除0"代码的运行结果:

这里面java.lang.ArithmeticException是异常的种类,by zero是异常的具体信息

常见的异常种类有:

NullPointerException:空指针异常

ArithmeticException:算术异常

ArrayIndexOutOfBoundsException:数组下标越界异常

PS:异常的种类有很多,不同的异常具有不同的含义,也有不同的处理方式

有的时候异常信息会有很多行,这些异常信息被称为异常信息栈/异常跟踪栈,那么我们如何在这些异常信息中找到引发异常的第一现场呢?

直接点击最上面第一条异常信息的蓝色部分,光标就会自动跳转到引发异常的地方,从而进行相应的修改

二、 处理异常

Java当中异常的核心思想其实就是让我们先操作,在操作过程中遇到问题再处理

try…catch基本语法

try{
有可能出现异常的语句;
}[catch (异常类型 异常对象) {
捕捉try当中可能出现的异常;
可以写多个catch;
} ... ]
[finally {
异常的出口;
可以不写;
finally中的代码一定会被执行,用来做一些善后工作;
}]

  • try 代码块中放的是可能出现异常的代码.
  • catch 代码块中放的是出现异常后的处理行为
  • finally 代码块中的代码用于处理善后工作, 会在最后执行.
  • 其中 catch 和 finally 都可以根据情况选择加或者不加.

我们还是以"除0"问题为例


public static void main(String[] args) {
    int a = 10/0;
    System.out.println("666");
}

这个程序显然到了int a = 10/0;就会抛出异常,后面的666不会被打印出来

此处发生异常,程序会直接交给JVM处理异常,导致的结果是程序会立即停止,不再向下执行

那么我们如果想要让程序继续往下执行呢?

这个时候就要处理异常


public static void main(String[] args) {
    try {
        int a = 10 / 0;
    } catch (ArithmeticException e) {
        e.printStackTrace();
    }
     System.out.println("666");
}

在try中放入可能会引发异常的语句,在catch后面的圆括号内写入想要捕获异常的种类ArithmeticException,然后就可以对此异常做出处理,e.printStackTrace();打印异常追踪栈,最后再打印666

运行结果:

当程序抛出异常的时候,由catch块进行捕获,程序自己来处理异常,导致的结果就是程序会继续向下执行

注意:如果catch中要捕获的异常种类和实际发生异常的种类不一样的话,就还是交给JVM处理了,程序立即停止

如果我们用Exception来捕获异常呢?

如下代码


public static void main(String[] args) {
    try {
        int a = 10 / 0;
    }catch (Exception e) {
        System.out.println(999);
    }catch (ArithmeticException e) {
        System.out.println(888);
    }     // 直接捕获Exception的话,后面的这些catch就没啥用了,编译器就会报错
    System.out.println("666");
}   

所有异常继承于Exception,那么当出现异常的时候,Exception可以捕获所有的异常,这样只需要写一个捕获Exception的catch就行了,但是不建议这么写,这样得不到具体的异常种类

finally

无论catch有没有捕获到异常,finally块中的代码都会在最后被执行


public static void main(String[] args) {
    try {
        int a = 10 / 0;
        System.out.println("666");
    }catch (ArithmeticException e) {
        System.out.println("888");
    }finally {
        System.out.println("999");
    }
    System.out.println("777");
}

在方法中出现异常

如果本方法中没有合适的处理异常的方式,就会沿着调用栈向上传递


public class ExceptionLearning {
    public static void demo() {
        int a = 10/0;
    }
    public static void main(String[] args) {
        demo();
    }
}

运行结果:

在demo方法中执行时,抛出算术异常,因为demo方法是被main方法调用的,所以demo就会让main方法来处理异常,但是main方法中也没有处理异常,就会交给JVM来处理,程序就会异常终止

若对异常做出处理


public class ExceptionLearning {
    public static void demo() {
        int a = 10/0;
    }
    public static void main(String[] args) {
        try {
            demo();
        }catch (ArithmeticException e) {
            e.printStackTrace();
        }finally {
            System.out.println("继续向下执行");
        }
    }
}

在demo方法中执行时,抛出算术异常,因为demo方法是被main方法调用的,所以demo就会让main方法来处理异常,main方法中对异常做出处理,程序继续向下执行

异常处理流程

  • 程序先执行 try 中的代码,如果 try 中的代码出现异常, 就会结束 try 中的代码, 看和 catch 中的异常类型是否匹配.
  • 如果找到匹配的异常类型, 就会执行 catch 中的代码,如果没有找到匹配的异常类型, 就会将异常向上传递到上层调用者.
  • 无论是否找到匹配的异常类型, finally 中的代码都会被执行到(在该方法结束之前执行).
  • 如果上层调用者也没有处理异常, 就继续向上传递,一直到 main 方法也没有合适的代码处理异常, 就会交给 JVM 来进行处理, 此时程序就会异常终止

手动抛出异常

除了Java编译器来抛出异常以外,我们也可以自己针对一些情况来抛出异常

三、自定义异常

要知道,异常本身就是一个对象,它肯定是对应一个类的,那么我们也可以通过创建类的方式来自定义异常

源码剖析

我们这里以Arithmetic类为例,可以先看看它的源码

从源码中会发现Arithmetic这个类继承自RuntimeException类,并且有两个构造方法,一个有参,一个无参

自定义

我们也可以仿照Arithmetic来自定义,如下代码


class MyException extends RuntimeException{
    public MyException() {
        super();
    }
    public MyException(String str) {
        super(str);
    }
}
public class ExceptionLearning {
    public static void main(String[] args) throws MyException{   //在方法上加上异常说明, 相当于将处理动作交给上级调用者
        int b = 0;
        if (b == 0) {
            throw new MyException("b == 0");
        }
    }
}

运行结果

注意

当我们将MyException继承于RuntimeException的时候,这个异常就默认是非受查异常;继承于Exception的时候,这个异常就默认是受查异常

Java针对受查异常,强制要求: 一个方法如果抛出了受查异常,则必须通过throws声明异常;如果抛出了非受查异常,则必须声明

到此这篇关于Java Exception异常全方面分析的文章就介绍到这了,更多相关Java 异常内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

Java Exception异常全方面分析

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

Java异常处理操作Throwable、Exception、Error的示例分析

这篇文章主要介绍了Java异常处理操作Throwable、Exception、Error的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。异常是一个事件,它发生在程序运
2023-06-15

PHP中Exception异常机制的示例分析

这篇文章将为大家详细讲解有关PHP中Exception异常机制的示例分析,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。异常的基本使用当异常被抛出时,其后的代码不会继续执行,PHP 会尝试查找匹配的 "ca
2023-06-20

怎么分析Java异常

怎么分析Java异常,相信很多没有经验的人对此束手无策,为此本文总结了问题出现的原因和解决方法,通过这篇文章希望你能解决这个问题。你觉得自己是一个Java专家吗?是否肯定自己已经全面掌握了Java的异常处理机制?在下面这段代码中,你能够迅速
2023-06-03

Spring Cloud Gateway自定义异常处理Exception Handler的示例分析

这篇文章给大家分享的是有关Spring Cloud Gateway自定义异常处理Exception Handler的示例分析的内容。小编觉得挺实用的,因此分享给大家做个参考,一起跟随小编过来看看吧。方法1: ErrorWebExceptio
2023-06-20

全面了解java中的异常处理

目录Java 异常处理1. 什么是异常2. Java 异常类架构2.1 Throwable 类2.2 Error 类2.3 Exception 类3. 如何进行异常处理4. 抛出异常4.1 实例4.2 throw4.3 throws5. 捕获异常6. 自定义异
2020-09-26

java注解的全面分析

全面解析java注解Java中的常见注解 a.JDK中的注解 @Override 覆盖父类或者父接口的方法 @Deprecated 表示方法已经过时 @SuppressWarnings("deprecation") 忽略方
2023-05-31

Java注解和异常实例分析

今天小编给大家分享一下Java注解和异常实例分析的相关知识点,内容详细,逻辑清晰,相信大部分人都还太了解这方面的知识,所以分享这篇文章给大家参考一下,希望大家阅读完这篇文章后有所收获,下面我们一起来了解一下吧。注解作用注解是JDK1.5版本
2023-07-02

浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别

Exception e中e的getMessage()和toString()方法的区别:示例代码1:public class TestInfo { private static String str =null; public stati
2023-05-31

Java中的异常处理机制介绍(非常全面!)

异常可能是在程序执行过程中产生的,也可能是程序中throw主动抛出的,下面这篇文章主要给大家介绍了关于Java中异常处理机制的相关资料,文中通过实例代码介绍的非常详细,需要的朋友可以参考下
2023-01-18

Java异常类型分析及处理方法是什么

今天就跟大家聊聊有关Java异常类型分析及处理方法是什么,可能很多人都不太了解,为了让大家更加了解,小编给大家总结了以下内容,希望大家根据这篇文章可以有所收获。前言:Java异常,大家都很熟悉。但是对于具体怎么分类的,JVM对其怎么处理的,
2023-06-22

Java中异常处理的示例分析

这篇文章主要介绍Java中异常处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!异常的定义在java中,异常就是java在编译、运行或运行过程中出现的错误总共有三种:1.编译错误 2.运行错误 3.逻辑错误
2023-06-25

SpringMVC全局异常处理的示例分析

这篇文章主要介绍SpringMVC全局异常处理的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!全局异常实现方式 Spring MVC 处理异常有 3 种方式1.使用 Spring MVC 提供的简单异常处理器
2023-06-02

YII2全局异常处理的示例分析

这篇文章主要介绍了YII2全局异常处理的示例分析,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。首先,我们必须理性认识到,任何一个即使稳定的系统中也是存在着大量的 bug,不管
2023-06-14

带你全面认识Java中的异常处理

在你所写过的代码中,你已经接触过一些异常了,我们可以通过一些简单的代码让我们理解一些简单的异常,下面这篇文章主要给大家介绍了关于Java中异常处理的相关资料,文中通过图文介绍的非常详细,需要的朋友可以参考下
2022-12-26

Java异常处理机制实例分析

这篇文章主要介绍“Java异常处理机制实例分析”,在日常操作中,相信很多人在Java异常处理机制实例分析问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”Java异常处理机制实例分析”的疑惑有所帮助!接下来,请跟
2023-06-29

编程热搜

  • Python 学习之路 - Python
    一、安装Python34Windows在Python官网(https://www.python.org/downloads/)下载安装包并安装。Python的默认安装路径是:C:\Python34配置环境变量:【右键计算机】--》【属性】-
    Python 学习之路 - Python
  • chatgpt的中文全称是什么
    chatgpt的中文全称是生成型预训练变换模型。ChatGPT是什么ChatGPT是美国人工智能研究实验室OpenAI开发的一种全新聊天机器人模型,它能够通过学习和理解人类的语言来进行对话,还能根据聊天的上下文进行互动,并协助人类完成一系列
    chatgpt的中文全称是什么
  • C/C++中extern函数使用详解
  • C/C++可变参数的使用
    可变参数的使用方法远远不止以下几种,不过在C,C++中使用可变参数时要小心,在使用printf()等函数时传入的参数个数一定不能比前面的格式化字符串中的’%’符号个数少,否则会产生访问越界,运气不好的话还会导致程序崩溃
    C/C++可变参数的使用
  • css样式文件该放在哪里
  • php中数组下标必须是连续的吗
  • Python 3 教程
    Python 3 教程 Python 的 3.0 版本,常被称为 Python 3000,或简称 Py3k。相对于 Python 的早期版本,这是一个较大的升级。为了不带入过多的累赘,Python 3.0 在设计的时候没有考虑向下兼容。 Python
    Python 3 教程
  • Python pip包管理
    一、前言    在Python中, 安装第三方模块是通过 setuptools 这个工具完成的。 Python有两个封装了 setuptools的包管理工具: easy_install  和  pip , 目前官方推荐使用 pip。    
    Python pip包管理
  • ubuntu如何重新编译内核
  • 改善Java代码之慎用java动态编译

目录