关于java的异常处理

news2024/9/28 15:21:39

关于java的异常处理

我们在上一篇文章中,对java中的异常有了一个初步的了解,本篇文章我们来了解一下异常的处理机制,如何抛出异常,如何捕捉异常😀

关于java的异常

一、异常类型等级

在这里插入图片描述

二、关键字

  • try
  • catch
  • finally
  • throw
  • throws

1、我们新建一个测试类,在里面声明两个变量a和b,a=1,b=0,输出a/b(我们知道这是错误的,所以要做异常处理)。

package exception;

public class Demo01 {

    public static void main(String[] args) {
        int a=1;
        int b=0;

        System.out.println(a/b);
    }
}

我们输出一下,发现这是ArithmeticException类型的异常(算术异常)

Exception in thread "main" java.lang.ArithmeticException: / by zero
	at exception.Demo01.main(Demo01.java:8)

2、我们用try catch做一下异常处理🐶,(fianlly可以不用,但是我们后期学习IO流的时候,要把资源关闭,可以理解为scanne.close)

package exception;

public class Demo01 {

    public static void main(String[] args) {
        int a=1;
        int b=0;
        try //监控区域
        {
            System.out.println(a/b);
        }catch (ArithmeticException e)//捕获异常
        {
            System.out.println("程序出现异常,变量b不能为0");
        }finally//处理善后工作
        {
            System.out.println("finally");
        }
    }
}

三、try catch 结构

try//异常监控
{
	//需要监控的代码
}
catch()//异常类型捕获
{
	//捕捉后执行的代码
}

1、我们做了异常处理以后,再执行一下代码,就会看到输出的是我们捕捉后进行处理的代码了。

程序出现异常,变量b不能为0
finally

2、我们再来定义两个方法,让他们互相调用。

package exception;

import struct.Test;

public class Demo01 {

    public static void main(String[] args) {
        int a=1;
        int b=0;
        try //监控区域
        {
            new Demo01().a();
        }catch (ArithmeticException e)//捕获异常
        {
            System.out.println("不能互相调用!");
        }finally//处理善后工作
        {
            System.out.println("finally");
        }
    }
    public void a(){b();}
    public void b(){a();}
}

3、我们执行以下代码,发现输出了finally,但是并没有捕捉到异常。

finally
Exception in thread "main" java.lang.StackOverflowError
	at exception.Demo01.b(Demo01.java:22)
	at exception.Demo01.a(Demo01.java:21)
	at exception.Demo01.b(Demo01.java:22)
	at exception.Demo01.a(Demo01.java:21)
  • finally被正常输出出来了,因为它是善后工作所以执行。
  • 没有捕捉到是因为,这个异常是个Error,是错误(StackOverflowError),所以要换一种方式捕捉,可以用Throwable,因为它的类型是最高的,catch(异常类型)
package exception;

import struct.Test;

public class Demo01 {

    public static void main(String[] args) {
        int a=1;
        int b=0;
        try //监控区域
        {
            new Demo01().a();
        }catch (Throwable e)//捕获异常
        {
            System.out.println("不能互相调用!");
        }finally//处理善后工作
        {
            System.out.println("finally");
        }
    }
    public void a(){b();}
    public void b(){a();}
}

4、catch可以是多个,有点类似else if 满足其中一个就可以,所以要把最大的写在最后,如果写在前面的话,后面的异常处理就不执行了🤔

  • 假设要捕获多个异常,从小到大捕获。
try//异常监控
{
	//需要监控的代码
}
catch(Error e)//异常类型捕获
{
	//捕捉后执行的代码
}
catch(Exception e)//Exception相对大一点
{

}
.....
catch(Throwable e)//最大的写在最后
{
    
}

四、快捷键

  • CTRL+ALT+T
package exception;

public class Demo01 {

    public static void main(String[] args) {
        int a=1;
        int b=0;

        System.out.println(a/b);//选中,CTRL+ALT+T
    }
}

在这里插入图片描述

  • 有很多结构都是可以进行选择的,我们这里选择try/catch,然后就会自动生成一段代码出来了🐱
package exception;

public class Demo02 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try {
            System.out.println(a/b);
        } catch (Exception e) {
            throw new RuntimeException(e);//打印错误信息
        }
    }
}
package exception;

public class Demo02 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try
        {
            System.out.println(a/b);
        }
        catch (Exception e)
        {
            System.exit(1);//结束程序
            throw new RuntimeException(e);
        }
    }
}

五、主动抛出异常

有时候我们知道代码中逻辑会有问题,所以我们选择去主动抛出异常,我们先来看一下throw。

package exception;

public class Demo02 {
    public static void main(String[] args) {
        int a=1;
        int b=0;
        try
        {
            if (b==0)
            {
                throw new ArithmeticException();//主动抛出异常
            }
            System.out.println(a/b);
        }
        catch (Exception e)
        {
            //System.exit(1);
            throw new RuntimeException(e);
        }
    }
}
  • 上面代码执行的时候不会抛出什么,也看不见什么。
  • 抛出异常大多数用在方法里面,所以我们在方法中试一下。

我们写一个除数的方法。

public void test(int a,int b)
{            
	if (b==0)
    {
       throw new ArithmeticException();//主动抛出异常
    }
	System.out.println(a/b);
}

我们在上面调用以下这个方法,运行以下,就会抛出异常。

package exception;

public class Demo02 {
    public static void main(String[] args) {
        new Demo02().test(1,0);
    }
}
Exception in thread "main" java.lang.RuntimeException: java.lang.ArithmeticException
	at exception.Demo02.main(Demo02.java:18)
  • 如果在方法中,处理不了这个异常,我们可以在方法上抛出异常,这个时候就用到了throws
public void test(int a,int b) throws ArithmeticException 
{            
	if (b==0)
    {
       throw new ArithmeticException();//主动抛出异常
    }
	System.out.println(a/b);
}

这里我们调用的时候,用try catch 捕获一下。

package exception;

public class Demo02 {
    public static void main(String[] args) {
                try {
            new Demo03().test(1,0);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
}

捕捉的好处,就是如果不捕获异常的话,程序碰到异常就直接终止了,但是捕获了以后,还是可以继续运行的,所以异常捕获十分的重要!

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

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

相关文章

GmSSL - GmSSL的编译、安装和命令行基本指令

文章目录 Pre下载源代码(zip)编译与安装SM4加密解密SM3摘要SM2签名及验签SM2加密及解密生成SM2根证书rootcakey.pem及CA证书cakey.pem使用CA证书签发签名证书和加密证书将签名证书和ca证书合并为服务端证书certs.pem,并验证查看证书内容: Pre Java - 一…

【Uni-App】运行微信小程序时报错routeDone with a webviewId 2 that is not the current page

使用HBuilderX开发微信小程序,运行项目的时有可能会出现routeDone with a webviewId 1 that is not the current page的报错,但不影响运行。如果强迫症介意的话,可以考下面的方法进行修复。 产生原因 由于微信开发者工具的调试基础库处于灰度…

改进的 K-Means 聚类方法介绍

引言 数据科学的一个中心假设是,紧密度表明相关性。彼此“接近”的数据点是相似的。如果将年龄、头发数量和体重绘制在空间中,很可能许多人会聚集在一起。这就是 k 均值聚类背后的直觉。 我们随机生成 K 个质心,每个簇一个,并将…

阿里云搭建幻兽帕鲁游戏服务器

大家好,这里是七七,最近幻兽帕鲁很火,身边有很多人都在玩。有朋友想要自己搭建一个服务器,我就来帮帮他吧。 我参考了阿里云的搭建方式:1分钟畅玩!一键部署幻兽帕鲁联机服务器 用他们提供的方案&#xff0…

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式

20240202在Ubuntu20.04.6下使用whisper.cpp的CPU模式 2024/2/2 14:15 rootrootrootroot-X99-Turbo:~/whisper.cpp$ ./main -l zh -osrt -m models/ggml-medium.bin chs.wav 在纯CPU模式下,使用medium中等模型,7分钟的中文视频需要851829.69 ms&#xf…

Arduino控制器使用Udp网络对8路IO输出控制

一、实现功能 1、创建串口连接,将接收的Udp数据通过串口发送出去。 2、创建Udp连接,用以接收Udp数据和对发送数据的Udp机器反馈Udp数据 3、对接收到的Udp数据进行解析,然后对8路IO进行输出控制。 4、1对应IO输出低电平,‘0’对…

HiveSQL题——聚合函数(sum/count/max/min/avg)

目录 一、窗口函数的知识点 1.1 窗户函数的定义 1.2 窗户函数的语法 1.3 窗口函数分类 聚合函数 排序函数 前后函数 头尾函数 1.4 聚合函数 二、实际案例 2.1 每个用户累积访问次数 0 问题描述 1 数据准备 2 数据分析 3 小结 2.2 各直播间最大的同时在线人数 …

什么是ACL?

知识改变命运,技术就是要分享,有问题随时联系,免费答疑,欢迎联系! 厦门微思网络​​​​​​https://www.xmws.cn 华为认证\华为HCIA-Datacom\华为HCIP-Datacom\华为HCIE-Datacom Linux\RHCE\RHCE 9.0\RHCA\ Oracle OC…

CSC联合培养博士申请亲历|联系外导的详细过程

在CSC申报的各环节中,联系外导获得邀请函是关键步骤。这位联培博士同学的这篇文章,非常详细且真实地记录了申请过程、心理感受,并提出有益的建议,小编特推荐给大家参考。 2024年国家留学基金委公派留学项目即将开始,其…

低码大前端 - 混合云集群部署 PagePlug

前情提要 老师之前布置了什么作业,完全忘了,本来觉得写作业可能也就一两个小时的事情,结果搞了半天,有一半的作业题目都没找到,mmp, 之前拖延症,搞到心态都炸了,今天不管怎么说都要搞定&#x…

奠定基础:用于机器学习的微积分、数学和线性代数

一、说明 机器学习是一个引人入胜的领域,它使计算机能够从数据中学习并做出预测或决策,而无需明确编程。然而,在幕后,有一个坚实的数学和线性代数基础,构成了机器学习算法的支柱。在本文中,我们将探讨在深入…

C语言指针学习 之 指针变量

前言&#xff1a; 通过学习我们认识了什么是指针&#xff0c;就让我们一起来分析一个例子。 #include<stdio.h> int main() {int a100;int * hz; hz &a;printf("a%d \n",a);printf("*hz%d \n",*hz);return 0; }a100 *hz100 PS C:\csay\cyuya…

聊聊DoIP吧(一)

DoIP是啥? DoIP代表"Diagnostic over Internet Protocol",即互联网诊断协议。它是一种用于在车辆诊断中进行通信的网络协议。DoIP的目标是在现代汽车中实现高效的诊断和通信。通过使用互联网协议(IP)作为通信基础,DoIP使得诊断信息能够通过网络进行传输,从而提…

【c/python】GtkBox

一、GtkBox及C语言示例 GtkBox是一个容器部件&#xff0c;用于在GTK&#xff08;GIMP Toolkit&#xff09;应用程序中水平或垂直地排列多个子部件。以下是一个简单的例子&#xff0c;展示了如何在一个基本的GTK应用程序中使用GtkBox来垂直排列两个按钮&#xff1a; 首先&#…

flutter的报错提示:type ‘Null‘ is not a subtype of type ‘int‘

flutter的报错提示&#xff1a; 是什么原因呢&#xff0c;解决问题&#xff1a; articleBean.originId是int类型&#xff0c;map[originId]是因为originId不存在而为null,所以可以把articleBean.originId map[originId]!;注释

设备的层次结构 - 驱动程序的复杂层次结构

由于设备对象的水平结构和垂直结构&#xff0c;组成了Windows设备的树形结构图。在Windows中出事的时候会有一个根设备&#xff0c;为了理解简单&#xff0c;我们将PCI总线想象成根总线&#xff08;根总线其实不是PCI总线&#xff0c;只是为了理解方便&#xff09;。查到PCI总线…

paddle环境安装

一、paddle环境安装 如pytorch环境安装一样&#xff0c;首先在base环境下创建一个新的环境来安装paddlepaddle框架。首先创建一个新的环境名叫paddle。执行如下命令。 conda create -n paddle python3.8创建好了名叫paddle这个环境以后&#xff0c;进入到这个环境中&#xff…

程序员的悲哀:知名Python库requests作者失业了

在当今这个快速发展的科技时代&#xff0c;程序员作为创新的驱动力&#xff0c;一直被视为时代的宠儿。然而&#xff0c;即使在这样一个充满机会的领域&#xff0c;也有着不为人知的辛酸。近日&#xff0c;一个令人震惊的消息传遍了编程社区&#xff1a;知名Python库requests的…

07 SB3之@HttpExchange(TBD)

HttpExchange是SpringBoot3的新特性. Spring Boot3 提供了新的 HTTP 的访问能力&#xff0c;封装了Http底层细节. 通过接口简化 HTTP远程访问&#xff0c;类似 Feign 功能。 SpringBoot 中定义接口提供 HTTP 服务 --> 框架生成的代理对象实现此接口 --> 框架生成的代理…

MySQL进阶之触发器

MySQL进阶之触发器 目录 MySQL进阶之触发器什么是触发器触发器的使用场景自定义触发器查看触发器删除触发器示例 什么是触发器 触发器是一种特殊的存储过程&#xff0c;它通常与表一起创建、修改和删除 触发器关键字&#xff1a;trigger&#xff0c;是指事先为某张表绑定一段…