关于java的异常处理

关于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);
        }
    }
}

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

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

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

相关文章

Opencv——图片卷积

图像滤波是尽量保留图像细节特征的条件下对目标图像的噪声进行抑制,是图像预处理中不可缺少的操作,其处理效果的好坏将直接影响到后续图像处理和分析的有效性和可靠性。 线性滤波是图像处理最基本的方法,它允许我们对图像进行处理,产生很多不同的效果。首先,我们需要一个二…

wifi配网(esp8266和esp32)-http get和post方式

wifi配网(esp8266和esp32)-http get和post方式 通过http get和post方式来给esp芯片配网 步骤: 开机,指示灯亮起后(需要灯闪烁3下后),需在3s内(超过3s则会正常启动),按一下按键(注:切…

算法41:掉落的方块(力扣699题)----线段树

题目:https://leetcode.cn/problems/falling-squares/description/ 在二维平面上的 x 轴上,放置着一些方块。 给你一个二维整数数组 positions ,其中 positions[i] [lefti, sideLengthi] 表示:第 i 个方块边长为 sideLengthi &…

【蓝桥杯冲冲冲】[NOIP2001 普及组] 装箱问题

蓝桥杯备赛 | 洛谷做题打卡day26 文章目录 蓝桥杯备赛 | 洛谷做题打卡day26题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 提示思路 题解代码我的一些话 [NOIP2001 普及组] 装箱问题 题目描述 有一个箱子容量为 V V V,同时有 n n n 个物品,每…

jvm基础篇之垃圾回收[2](垃圾回收算法)

文章目录 版权声明垃圾回收算法核心思想垃圾回收算法的历史垃圾回收算法的评价标准垃圾分类算法分类标记清除算法核心思想标记清除算法优缺点 复制算法核心思想完整案例复制算法的优缺点 标记整理算法核心思想标记整理算法优缺点 分代垃圾回收算法arthas查看分代内存情况核心思…

【android】对于google-webrtc的性能中, memory leak

目录 zlmediakit->webrtcplay->app webrtcutil1/3 测试程序等 zlmediakit->webrtcplay->app 编译sdk 32 有时候会从开始新增5M,就稳定在一个值了 webrtcutil1/3 测试程序等 编译sdk 30

关于可变类型和不可变类型的探究

个人猜想(很遗憾失败了) 在硬盘或者系统中存在一个字符集 如果存在硬盘中,那么硬盘出厂的时候他的字符集所占用的空间就已经确定了。 如果存在于系统的话,硬盘应该在出厂的时候为系统设置一个存储系统字符集的地方。在安装系统…

【Chrono Engine学习总结】2-可视化

由于Chrono的官方教程在一些细节方面解释的并不清楚,自己做了一些尝试,做学习总结。 0、基本概念 类型说明: Chrono的可视化包括两块:实时可视化,以及离线/后处理可视化。 其中,实时可视化,又…

蓝桥杯省赛无忧 背包问题 课件 课件61 多重背包

01 多重背包基础模型 02 小明的背包3 03 二进制优化模型 04 新一的宝藏搜寻加强版

Linux Rootkit实验|0201 基本功能之Root后门

Linux Rootkit实验|0201 基本功能之Root后门 11 May 2017 文章目录 Linux Rootkit实验|0201 基本功能之Root后门实验说明实验环境实验过程提供 root 后门 实验总结与思考参考资料参考资料 时人不识凌云木,直待凌云始道高。 实验说明 本次实…

压力测试工具-Jmeter使用总结

目录 一.前言 二.线程组 三.线程组的组件 四.线程组-HTTP请求 1、JSON提取器 2、XPATH提取器 3、正则表达式提取器 五.线程组-断言 1、响应断言 2、JSON断言 六.创建测试 1.创建线程组 2.配置元件 3.构造HTTP请求 4.添加HTTP请求头 5.添加断言 6.添加查看结果树…

SAFe大规模敏捷认证Leading SAFe官方认证班

课程简介 SAFe – Scaled Agile Framework是目前全球运用最广泛的大规模敏捷框架,也是全球敏捷相关认证成长最快、最被认可、最有价值的规模化敏捷认证,目前全球SAFe认证专业人士已达120万人。 据官方统计,获得新证书的IT专业人士的平均工资…

寒假作业2月2号

第一章 命名空间 一.选择题 1、编写C程序一般需经过的几个步骤依次是(C ) A. 编辑、调试、编译、连接 B. 编辑、编译、连接、运行 C. 编译、调试、编辑、连接 D. 编译、编辑、连接、运行 2、所谓数据封装就是将一组数据和与这组数据有关…

Pycharm python用matplotlib 3D绘图显示空白解决办法

问题原因: matplotlib版本升级之后显示代码变了,修改为新的 # ax Axes3D(fig) # 原代码 ax fig.add_axes(Axes3D(fig)) # 新代码import numpy as np import matplotlib.pyplot as plt from matplotlib import cm from mpl_toolkits.mplot3d import Ax…

Electron开发的十大神级产品,vscode、atom、skype、figma等

Hi、我是贝格前端工场,今天分享一下基于Electron的十大著名产品,欢迎友友们补充。 Visual Studio Code 这是一款由微软开发的轻量级代码编辑器,它提供了丰富的功能和插件生态系统,支持多种编程语言和开发工具。Visual Studio Cod…

PDF中公式转word

效果:实现pdf中公式免编辑 step1: 截图CtrlAltA,复制 step2: SimpleTex - Snip & Get 网页或客户端均可,无次数限制,效果还不错。还支持手写、文字识别 单张图片:选 手写板 step3: 导出结果选择 注:…

【笔记】Android 常用编译模块和输出产物路径

模块&产物路径 具体编译到软件的路径要看编译规则的分区,代码中模块编译输出的产物基本对应。 Android 代码模块 编译产物路径设备adb路径Comment 模块device/mediatek/system/common/ 资源overlay/telephony/frameworks/base/core 文件举例res/res/values-m…

开源的三维算法库有哪些

PCL,VTK,VCG,CGAL,Open CASCADE(opencascade),OpenSceneGraph (OSG), 点云网格处理算法:openmesh, meshlab三维算法库,Eigen 网格简化,网格平滑,网格参数化 无序点云网…

[Linux 进程(六)] 写时拷贝 - 进程终止

文章目录 1、写时拷贝2、进程终止2.1 进程退出场景2.1.1 退出码2.1.2 错误码错误码 vs 退出码2.1.3 代码异常终止引入 2.2 进程常见退出方法2.2.1 exit函数2.2.2 _exit函数 本片我们主要来讲进程控制,讲之前我们先把写时拷贝理清,然后再开始讲进程控制。…

与指定数字相同的数的个数 T1061

#include<bits/stdc.h> using namespace std; int n,m; const int N110; int f[N]; int a0; int main(){cin>>n>>m;for(int i0;i<n;i)cin>>f[i];for(int j0;j<n;j){if(f[j]m){a;}}cout<<a<<endl;return 0; }