【一步一步了解Java系列】:认识异常类

看到这句话的时候证明:此刻你我都在努力
加油陌生人
微信图片编辑_20240229212205.png

个人主页:Gu Gu Study
专栏:一步一步了解Java

喜欢的一句话: 常常会回顾努力的自己,所以要为自己的努力留下足迹


喜欢的话可以点个赞谢谢了。
作者:小闭


异常类的概念及其层次结构

Java中存在异常类,那么何为异常类呢?那么我们必须先了解一下它的概念:Java异常处理是Java语言中非常重要的一部分,它允许程序在遇到错误时能够优雅地处理问题而不是直接崩溃。Java异常类主要分为两大类:检查型异常(Checked Exceptions)和非检查型异常(Unchecked Exceptions)。

  1. 检查型异常/编译时异常(Checked Exceptions)
    • 这些异常通常是由于编程错误导致的,比如FileNotFoundException或SQLException。
    • 它们必须在方法签名中声明抛出,或者在方法内部被处理(通常是通过try-catch块)。
    • 在运行前编译器就已经报出警告了:
    • image.png
  2. 非检查型异常/运行时异常(Unchecked Exceptions)
    • 这些异常通常是由于运行时错误导致的,比如NullPointerException或ArithmeticException。
    • 它们不需要在方法签名中声明,也不强制要求必须被捕获处理。
    • 如图在运行前编译器是不会提示错误的:image.png

Java中的异常就像我们生活中人生病一样,我们的程序也会生病,我们可以把计算机的病就叫做“异常”。


那么下面就给大家解析一下其层次结构:
Java异常类的层次结构从__java.lang__包中的__Throwable__类开始,它有两个主要的子类:Exception__和__Error

  • Throwable:
    • Java异常类的根类。
    • 有两个重要的子类:Exception和Error。
  • Exception:
    • 表示程序本身可以处理的异常情况。
    • 进一步分为IOException、SQLException等。
  • RuntimeException:
    • Exception的一个子类,表示在Java程序运行时发生的异常。
    • 包括NullPointerException、IndexOutOfBoundsException等。
  • Error:
    • 表示JVM无法处理的错误,比如OutOfMemoryError或StackOverflowError。
    • 通常不需要程序去捕获这些错误

有关处理异常的关键词

在Java中处理异常我们有这么几个常用的关键词 :throw、try、catch、finally、throws。

  1. ** throw 抛出异常 **

如下是一个简单的异常抛出,我们在一个方法中要执行一条语句时,如果其可能会发生异常,如:null,分母为0,数组访问越界,我们都可以自己抛出异常,如下为一个空指针异常

package demo1;

public class Test {

    public static void testExceptinon(int[] arr){
        if(arr==null){
        throw new ArithmeticException();
    }
    }


    public static void main(String[] args) {
        int[] arr=null;
        testExceptinon(arr);
    }

}

image.png
所谓抛出异常其实就是抛出一个Exception或Exception的子类。
注意事项:

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


  1. 异常声明throws

throws一个用来声明异常的关键词,是用在方法上的,具体格式为
** 修饰符 返回值类型 方法名(参数列表) throws 异常类型1,异常类型2…{ } **
注意throws只是起到警示作用,就是给程序员知道用这个方法可能会抛出异常。不会解决异常。

public class Test {

    public static final void test1 ()throws RuntimeException{
        int a=10;
        int c=0;
        System.out.println(a/c);

    }



}
  1. ** try-catch捕获并处理 **

解决异常还得用到try-catch语句,这是我们常用处理异常的关键词,当然还有finally关键词,稍后我也会提到。

import com.sun.security.jgss.GSSUtil;

public class Test {

    public static final void test1 ()throws ArithmeticException{
        int a=10;
        int c=0;
        System.out.println(a/c);

    }

    public static void main(String[] args) {

        int q=10;
        int p=100;
        String s="hello world";
        System.out.println(q+p);
        try{
            test1();              //try的花括号内是放入可能会抛出异常的语句
                                  //如果里面的语句没有抛出异常则会跳出try-catch语句


        }catch (ArithmeticException e){   //小括号里是放入可能会捕捉到的异常类 e

            System.out.println("处理异常");  //catch花括号内是我们自行处理异常的方法

        }finally {
            System.out.println("无论是否捕捉到异常都一定会执行的代码");   //finally里的语句无论是否检测到异常都会执行的语句
        }

        System.out.println("处理完异常后的代码执行");  //这是处理异常后才会执行的语句
                                                 // 当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行
                                               //如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行


    }



}
  1. try的花括号内是放入可能会抛出异常的语句, 如果里面的语句没有抛出异常则会跳出try-catch语句
  2. catch的小括号里是放入可能会捕捉到的异常类 e,catch花括号内是我们自行处理异常的方法
  3. catch-catch-finally外的语句:当异常被捕获到时,异常就被处理了,这里的后序代码一定会执行,如果捕获了,由于捕获时类型不对,那就没有捕获到,这里的代码就不会被执行

  1. ** finally **

配合try-catch语句用的,但是其不是一定要加上去的,而try-catch一定是一起出现的。
在写程序时,有些特定的代码,不论程序是否发生异常,都需要执行,比如程序中打开的资源:网络连接、数据库 连接、IO流等,在程序正常或者异常退出时,必须要对资源进进行回收。另外,因为异常会引发程序的跳转,可能 导致有些语句执行不到,finally就是用来解决这个问题的。

public static int getData() {
    Scanner sc = null;
    try {
        sc = new Scanner(System.in);
        int data = sc.nextInt();
        return data;
    } catch (InputMismatchException e) {
        e.printStackTrace();
    } finally {
        System.out.println("finally中代码");
    }
    System.out.println("try-catch-finally之后代码");
    if (null != sc) {
        sc.close();
    }


    return 0;
}

public static void main(String[] args) {
    int data = getData();
    System.out.println(data);
}

上述程序,如果正常输入,成功接收输入后程序就返回了,try-catch-finally之后的代码根本就没有执行,即输入流 就没有被释放,造成资源泄漏。


自定义异常类

使用的较多的异常类往往是我们自己定义的比较多,那么如何自定义异常类呢,下面我们就来讲讲如何自定义异常类。

class textException extends RuntimeException{

    public textException() {
    }

    public textException(String message) {
        super(message);
    }
}




public class Test1 {

    public static void main(String[] args) {
        int a=0;
        if(a==0){
            throw new textException();
        }
    }

}

image.png
如上我们只需让自己创建出的类继承Exception或其它异常类即可,这样这个类也是一个异常类了。
然后我们在需要抛出异常时,抛出自己定义的异常即可。
也可以用try-catch进行使用解决自己定义的异常。
注意事项:

  • ** 自定义异常通常会继承自 Exception 或者 RuntimeException **
  • **继承自 Exception 的异常默认是受查异常 **
  • **继承自 RuntimeException 的异常默认是非受查异常 **

异常的处理流程

关于 “调用栈” 方法之间是存在相互调用关系的, 这种调用关系我们可以用 “调用栈” 来描述. 在 JVM 中有一块内存空间称为 “虚拟机栈” 专门存储方法之间的调用关系. 当代码中出现异常的时候, 我们就可以使用 e.printStackTrace(); 的 方式查看出现异常代码的调用栈. 如果本方法中没有合适的处理异常的方式, **就会沿着调用栈向上传递 **

public class Test {


    public static final void func1(){

        int[] a={1,2,3,4,5};
        a[10] = 100;



    }

    public static void main(String[] args) {
        try {
           func1();
            System.out.println("hello world");
        }catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            System.out.println("没能合适解决异常");

        }

    }
}

image.png
如上图:在func1中如果没进行处理,堆栈就会延栈调用,也就是图中又看mian方法中是否能够处理好异常,一直向上传递如果都无法解决,一旦交给JVM处理那么程序将会终止,就不会进行之后的代码。

异常类与if的区别

首先我们来说说if在应对程序的应用是怎样的?
if语句:
比如:下面代码我们的if就是在检测到b==0时,就不让程序继续进行下面的计算。
这属于一种事先防卫型,就是避免错误发生。在发生之前就将程序阻断。

package demo1;

import java.util.Scanner;

public class Test {

    public static void main(String[] args) {
        Scanner sc=new Scanner(System.in);
        int a=sc.nextInt();
        int b=sc.nextInt();
        
        if(b==0){
            System.out.println("分母为0,数字不合法");
        }else {
            System.out.println("a/c= "+a/b);
        }
        
        
    }
}

异常类:
如下:异常类相比于if更像是先斩后奏型,事后处理型,在程序发现问题时在进行处理问题,如下代码将可能有异常的语句放到try括号中,如果出现异常在进行解决:

package demo1;

public class Test1 {

    public static void main(String[] args) {
        int a=10;
        int b=0;
        try{
            System.out.println("a/c= "+a/b);
        }catch (ArithmeticException e){
            System.out.println("捕捉到异常并解决异常的方法");
        }
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/732123.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

Python中用于从图像中提取文本的8大OCR库

介绍 你是否曾想过你的电脑如何能够从图像中读取文字?这都要归功于一种叫做光学字符识别(Optical Character Recognition, OCR)的技术。 在Python中,有一些非常酷的库可以帮助你的电脑理解图片中的文字。从谷歌强大的Tesseract到E…

热点观察 | 全球社交应用IAP收入持续上升,小游戏、短剧出海赛道火热!

2024年进度条即将过半,回顾上半年,“Sora横空出世”、“短剧出海”、“小游戏爆款不断"给了我们太多惊喜,虽说如今市场竞争激烈、行业日趋饱和,但新技术、新需求也在快速跟上。下面,我们就来盘一盘近期全球手游和…

Python | Leetcode Python题解之第166题分数到小数

题目&#xff1a; 题解&#xff1a; class Solution:def fractionToDecimal(self, numerator: int, denominator: int) -> str:if numerator % denominator 0:return str(numerator // denominator)s []if (numerator < 0) ! (denominator < 0):s.append(-)# 整数部…

开发指南033-数据库兼容

元芳&#xff0c;你怎么看&#xff1f; 单一数据库自身就有一些不同处理之处&#xff0c;如果一个平台要兼容所有数据库&#xff0c;就是难上加难&#xff0c;像isnull函数各数据库就不同。 对于这类问题&#xff0c;平台采用统一自定义函数解决&#xff0c;例如上面的round函…

【Leetcode】2663. 字典序最小的美丽字符串

题目 题目链接&#x1f517;如果一个字符串满足以下条件&#xff0c;则称其为 美丽字符串 &#xff1a; 它由英语小写字母表的前 k 个字母组成。它不包含任何长度为 2 或更长的回文子字符串。 给你一个长度为 n 的美丽字符串 s 和一个正整数 k 。请你找出并返回一个长度为 n…

Android低版本上APP首次启动时间减少80%(二)

06-25 15:10:53.821 7449 7450 D dalvikvm: threadid2: sending two SIGSTKFLTs to threadid135 (tid8021) to cause debuggerd dump SIGSTKFLT 是 Dalvik 虚拟机特有的一个信号。当虚拟机发生了 ANR 或者需要做 GC 的时候&#xff0c;就需要挂起所有 RUNNING 状态的线程&…

技巧:合并多个RAR分卷压缩

因为文件压缩之后体积仍然过大&#xff0c;大家可能会选择进行分卷压缩&#xff0c;那么rar分卷压缩包之后如何合并成一个压缩包文件呢&#xff1f;今天我们来学习rar分卷压缩包&#xff0c;合并成一个的方法。 最基础的方法就是将分卷压缩包解压出来之后&#xff0c;再将文件…

第10章 启动过程组 (概述)

第10章 启动过程组 概述&#xff0c;在第三版教材第354~355页&#xff1b; 文字图片音频方式 视频11 第一个知识点&#xff1a;两个过程 如图10-1 启动过程组第二个知识点&#xff1a;目的 协调各方干系人的期望与项目目的&#xff0c;告知各干系人项目范围和目标&#xff0c…

如何用 Google Chrome 浏览器浏览经过 XSLT 渲染的 XML 文件

对于经过XSLT渲染的XML文件&#xff0c;本来&#xff0c;可以直接用 IE (Internet Explorer) 打开&#xff0c;就能看到渲染之后的样子&#xff0c;很方便。但是后来&#xff0c;微软把 IE 换成了 Microsoft Edge&#xff0c;按理说这是比 IE 更先进的浏览器&#xff0c;可是偏…

软件缺陷及JIRA工具

一、软件缺陷及跟踪流程 1&#xff0c;软件缺陷信息 案例 &#xff08;1&#xff09;缺陷报告的基本内容 缺陷的标题 预置条件 重现步骤 期望结果 实际结果 &#xff08;2&#xff09;软件缺陷的状态 新建 打开 修复 关闭 &#xff08;3&#xff09;软件缺陷的严重程度 …

【计算机毕业设计】204基于微信小程序疫情期间学生请假与销假系统

&#x1f64a;作者简介&#xff1a;拥有多年开发工作经验&#xff0c;分享技术代码帮助学生学习&#xff0c;独立完成自己的项目或者毕业设计。 代码可以私聊博主获取。&#x1f339;赠送计算机毕业设计600个选题excel文件&#xff0c;帮助大学选题。赠送开题报告模板&#xff…

【论文阅读】-- Attribute-Aware RBFs:使用 RT Core 范围查询交互式可视化时间序列颗粒体积

Attribute-Aware RBFs: Interactive Visualization of Time Series Particle Volumes Using RT Core Range Queries 摘要1 引言2 相关工作2.1 粒子体渲染2.2 RT核心方法 3 渲染彩色时间序列粒子体积3.1 场重构3.1.1 密度场 Φ3.1.2 属性字段 θ3.1.3 优化场重建 3.2 树结构构建…

灵感枯竭?来看Charls,新指标发一区(IF=9.3)| CHARLS等七大老年公共数据库周报(6.12)...

七大老年公共数据库 七大老年公共数据库共涵盖33个国家的数据&#xff0c;包括&#xff1a;美国健康与退休研究 (Health and Retirement Study, HRS)&#xff1b;英国老龄化纵向研究 &#xff08;English Longitudinal Study of Ageing, ELSA&#xff09;&#xff1b;欧洲健康、…

快速识别银行卡,API接口让金融更智能

随着科技的不断进步&#xff0c;金融行业也变得越来越智能化。一项名为银行卡识别的技术&#xff0c;正在逐渐改变着我们的金融生活。使用API接口&#xff0c;我们能够快速准确地识别银行卡的卡号、有效期、发卡行和卡片类型等关键字段&#xff0c;不仅方便了用户&#xff0c;也…

visual studio 创建c++项目

目录 环境准备&#xff1a;安装 visual studiovisual studio 创建c项目Tips&#xff1a;新建cpp文件注释与取消注释代码 其他初学者使用Visual Studio开发C和C时常遇到的3个坑 环境准备&#xff1a;安装 visual studio 官网&#xff1a;https://visualstudio.microsoft.com/zh…

威纶通触摸屏软件出现显示异常问题(显示黑色)处理方法

异常现象 电脑端显示异常&#xff0c;显示黑色 解决方法 Step1&#xff1a;软件根目录查找DisplaySetting.exe Step2&#xff1a;勾选第1或第2项&#xff0c;重启软件即可 分享创作不易&#xff0c;请多多支持&#xff0c;点赞、收藏、关注&#xff01; Ending~

基于java+springboot+vue实现的电商应用系统(文末源码+Lw)241

摘 要 现代经济快节奏发展以及不断完善升级的信息化技术&#xff0c;让传统数据信息的管理升级为软件存储&#xff0c;归纳&#xff0c;集中处理数据信息的管理方式。本电商应用系统就是在这样的大环境下诞生&#xff0c;其可以帮助管理者在短时间内处理完毕庞大的数据信息&a…

iTextSharp 绘制pdf

一、新建项目&#xff1a;pdfdemo <ItemGroup><PackageReference Include"iTextSharp.LGPLv2.Core" Version"3.4.20" /> </ItemGroup>二、HomeController.cs using iTextSharp.text; using iTextSharp.text.pdf; using Microsoft.AspN…

性能工具之 MySQL OLTP Sysbench BenchMark 测试示例

文章目录 一、前言二、测试环境1、服务器配置2、测试拓扑 三、测试工具安装四、测试步骤1、导入数据2、压测数据3、清理数据 五、结果解析六、最后 一、前言 做为一名性能工程师掌握对 MySQL 的性能测试是非常必要的&#xff0c;本文基于 Sysbench 对MySQL OLTP&#xff08;联…

Python应用开发——30天学习Streamlit Python包进行APP的构建(7)

st.data_editor 显示数据编辑器 widget。 数据编辑器 widget 可让你在类似表格的用户界面中编辑数据框和许多其他数据结构。 警告 When going from st.experimental_data_editor to st.data_editor in 1.23.0, the data editors representation in st.session_state was ch…