【Java】认识异常

news2024/11/17 13:20:51

目录

1.异常概念和分类

2.异常的抛出 

3.异常的捕获

3.1异常声明throws

3.2异常捕获try-catch

3.3finally

3.4.异常的处理流程

4.自定义异常类 


1.异常概念和分类

public class Test {
    public static void test() {
        test();
    }
    public static void main(String[] args) {
        System.out.println(10/0);//ArithmeticException
        int[] arr = null;
        System.out.println(arr.length);//NullPointerException
        test();//StackOverflowError
    }
}

定义:程序执行过程中发生的不正常行为称为异常。

分类:Throwable (异常体系的顶层类):Error (错误)、Exception (异常):受查异常/编译时期异常、非运行异常/运行时异常。

 

2.异常的抛出 

定义:使用 throw 关键字,抛出一个指定的异常对象,将错误信息告知给调用者。

格式:throw new XXXException (“异常产生的原因”);

public class Test {
   public static void main(String[] args) {
       int a = 0;
       if (a == 0) {
           throw new ArithmeticException("分母不能为零");
       }
       System.out.println(10/0);//不会执行
   }
}

注意:1> throw必须写在方法体内部;

2> 如果抛出的是RunTimeException其子类对象,即运行时异常,可不用处理,交给JVM即可;

3> 如果抛出的是Exception及其子类对象,即编译时异常,就必须由用户处理,否则无法通过编译;

4> 异常一旦抛出,其后的代码就不会执行。

3.异常的捕获

3.1异常声明throws

定义:在方法声明时参数列表后,当方法中抛出编译时异常,而用户自己不想处理该异常,此时就可以将异常抛给方法的调用者来处理。即当前方法不处理异常,提醒方法的调用者处理异常

注意:1> throws必须跟在方法的参数列表之后;

2> 声明的异常必须是Exception或Exception的子类;

3> RunTimeException及其子类的异常不需要声明,交给JVM即可;

4> 如果方法内部抛出多个异常,throws后需跟多个异常类型,之间用逗号隔开;

5> 如果多个异常具有父子类关系,只声明父类即可。

import java.io.FileNotFoundException;
import java.io.IOException;

class Student implements Cloneable {
    @Override
    protected Object clone() throws CloneNotSupportedException {//抛出异常
        return super.clone();
    }
}
public class Test {
    public static void main(String[] args) throws CloneNotSupportedException {
        Student student = new Student();
        student.clone();//不抛出异常此行代码会报错
    }
    public static void main3(String[] args) throws IOException, FileNotFoundException { 
                                                 //FileNotFoundException是IOException的子类,
                                                 //只用写IOException即可
    }
}

3.2异常捕获try-catch

import java.io.FileNotFoundException;
import java.io.IOException;

class Student { //此时不支持克隆
    @Override
    protected Object clone() throws CloneNotSupportedException {//抛出异常
        return super.clone();
    }
}
public class Test {
    public static void main(String[] args) throws Exception {
        Student student = new Student();
        try { //将可能出现异常的代码放在这里面
            student.clone();
            int[] arr = null;
            System.out.println(arr.length);//这里也有异常,但不会被捕获,先到先得
            System.out.println("abc");//若上面抛出了异常,这行代码不会执行
        } catch (CloneNotSupportedException e) { //可能捕获的异常
            e.printStackTrace();//打印异常所在的行数
            throw new RuntimeException(e); //捕获到异常则执行这里面的代码 --- *
        }catch (NullPointerException e) {//若上面已经捕捉到了异常,这里就捕获不了了
            e.printStackTrace();         //即无法同时捕捉多个异常
            throw new NullPointerException();
        }
        catch (ArithmeticException | IndexOutOfBoundsException e) {
            e.printStackTrace();
            System.out.println("Exception"); //不建议这样写,因为此时无法准确判断是什么异常
        }
        catch (Exception e) { //最后一道保险,防止还有异常没有捕获
            throw new Exception();//先捕捉子类异常,再捕捉父类异常
        }
        System.out.println("abcd");//若*行是处理异常,剩下程序不会执行
                                   //若*行只是声明捕获到了异常,剩下程序会继续执行
    }
}

3.3finally

有些特定的代码,不论程序是否正常运行,都需要执行,比如程序中打开的资源在程序结束时需要关闭或回收。此时就需要finally来解决资源清扫的扫尾工作。 

import java.util.InputMismatchException;
import java.util.Scanner;

public class Test {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        try {
            int a = scanner.nextInt();
            int ret = 10/a;
            System.out.println("ret的值是"+ret);
            //return 1; //若这里是方法,return后finally仍然会执行
        }catch (ArithmeticException e) {
            System.out.println("捕获到了ArithmeticException异常");
        }catch (InputMismatchException e) {
            System.out.println("输入的参数类型有误");
        }finally { //一定执行
            scanner.close();//关闭Scanner
            System.out.println("finally被执行了");
            //return 1; //当try和finally中都有return时,取finally中的return
        }               //不建议在finally中写return
        System.out.println("ttr-catch-finally之后的代码");
    }
}

3.4.异常的处理流程

在方法的调用过程当中,当被调用的方法没有处理异常,会沿着栈把这个异常抛给它的调用者,当调用者也没有处理时,就会抛给JVM,程序会异常终止。

4.自定义异常类 

在没学异常之前,我们的代码是这样的:

class Login {
    private String userName = "admin";
    private String password = "12345678";
    public void loginInfo(String userName,String password) {
        if (!this.userName.equals(userName)) {
            System.out.println("用户名错误");
            return;
        }if (!this.password.equals(password)) {
            System.out.println("密码错误");
            return;
        }
        System.out.println("登陆成功");
    }
}
public class Test {
    public static void main(String[] args) {
        Login login = new Login();
        login.loginInfo("adminabc","12345678");//用户名错误
    }
}

学了异常后,我们就可以自定义异常类了:

注意:1> 继承于Exception (编译时异常/受查异常) 或RunTimeException (运行时异常/非受查异常),继承哪个根据业务需求;

2> 最好实现一个带有String类型参数的构造方法,参数含义是出现异常的原因,这样代码更具有可读性,出错时更好定位。

public class UserNameException extends RuntimeException{ //不继承就不是异常
                                       //这是运行时异常,可不处理
    public UserNameException(String message) {
        super(message);
    }
}
public class PasswordException extends Exception{ //不继承就不是异常
                                       //这是编译时异常,必须要处理
    public PasswordException(String message) {
        super(message);
    }
}
class Login {
    private String userName = "admin";
    private String password = "12345678";
    public void loginInfo(String userName,String password) throws PasswordException{ //编译时异常必须处理
        if (!this.userName.equals(userName)) {
            throw new UserNameException(userName+" 用户名错误");
        }if (!this.password.equals(password)) {
            throw new PasswordException(password+" 密码错误");
        }
        System.out.println("登陆成功");
    }
}
public class Test1 {
    public static void main(String[] args) {
        Login login = new Login();
        try {
            login.loginInfo("adminabc", "12345678");//用户名错误
        }catch (PasswordException e) { //编译时异常必须处理
            e.printStackTrace();
        }
    }
}

JavaSE终于结束啦!!!!!!

数据结构我来啦!!!!! 

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

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

相关文章

详解数据集safety-pilot-model-deployment-data

safety-pilot-model-deployment-data这个数据集是由美国交通部的联邦航空管理局(FAA)和交通运输部(DOT)主导的“安全试点”(Safety Pilot Model Deployment)项目所提供的。该项目旨在研究汽车与飞机之间的通…

Vue电商项目--开发Search模块与mockjs模拟数据

Search模块中商品分类与过度动画 现在完成了在/home路由下实现三级导航组件的显示隐藏 通过this.$route.path!/home在搜索页面显示,通过方法鼠标移入移出从而又控制在search路由下的显示隐藏 过渡动画:前提组件|元素必要又v-if| v-show指令才可以进行…

Linux进程状态及优先级

本文已收录至《Linux知识与编程》专栏! 作者:ARMCSKGT 演示环境:CentOS 7 进程状态及优先级 前言正文进程状态就绪运行状态R阻塞睡眠状态 S休眠状态D挂起 暂停状态T前台与后台进程待追踪暂停状态t 死亡状态 X僵尸状态 Z 孤儿进程进程优先级查…

nginx(七十三)nginx与Location响应头细节探讨

一 nginx与Location响应头细节探讨 ① 重定向和Location回顾 多种重定向跳转方式的差异 nginx之absolute_redirect、server_name_in_redirect、port_in_redirect 共同控制Location响应头 ② STS响应头导致307重定向 "第一次访问 http://www.baidu.com" 观察…

基于Qt、C++的毕业设计课设数学绘图工具(平面图、图表、立体图绘制-附下载链接)

基于Qt、C的毕业设计课设数学绘图工具(平面图、图表、立体图绘制) 介绍 这是我的毕业设计,基于Qt Creator 4.11.1,c语言。 效果图如下 点我下载项目源码(含打包软件) 使用说明 1. 二维函数绘制 开始界面…

python 系列 07 - 基于easyocr的ocr识别

OCR,光学文字识别,对文本资料进行扫描,然后对图像文件进行分析处理,获取文字及版面信息的过程。本示例通过easyocr库来演示。easyocr是一个比较流行的库,支持超过80种语言。安装的时候注意会附带安装torch库(一个深度学…

将ROS1和ROS2安装到同一个ubuntu系统中,ROS2安装??????????????

1. 本文测试环境: ubuntu:20.04,虚拟机 ROS1:noetic ROS2:foxy 2. 先说结论 ROS1 与 ROS2 共存,需要考虑三个问题: 1) 不同Ubuntu版本,有不同版本的ROS1和ROS2推荐,尽量不要任性地乱装; 2)ROS1和ROS2安装过程中,是否会出现文件“删改”的问题?目前使用下来,并…

拓扑排序详解(包含算法原理图解、算法实现过程详解、算法例题变式全面讲解等)

前置知识 有向无环图 在图论中,如果一个有向图无法从某个顶点出发经过若干条边回到该点,则这个图是一个有向无环图(DAG图)。 如图所示。 入度 对于一个有向图,若x点指向y点,则称x点为y点的入度。 出度…

Redis --- 多级缓存

一、什么是多级缓存 传统的缓存策略一般是请求到达Tomcat后,先查询Redis,如果未命中则查询数据库,如图: 存在下面的问题: 请求要经过Tomcat处理,Tomcat的性能成为整个系统的瓶颈Redis缓存失效时&#xff…

python每日一练:硬币划分(多方法详解)

文章目录 前言0、题目一、暴力总是不能解决问题的二、还能更暴力一点三、减少暴力思想四、引入先进思想总结 前言 这题挺有意思的,典型的背包组合问题,虽然没有要求各种组合方式,不过我们可以试试给出组合方式。当然这题不太可能用一行代码解…

STM32 从入门到精通系列讲解 - 总目录

👦 作者介绍:Bazinga bingo,专注C语言应用硬核干货分享,潜心修炼,虚心学习,立志做嵌入式相关赛道的Top。 📕 本文收录于《STM32开发》专栏,包含STM32内部模块介绍、片内资源开发、不…

如何使用bingChat(使用方法+遇到的问题+感受)

文章目录 前言一、如何使用Bing Chat1. 下载new Bing2.重新注册一个microsoft(此步骤可略过,如有问题再操作此步骤)3. 使用 Bing Chat 二、常见问题1.Chat mode is only available when you have access to the new Bing.2. 网页上没有“聊天…

leetcode 104——二叉树的最大深度

文章目录 题目详情方法一 万能的递归方法二 通过使用层序遍历的方式Java完整代码递归实现非递归实现——借助队列 题目详情 给定一个二叉树,找出其最大深度。 二叉树的深度为根节点到最远叶子节点的最长路径上的节点数。 说明: 叶子节点是指没有子节点的节点。 l…

yolov5图像识别voc转yolo代码解析

https://github.com/ultralytics/JSON2YOLO https://blog.csdn.net/qq_51831335/article/details/127237772 目标检测数据集标签转换COCO2VOC、YOLO2VOC、JSON2YOLO <annotation><folder>VOC2007</folder><filename>000001.jpg</filename><s…

x265码控分析

D和R的关系 高分辨率量化 均匀量化&#xff1a;量化区间 ‘ Δ k y k − y k − 1 ‘ \Delta_ky_k-y_{k-1} ‘Δk​yk​−yk−1​‘&#xff0c;近似为常数&#xff1b;p(x)为信源概率密度函数&#xff0c;且 ‘ Δ k ‘ \Delta_k ‘Δk​‘的大小相对于p(x)的变化率充分小&…

【模拟IC学习笔记】 反馈

反馈的作用&#xff1a;增益灵敏度降低 采用开环的方式实现一个精确的增益比较困难&#xff0c;但是可以实现高增益。 增益灵敏度衍生出来的另外两个特点 1、增加系统带宽。 2、改变输出阻抗&#xff0c;提高驱动能力。 反馈的作用&#xff1a;增加带宽 带宽的增加来源于…

对传递函数的零极点、频率响应、稳定性的理解

对传递函数的零极点、频率响应、稳定性的理解 零极点 从传递函数求零极点 令传递函数分子为0求出零点&#xff0c;令分母为0求出零点。 频率响应 单极点系统的频率响应 A v A v d c ∗ ( 1 / ( 1 s R C ) ) AvAv_dc*(1/(1sRC)) AvAvd​c∗(1/(1sRC))&#xff0c;系统的极…

python通过SSH管道访问ClickHouse

目录 前言什么是跳板机什么是SSH协议SSH管道访问ClickHouse参考文献 前言 因为新业务需要&#xff0c;数据都存储在阿里云服务器的ClickHouse数据库里&#xff0c;最近想取点数探索一下&#xff0c;于是下载了客户端工具DBeaver并成功连接ClickHouse&#xff0c;然后想通过pyt…

【前端面试题】这些js功能你一定要学会

大厂面试题分享 面试题库 前后端面试题库 &#xff08;面试必备&#xff09; 推荐&#xff1a;★★★★★ 地址&#xff1a;前端面试题库 web前端面试题库 VS java后端面试题库大全 1.图片失败&#xff0c;重新加载 如果图片资源不存在&#xff0c;那可以设置图片失败的占位…

深度学习——A3C算法

A3C算法&#xff08;Asynchronous Advantage Actor-Critic&#xff09; DDPG算法之后&#xff0c;DeepMind对其改造&#xff0c;提出了效果更好的 Asynchronous Advantage Actor-Critic&#xff08;A3C&#xff09;算法&#xff08;论文是 Asynchronous Methods for Deep Rein…