Java宝典-异常

目录

  • 1. 异常的分类
    • 1.1 运行时异常
    • 1.2 编译时异常
  • 2. 异常的抛出
    • 2.1 throw
    • 2.2 throws
  • 3. 异常的捕获
    • 3.1 try-catch
    • 3.2 finally
  • 4. 异常执行的过程
  • 5. 自定义异常

在Java中,异常(Exception)是指程序发生不正常的行为,异常其实就是一个一个的类。

1. 异常的分类

Java中,异常有很多种,每一种异常都是一个类,为了更好地管理这些类Java引入了一个异常体系,如图
在这里插入图片描述
Exception是Throwable的子类,也就是说Throwable是异常体系中最顶层的类。Throwable还有一个子类叫Error,Error指的是错误,是指程序发生无力回天的错误(虚拟机内部错误、内存资源耗尽),如栈溢出错误。异常可以通过程序员的处理让程序继续执行,异常可以分为两种:运行时异常、编译时异常。

1.1 运行时异常

运行时异常是指程序运行之后出现的异常,也叫非受查异常,RuntimeException及其子类都属于运行时异常。例如空指针异常:

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

在这里插入图片描述

1.2 编译时异常

编译时异常是指代码在编译时发生的异常,也叫受查异常,如:CloneNotSupportedException(克隆不支持异常)
在这里插入图片描述
A类没有实现Cloneable接口,在程序还没运行之前就报错了,这就是编译时异常。

2. 异常的抛出

2.1 throw

当程序出现异常,程序会自动抛出异常,程序猿们也可以使用throw手动抛出异常,语法是:throw new xxxException;
比如:抛出一个RuntimeException

throw new RuntimeException();

2.2 throws

throws是异常的声明,表示在这个地方有异常会发生,但是没有处理这个异常。
如:在main方法中声明CloneNotSupportedException异常

    public static void main(String[] args) throws CloneNotSupportedException {
        //...........
    }

3. 异常的捕获

前面说的都是异常的抛出和声明,但是并没有处理异常,那么如何处理异常?可以使用try-catch

3.1 try-catch

try的意思是尝试,catch的意思是抓住/捕获。
try-catch的语法格式如下:

try {
		//可能发生异常的代码块
        } catch (要捕获的异常类型) {
        //处理异常的代码块            
        }

例如:

    public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        } catch (NullPointerException e) {
            //......处理异常的代码
            e.printStackTrace();//printStackTrace可以打印堆栈的信息            
        }
    }

try-catch也支持下面几种用法:

try {
            //.....
        } catch (NullPointerException e) {
            //.....
        } catch (ArithmeticException e) {
            //.....
        }
try {
            //.....
        } 
catch (NullPointerException | ArithmeticException e) {
            //.....
        }

注意事项:
如果包含多个catch且异常有父子类关系,父类必须放在最后。
如:
Exception是所有异常的父类,应该将Exception放在最后。

try {
            //.....
        } catch (NullPointerException e) {
            //.....
        } catch (Exception e) {
            
        }

3.2 finally

finally需配合try-catch使用,无论有没有发生异常,finally当中的语句都会执行。例如:

public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        } catch (NullPointerException e) {
            System.out.println("这里发生空指针异常!!!");
        } finally {
            System.out.println("finally语句");
        }
    }

运行结果:
在这里插入图片描述

4. 异常执行的过程

如图:
在这里插入图片描述
举个例子:
例子1:
下面代码会出现空指针异常,但是没有进行任何处理,程序直接终止,after不会被打印

public static void main(String[] args) {
        int[] array = null;
        System.out.println(array.length);
        System.out.println("after");
    }

运行结果:
在这里插入图片描述
例子2:
以下代码也会发生空指针异常,但是catch并没有这个类型,也就是说catch语句捕获不到空指针异常,此时会将异常交给Java虚拟机,程序直接终止,after也不会被打印

 public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        } catch (ArithmeticException e) {
            System.out.println("发生算术异常!!!");
        }
        System.out.println("after");   
    }

运行结果:
在这里插入图片描述

例子3:
以下代码发生空指针异常,catch语句捕获到了这个异常,程序继续执行,after打印

public static void main(String[] args) {
        try {
            int[] array = null;
            System.out.println(array.length);
        } catch (NullPointerException e) {
            System.out.println("发生空指针异常!!!");
        }
        System.out.println("after");
    }

运行结果:
在这里插入图片描述

5. 自定义异常

虽然Java中有很多内置的异常类,但是并不能完全满足我们使用,能不能自己定义一种异常?完全可以!
我们可以模仿Java内置的异常来定义自己的异常类:
Java内置异常NullPointerException:
在这里插入图片描述
自定义异常:

public class MyException extends RuntimeException {
    public MyException() {
        super();
    }
    public MyException(String s) {
        super(s);
    }
}

注意事项:
1. 自定义的异常类名称尽量做到见名知意
2. 自定义异常一般继承Exception或RuntimeException
3. 如果自定义异常继承的是Exception,这个自定义的异常默认是受查异常
4. 如果自定义异常继承的是RuntimeException,这个自定义的异常默认是非受查异常

今天的内容就到这里,感谢老铁们的点赞收藏~

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

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

相关文章

c++刷题(自用)(问题合集)---(一直会更)

初始化列表易错点 #include <iostream> using namespace std;struct A {A() { std::cout << "A"; } }; struct B {B() { std::cout << "B"; } };class C { public:C() : a(), b(){std::cout << "C";}private:B b;A a; …

【AcWing】蓝桥杯集训每日一题Day5|归并排序|离散化|二分|逆序数对|505.火柴排队(C++)

火柴排队 505. 火柴排队 - AcWing题库难度&#xff1a;中等时/空限制&#xff1a;1s / 128MB总通过数&#xff1a;2058总尝试数&#xff1a;4484来源&#xff1a;NOIP2013提高组算法标签贪心离散化树状数组归并排序 题目内容 涵涵有两盒火柴&#xff0c;每盒装有 n 根火柴…

基于Pnpm + Turborepo + QianKun的微前端+Monorepo实践

基于Pnpm Turborepo QianKun的微前端Monorepo实践 背景 微前端一般都会涉及多个代码库&#xff0c;很多时候要一个一个代码库地去开发维护和运行&#xff0c;很不方便&#xff0c;这种时候引入Monorepo搭配微前端就能很好地解决这种问题&#xff0c;一个代码库就可以完成整…

AI赋能写作:AI大模型高效写作一本通

❤️作者主页&#xff1a;小虚竹 ❤️作者简介&#xff1a;大家好,我是小虚竹。2022年度博客之星评选TOP 10&#x1f3c6;&#xff0c;Java领域优质创作者&#x1f3c6;&#xff0c;CSDN博客专家&#x1f3c6;&#xff0c;华为云享专家&#x1f3c6;&#xff0c;掘金年度人气作…

文件包含例子

一、常见的文件包含函数 php中常见的文件包含函数有以下四种&#xff1a; include() require() include_once() require()_once() include与require基本是相同的&#xff0c;除了错误处理方面: include()&#xff0c;只生成警告&#xff08;E_WARNING&#xff09;&#x…

linux之source.list解析

众所周知&#xff0c;linux可以通过apt命令安装软件&#xff0c;那么apt又是从哪里获取软件包呢并安装呢&#xff1f;这里就绕不开一个文件source.list&#xff0c;该文件定义了软件源相关的信息。下面以实际例子&#xff0c;详细的介绍下这个文件。 文件作用 定义软件源的信…

MySQL-HMA 高可用故障切换

本章内容&#xff1a; 了解MySQL MHA搭建MySQL MHAMySQL MHA故障切换 1.案例分析 1.1.1案例概述 目前 MySQL 已经成为市场上主流数据库之一&#xff0c;考虑到业务的重要性&#xff0c;MySQL 数据库 单点问题已成为企业网站架构中最大的隐患。随着技术的发展&#xff0c;MHA…

【C++庖丁解牛】List容器的介绍及使用 | 深度剖析 | list与vector的对比

&#x1f341;你好&#xff0c;我是 RO-BERRY &#x1f4d7; 致力于C、C、数据结构、TCP/IP、数据库等等一系列知识 &#x1f384;感谢你的陪伴与支持 &#xff0c;故事既有了开头&#xff0c;就要画上一个完美的句号&#xff0c;让我们一起加油 目录 1. list的介绍1.1 list的…

每周一算法:双向深搜

题目描述 达达帮翰翰给女生送礼物&#xff0c;翰翰一共准备了 N N N 个礼物&#xff0c;其中第 i i i 个礼物的重量是 G [ i ] G[i] G[i]。 达达的力气很大&#xff0c;他一次可以搬动重量之和不超过 W W W的任意多个物品。 达达希望一次搬掉尽量重的一些物品&#xff0c;请…

冲动是魔鬼,工作不顺心时不要把坏脾气带给家人

今天与一个跟踪了很久的客户准备签合同了&#xff0c;客户突然反悔&#xff0c;为此与他周旋了一整天&#xff0c;忙碌得一口水都没有喝。回到小区坐在车里抽着烟&#xff0c;久久不愿回家&#xff0c;只想一个人坐着&#xff0c;疲惫、无奈。这个月的奖金似乎又将成为泡影。 …

mov格式视频怎么做二维码?视频在线做二维码的方法

如何将mov格式视频转二维码以后分享呢&#xff1f;视频二维码是现在手机获取视频内容很常用的一种方式&#xff0c;通过二维码生成器工具就可以快速在线生成二维码图片&#xff0c;使用手机扫码就可以播放视频。但是视频的格式有很多种&#xff0c;当我们需要将mov格式的视频生…

网络安全——关于防火墙

网络安全防火墙是很重要的部分&#xff0c;关于防火墙我们要知道&#xff0c;他默认所有流量都是黑名单&#xff0c;只有开启允许通过才可以。 我们通过一个实验来学防火墙命令。 防火墙要登录才能使用&#xff0c;用户名是admin,默认密码是Admin123&#xff0c;在第一次登录…

Spring AI Chat 简单示例

官方文档地址&#xff1a; https://docs.spring.io/spring-ai/reference/index.html Spring AI 可以方便 Java 开发者在代码中集成 AI 的功能&#xff0c;通过 Spring 提供的抽象&#xff0c;可以方便的切换不同的AI提供商&#xff0c;Spring AI 是对 AI 的使用&#xff0c;并…

Android 地图SDK 绘制点 删除 指定

问题 Android 地图SDK 删除指定绘制点 详细问题 笔者进行Android 项目开发&#xff0c;对于已标记的绘制点&#xff0c;提供撤回按钮&#xff0c;即删除绘制点&#xff0c;如何实现。 解决方案 新增绘制点 private List<Marker> markerList new ArrayList<>…

没有公式,不要代码,让你理解 RCNN:目标检测中的区域卷积神经网络

⭐️ 导言 在计算机视觉领域&#xff0c;目标检测是一项关键任务&#xff0c;它涉及识别图像中感兴趣的物体&#xff0c;并定位它们的位置。而RCNN&#xff08;Region-based Convolutional Neural Network&#xff09;是一种经典的目标检测算法&#xff0c;它以区域为基础进行…

BMP280 arduino调试

终于成功了。 #include <SPI.h> //定义数据类型 #define s32_t long signed int #define u32_t long unsigned int #define u16_t unsigned short #define s16_t signed short // 定义从设备选择引脚 const int chipSelectPin 10; //定义BMP280寄存器/// unsigned int …

R语言:如何基于地球外辐射(Ra)和相对日照(n/N)计算太阳辐射Rs?

正在编写相关软著&#xff0c;借此机会了解R语言的基本语法和一些处理流程&#xff0c;所以解释稍微繁琐。 Note&#xff1a; 使用的R语言版本是 R version 4.3.2 (2023-10-31 ucrt) 使用的RStudio编辑器版本是&#xff1a; 01 基于随机森林的插值填补缺失值 这是目前处理…

电子供应链的未来:电子元器件采购商城的洞察

电子供应链的未来将受到数字化技术、智能化制造和全球化贸易等趋势的深刻影响。在这一背景下&#xff0c;电子元器件采购商城将发挥越来越重要的作用&#xff0c;并提供以下洞察&#xff1a; 数字化转型&#xff1a; 电子元器件采购商城将更加注重数字化转型&#xff0c;通过引…

【计算机系统结构】重叠方式

&#x1f4dd;本文介绍 本文主要内容位计算机系统结构的重叠方式 &#x1f44b;作者简介&#xff1a;一个正在积极探索的本科生 &#x1f4f1;联系方式&#xff1a;943641266(QQ) &#x1f6aa;Github地址&#xff1a;https://github.com/sankexilianhua &#x1f511;Gitee地址…

不可变集合

2. 3. 如果键值对超过10个的话 优化之后 要生成不可变的集合直接使用copyof就可以