Java宝典-异常

news2024/11/18 20:27:53

目录

  • 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,这个自定义的异常默认是非受查异常

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

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

算法-贪心-122. 糖果传递

题目 有 n个小朋友坐成一圈,每人有 a[i]个糖果。 每人只能给左右两人传递糖果。 每人每次传递一个糖果代价为 1。 求使所有人获得均等糖果的最小代价。 输入格式 第一行输入一个正整数 n,表示小朋友的个数。 接下来 n 行,每行一个整数…

数据结构 之 优先级队列(堆) (PriorityQueue)

🎉欢迎大家观看AUGENSTERN_dc的文章(o゜▽゜)o☆✨✨ 🎉感谢各位读者在百忙之中抽出时间来垂阅我的文章,我会尽我所能向的大家分享我的知识和经验📖 🎉希望我们在一篇篇的文章中能够共同进步!!&…

langchain学习(十二)

Chat Messages | 🦜️🔗 Langchain ChatMessageHistory:基类,保存HumanMessages、AIMessages from langchain.memory import ChatMessageHistory history ChatMessageHistory() history.add_user_message("hi!") his…

使用docker-compose管理freeswitch容器

概述 之前的文章我们介绍过如何将freeswitch做成docker镜像,也使用命令行模式正常启动了fs的docker容器。 但是当我们需要同时管理多个docker容器的时候,还是使用docker-compose更简单。 环境 CENTOS 7 docker engine:Version 25.0.3 D…

【深度学习与神经网络】MNIST手写数字识别1

简单的全连接层 导入相应库 import torch import numpy as np from torch import nn,optim from torch.autograd import Variable import matplotlib.pyplot as plt from torchvision import datasets, transforms from torch.utils.data import DataLoader读入数据并转为ten…

IDEA中在Service中开启管理多个微服务

问题 : 现在的service窗口里面什么都没有 ; 解决 : 1.没有service情况 : 点击View->Tool Windows -> Services,打开Service 2 . 在Service栏里操作 : 点击Add service , 然后选择第一个 : 然后在出来的选项中找到自己的项目类型 , 点击一下…

贪心算法(算法竞赛、蓝桥杯)--糖果传递

1、B站视频链接&#xff1a;A31 贪心算法 P2512 [HAOI2008] 糖果传递_哔哩哔哩_bilibili 题目链接&#xff1a;[HAOI2008] 糖果传递 - 洛谷 #include <bits/stdc.h> using namespace std; const int N1000005; int n,a[N],c[N]; long long b,ans;int main(){scanf(&quo…

Docker Compose基本配置及使用笔记

Docker Compose基本配置及使用笔记 简介 Docker Compose 是一个用于定义和运行多个 Docker 容器应用程序的工具。它使用 YAML 文件来配置应用程序的服务&#xff0c;并通过简单的命令集管理这些服务的生命周期。 1.步骤1 代码如下&#xff1a;docker-compose.yml放在虚拟机roo…

Mac版Jmeter安装与使用模拟分布式环境

Mac版Jmeter安装与使用&模拟分布式环境 1 安装Jmeter 1.1 安装Java环境 国内镜像地址&#xff1a;https://repo.huaweicloud.com/java/jdk/11.0.29/jdk-11.0.2_osx-x64_bin.dmg 下载dmg后&#xff0c;双击进行安装。 配置环境变量&#xff1a; # 1 打开环境变量配置文件…

js实现扫描线填色算法使用canvas展示

算法原理 扫描线填色算法的基本思想是&#xff1a;用水平扫描线从上到下扫描由点线段构成的多段构成的多边形。每根扫描线与多边形各边产生一系列交点。将这些交点按照x坐标进行分类&#xff0c;将分类后的交点成对取出&#xff0c;作为两个端点&#xff0c;以所填的色彩画水平…

结构体联合体枚举和位段

文章目录 结构体结构体类型的声明特殊的声明 结构的自引用结构体变量的定义和初始化结构体内存对齐为什么要内存对齐结构体传参结构体实现位段&#xff08;位段的填充&可移植性&#xff09;位段位段的内存分配空间如何开辟位段的跨平台问题位段的应用 枚举枚举类型的定义枚…

网络学习:IPV6报文详解

目录 前言&#xff1a; IPV6报文格式 IPV6基本报头 IPV6扩展报头 前言&#xff1a; 首先IPV6是属于网络层的一种协议&#xff0c;作为下一代IP协议&#xff0c;而想要学习一种协议就必不可少的需要去具体的研究协议报文中的各个参数以及其对应的功能作用。 IPV6报文格式 I…

在命令行中输入py有效,输入python无效,输入python会跳转到microsoft store

这里写自定义目录标题 如果你已经尝试过将python添加到系统变量如果你还未将python添加到系统变量没有python安装包且没有配置系统变量 如果你已经尝试过将python添加到系统变量 打开 运行&#xff0c;输入cmd&#xff0c;在命令行中输入 where python。 如果看到了这个 win…

Java基础-集合_上

文章目录 1.基本介绍2.集合的框架体系&#xff08;单列、双列&#xff09;单列集合双列集合比较 3.Collection接口和常用方法1.Collection接口实现类的特点2.常用方法&#xff08;使用ArrayList演示&#xff09;代码结果 3.迭代器遍历基本介绍代码结果 4.增强for循环遍历代码结…

滑动窗口和螺旋矩阵

209. 长度最小的子数组 题目 给定一个含有 n 个正整数的数组和一个正整数 target 。 找出该数组中满足其总和大于等于 target 的长度最小的 连续 子数组 [numsl, numsl1, ..., numsr-1, numsr] &#xff0c;并返回其长度**。**如果不存在符合条件的子数组&#xff0c;返回…

十八、多线程JUC

目录 一、什么是多线程二、多线程的两个概念&#xff08;并发和并行&#xff09;三、多线程的实现方式3.1 继承Thread类的方式进行实现3.2 实现Runnable接口的方式进行实现3.3 利用Callable接口和Future接口方式实现 四、常见的成员方法五、线程的生命周期六、线程安全的问题七…

Nacos安装与集群搭建

Nacos安装与集群搭建 Nacos安装指南1.Windows安装1.1.下载安装包1.2.解压1.3.端口配置1.4.启动1.5.访问 2.Linux安装2.1.安装JDK2.2.上传安装包2.3.解压2.4.端口配置2.5.启动 3.Nacos的依赖Nacos集群搭建1.集群结构图2.搭建集群2.1.初始化数据库2.2.配置Nacos2.3.启动2.4.nginx…

JavaScript进阶:js的一些学习笔记-this指向,call,apply,bind,防抖,节流

文章目录 1. this指向1. 箭头函数 this的指向 2. 改变this的指向1. call()2. apply()3. bind() 3. 防抖和节流1. 防抖2. 节流 1. this指向 1. 箭头函数 this的指向 箭头函数默认帮我们绑定外层this的值&#xff0c;所以在箭头函数中this的值和外层的this是一样的箭头函数中的…

Linux——线程池

线程池的概念 线程池也是一种池化技术&#xff0c;可以预先申请一批线程&#xff0c;当我们后续有任务的时候就可以直接用&#xff0c;这本质上是一种空间换时间的策略。 如果有任务来的时候再创建线程&#xff0c;那成本又要提高&#xff0c;又要初始化&#xff0c;又要创建数…

揭示数据在内存中存储的秘密!

** ** 悟已往之不谏&#xff0c;知来者犹可追 ** ** 创作不易&#xff0c;宝子们&#xff01;如果这篇文章对你们有帮助的话&#xff0c;别忘了给个免费的赞哟~ 整数在内存中的存储 整数的表达方式有三种&#xff1a;原码、反码、补码。 三种表示方法均有符号位和数值位两部分…