什么是异常?异常可以看作你敲出来的bug

news2025/1/12 1:43:56

异常

  • 异常的体系
  • 抛异常
  • try -catch
  • finally
  • 自定义异常

作为初学者,在刚开始写代码的时候,差不多写一行代码都要见一行红吧
在这里插入图片描述

异常的体系

在这里插入图片描述
这里我们首先需要知道的一点是,所有的异常其实都是类。我们所有的异常都是继承于Throwable这个大类的,然后当我们的程序导致了内存的耗尽之类的我们程序猿无能为力的异常的时候就会发生Error这类。
我们能够操作的,在这篇博客中我想教给大家的是第二类,我们可以通过技术手段来解决这类的异常,也就是Exception类。
有的时候啊我们的程序还没有运行,下面就要有波浪线了,这就叫做编译异常,也叫做受查异常。比如:
在这里插入图片描述
然后像数组越界异常就是运行时异常,只有程序跑起来了,才知道到底有没有出错。

抛异常

我们都知道抛异常抛异常,但是到底什么是抛异常,我们又该如何抛异常呢?
阿涛这就来给兄弟们演示一下:

    public static void set(int[]arr,int index){
        arr[index]=index;
    }
    public static void main(String[] args)throws ArrayIndexOutOfBoundsException {
        int[]arr=null;
        set(arr,2);

在这里插入图片描述
红字的第一行会告诉你异常的类型,然后下面会告诉你出现异常的具体位置,
在这里插入图片描述
我们应该知道函数是压栈,这里抛异常一般会沿着函数栈帧往上,所以我们只要解决了第一个出现的异常那么后面基本上也就可以解决了。
那么我们现在来抛异常:
在这里插入图片描述
我们要在方法的参数列表后面加上throws 一个异常的类型,然后在方法中要throw一个new出来的异常对象。
我们可以看到的是,第十九行的打印并没有出现,所以一旦程序抛出了异常,后面的代码都是不会执行的。
我们使用throws好像并没有对异常进行实际的处理,连code都是异常的1,仅仅是告诉了后生,这边有个坑,你到时候给我填上去。

try -catch

那么我们想要都异常进行该如何是好呢?
那就需要使用try-catch 对异常进行捕捉了:

    public static void set(int[] arr, int index) throws NullPointerException {
        try {
//            set(arr,2);
//            System.out.println(1111);
            arr[index] = index;
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("处理了问题");
        }
    }

在这里插入图片描述
我们在try中需要放入可能出现异常的代码,然后catch(异常的类型+变量名){
这中间是对异常代码的处理,可以根据异常的紧急程度来设置,十分紧急就直接掐掉,不是很紧急可以选择给睡大觉的程序猿发上一封邮件打个电话之类的,我们这里水平有限,只能以日志的方式来记载,希望兄弟们不要介意……
}
最后还可以加一个final来做收尾,我们后面讲。
当然了,我们初学者很有可能就在一个try里面写出三行语句,七八个异常,此时此刻我们可不敢赌我们所写的异常就是我们需要捕捉的,这时候我们就需要了解catch可以catch多个异常这个机制了:

        try {
//            set(arr,2);
//            System.out.println(1111);
            arr[index] = index;
        }catch (CloneNotSupportedException e){
            
        }
        catch (ArrayIndexOutOfBoundsException e){
            e.printStackTrace();
            
        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("处理了问题");
        }
    }

在这里我们catch了三个异常,但是似乎出现了一点问题:
在这里插入图片描述
为啥出师不利,第一个就爆红了呢?
对于受查异常来说,抽查异常都是当场发现当场解决的,但是此时我们try里面并没有发现对应的异常,所以说想要捕捉受查异常可要想好了,只有存在受查异常的时候才能进行相应的捕捉!
由于异常也是类,异常也会有很多的继承关系,那么我们只要捕捉一个runtimException从理论上来说就可以捕捉到所有的运行时异常了,但是我们从来不会选择那么做,因为那样做对于当前你写代码来说可能是省了不少事情,但是对于以后的代码优化维护来说你这样会无形之中增加许多不必要的麻烦,该偷的懒Java已经帮我们偷了,有些不能够偷的懒可千万不能啊!!

finally

我们的体系大概是try-catch-finally,finally使用在最后的收尾工作的,关闭资源什么的:

        } catch (NullPointerException e) {
            e.printStackTrace();
            System.out.println("处理了问题");
        }
        finally {
            scanner.close();
        }

或者我们根据编译器的提示可以改成这样:

 try (Scanner scanner = new Scanner(System.in)) {

这样子就不用我们在最后关闭资源了。
这里强调一下,在finally中的代码不管如何一定会实现,而且是最后实现:

    public static int add(int a){
        try {
            return a;
        }catch (RuntimeException e){
            e.printStackTrace();
        }finally {
            return 4;

        }

    }
    public static void main(String[] args) {
        int x=add(10);
        System.out.println(x);

按照我们之前的理解,一个方法只要遇到了return就会返回,我既然说出来了那肯定是有不一样的地方的:
在这里插入图片描述
此时此刻我们返回的并不是try中的return a,而是finally中的return,这就是我们说的finally中的代码一定会被执行,这个机制啊奇怪的很,大家只要知道就行。

自定义异常

难道我们的异常只能是编译器提供给我们的那两三个吗?我们程序猿是一个有着相当的创造力和自由度的群体,我们可以自己写异常:
首先我们要清楚,我们这里写的所有的异常都是继承于Exception的,当然了我们还可以更加具体到这是否是受查异常:

public class LoadException extends RuntimeException{

}

然后我们可以照猫画虎,点进RuntimeException看看里面有没有什么需要我们重写的:
在这里插入图片描述
这里大概就是告诉我们该如何描写错误信息的,我们直接复制粘贴就行:

public class KeyException extends RuntimeException{
    public KeyException() {
        super();
    }
    public KeyException(String message) {
        super(message);
    }

}

然后我们需要在try-catch语句中写好我们判断的逻辑:

    public static void load(String name,String key){
        Test test=new Test();
        try{
            if(!test.name.equals(name)){
                throw new NameException("用户名错误");
            }
            if (!test.key.equals(key)){
                throw new KeyException("密码错误");
            }
        }catch (NameException e){
            e.printStackTrace();
        }catch (KeyException e){
            e.printStackTrace();
        }finally {
            System.out.println("嘤嘤嘤");
        }

    }
    public static void main(String[] args) {
        load("cyt","123");

    }

在这里插入图片描述
此时此刻我们自己捕捉到了我们自己的异常,并且进行了处理,所以此时我们的code是1!
好了兄弟们关于异常大部分知识点都教给大家了,希望大家能够有所收获!
百年大道,你我共勉!

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

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

相关文章

喜讯!神策分析 Android SDK 入选数据安全“星熠”案例

随着《数据安全法》和《个人信息保护法》的相继出台实施,标志着数据安全保护法治时代的真正到来,国家对数据安全的重视达到了前所未有的高度。在此背景下,神策数据全面落地数据开发利用和数据安全领域的技术推广与产业创新,神策分…

有哪些视频素材网站值得推荐?

高质量视频素材网站,免费、可商用,建议收藏! 1、菜鸟图库 https://www.sucai999.com/video.html?vNTYwNDUx 网站有超多视频素材,全部都是高清无水印,各种类型都有,像自然、城市、动物、科技、商业等等都…

【算法】哈希表

😀大家好,我是白晨,一个不是很能熬夜😫,但是也想日更的人✈。如果喜欢这篇文章,点个赞👍,关注一下👀白晨吧!你的支持就是我最大的动力!&#x1f4…

Unity3D打包Assetbundle丢失Shader问题

详情见:https://www.pianshen.com/article/5391338163/1、Unity3D在打包Assetbundle时,可能会遇到Shader丢失的问题,解决方法:打开Edit->Project Settings->Graphics,在Always Included Shaders列表添加上所需的…

微信小程序测试(简单项目测试)

Flex布局简介 布局的传统解决方案,基于盒状模型,依赖 display属性 position属性 float属性 什么是flex布局? Flex是Flexible Box的缩写,意为”弹性布局”,用来为盒状模型提供最大的灵活性。 任何一个容器都可以指…

小程序 - 起步:小程序的构成、宿主环境、协同工作和发布

小程序 - 起步:小程序的构成、宿主环境、协同工作和发布 Date: January 5, 2023 Sum: 小程序的构成、宿主环境、协同工作和发布 小程序简介 小程序与普通网页开发的区别 1. 运行环境不同 网页运行在浏览器环境中 小程序运行在微信环境中 2. API 不同 由于运行环境的不同…

P1308 [NOIP2011 普及组] 统计单词数————C++

题目 [NOIP2011 普及组] 统计单词数 题目描述 一般的文本编辑器都有查找单词的功能,该功能可以快速定位特定单词在文章中的位置,有的还能统计出特定单词在文章中出现的次数。 现在,请你编程实现这一功能,具体要求是&#xff1…

数字验证学习笔记——SystemVerilog芯片验证21 ——覆盖率类型

一、覆盖率类型 覆盖率是衡量设计验证完备性的一个通用词语。随着测试逐步覆盖各种合理的组合,仿真过程过程会慢慢勾画你的设计情况。覆盖率工具会在仿真过程中收集信息,然后进行后续处理并且得到覆盖率报告。通过这个报告找出覆盖之外的盲区&#xff0…

冒泡排序模拟qsort函数

欢迎来到 Claffic 的博客 💞💞💞 前言: 学习C语言,一般情况下都会接触到冒泡排序,你知道吗,用冒泡排序的思想可以模拟实现qsort函数(库函数的一种,可以实现快排&#xff…

图解面试题:经典50题!掌握这些题,面试也太简单了!

已知有如下4张表:学生表:student(学号,学生姓名,出生年月,性别)成绩表:score(学号,课程号,成绩)课程表:course(课程号,课程名称,教师号)教师表:teacher(教师号,教师姓名)1.汇总分析-查询学生的总成绩并进行排名/* 【知…

CSS基础知识(盒子模型)

继承上一篇CSS的三大特性的优先级继续讲解。 1.1优先级 优先级注意点: 权重是有4组数字组成的,但是不会有进位。可以理解为类选择器永远大于元素选择器,id选择器永远大于类选择器以此类推。等级判断从左向右,如果某一位数值相同…

前端学习之CSS基础

前言 html标签就不说了&#xff0c;这次学习CSS样式&#xff0c;就是美化html标签。 快速了解什么是css 普通标签&#xff1a; 加了css样式&#xff1a; <img src"https://static.runoob.com/images/icon/mobile-icon.png" style"height:100px" /&…

No module named ‘pycocotools’

网上搜了之后 按照网上的去做 全都无果 开始自己探索 原本我pycharm里选的环境是 python3.8 (pytorch)winR输入cmd进去后 输入 python –V返回的是本地python版本2.7 所以我当前系统python版本和我pycharm里选的不一样 然而pycocotools这个包本质上应该是安装在我pycharm里…

Referer;盗链;防盗链的工作原理

目录 Referrer-policy 如何设置referer 盗链 防盗链的工作原理 绕过图片防盗链 设置meta 设置referrerpolicy"no-referrer" 客户端在请求时修改header头部 利用https网站盗链http资源网站&#xff0c;refer不会发送 常见防盗链方法 利用nginx 服务器端判…

python基础语法一

一、变量 1.1、变量定义 变量就是可变的量&#xff0c;对于一些有可能会经常变化的数据&#xff0c;我们需要使用一个符号&#xff0c;这样才能计算中使 用它&#xff0c;就像我们在小学时学过的一元方程中的"x"一样。比如说&#xff0c;我们在控制台内输入&#xf…

Java 集合List接口介绍和使用

List接口的基本介绍 1.List接口是Collection的子接口 2.List中的元素都是有序的除了LinkedList。 一些实用的方法 1.add()添加元素 2.get()得到指定位置的元素 3.addAll&#xff08;&#xff09;追加一个List 4.indexOf&#xff08;&#xff09;返回元素的位置 5.remove…

人工智能 -多任务编程、进程、线程介绍

目录1&#xff0c; 多任务的概念2&#xff0c;进程2.1进程的介绍2.2多进程完成多任务2.3进程执行带有参数的任务2.4获取进程编号2.5进程间不共享全局变量2.6主进程和子进程的结束顺序3、线程3.1多线程完成多任务3.2线程执行带有参数的任务3.3主线程和子线程的结束顺序3.4线程中…

连续子数组的最大和(从暴力理解到DP)

连续子数组的最大和题目思路暴力解题思路画出矩阵进行分析确定转移方程DP代码题目 思路 从leetcode上看到的题解&#xff0c;突然恍然大悟&#xff0c;之前不容易理解转移方程终于理解了&#xff0c;这个思路真的对新手很友好&#xff0c;现在出一个C版本&#xff0c;而且&…

谷歌出品,数据集搜索引擎上线了!

文 | 小戏记得在刚入门 ML 时&#xff0c;希望找到一个关于特定领域下的数据集&#xff0c;涉世未深的我在中文互联网不断搜索&#xff0c;可每每点进链接出来的都是某 SDN 下载的高价勒索。用惯了直接从老师同学那里讨来的数据集的我第一次感受到了“寻找数据集”这样一个简单…

【并查集】实现思路及例题

一、应用场景 用于处理不相交集合的合并和查询问题 示例&#xff1a; n 个元素&#xff08;分属不同的的 n 个集合&#xff09;&#xff0c;进行两种操作&#xff1a; 并 —— 给出两个元素的关系&#xff0c;合并两个集合查 —— 查询两个元素是否在同一个集合 二、并查集…