Java 基础进阶篇(十三)—— 异常处理机制

news2025/1/15 23:09:05

文章目录

  • 一、异常概述、体系
  • 二、异常的分类
  • 三、异常的默认处理流程
  • 四、异常的处理机制
    • 4.1 编译时异常的处理机制
      • 4.1.1 方式一:抛出异常
      • 4.1.2 方式二:捕获异常
      • 4.1.3 方式三:前两者结合
    • 4.2 运行时异常的处理机制
  • 五、自定义异常
    • 5.1 自定义编译时异常
    • 5.2 自定义运行时异常
  • 六、try-catch-finally格式


一、异常概述、体系

异常是程序在“编译”或者“执行”的过程中可能出现的问题。 如:数组索引越界、空指针异常、 日期格式化异常…

注意:语法错误不算在异常体系中。

异常体系如下:
在这里插入图片描述

Exception:java.lang 包下,称为异常类,它表示程序本身可以处理的问题。
RuntimeException 及其子类:运行时异常,编译阶段不报错,运行可能报错。 (空指针异常,数组索引越界异常)
除 RuntimeException 之外所有的异常:编译时异常,编译阶就报错,必须处理,否则代码不通过。 (日期格式化异常)。
Error:系统级别问题、JVM退出等,代码无法控制。

异常一旦出现了,如果没有提前处理,程序就会退出 JVM 虚拟机而终止。因此学习异常,通过提前处理异常,以达到避免异常的效果,体现的是程序的安全和健壮性。


二、异常的分类

异常分为:编译时异常和运行时异常。

在这里插入图片描述

简单来说,编译时异常就是在编译的时候出现的异常,运行时异常就是在运行时出现的异常

运行时异常: 编译阶段不报错,运行时可能报错。一般是程序员业务没有考虑好或者是编程逻辑不严谨引起的程序错误!常见运行时异常如下:

数组索引越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
数学操作异常:ArithmeticException
类型转换异常:ClassCastException
数字转换异常:NumberFormatException

编译时异常: 是担心程序员的技术不行,在编译阶段就爆出一个错误,目的在于提醒不要出错!


三、异常的默认处理流程

处理流程如下:

① 默认会在出现异常的代码那里自动的创建一个异常对象:ArithmeticException。
② 异常会从方法中出现问题的点里抛出给调用者,调用者最终抛出给 JVM 虚拟机。
③ 虚拟机接收到异常对象后,先在控制台直接输出异常栈信息数据。
④ 直接从当前执行的异常点干掉当前程序。
⑤ 后续代码没有机会执行了,因为程序已经死亡。

默认的异常处理机制并不好,一旦真的出现异常,程序立即死亡。


四、异常的处理机制

4.1 编译时异常的处理机制

编译时异常是编译阶段就出错的,所以必须处理,否则代码根本无法通过。

编译时异常的处理方式有三种:

  • 抛出异常:出现异常直接抛出去给调用者,调用者也继续抛出去。
  • 捕获异常:出现异常自己捕获处理,不麻烦别人。
  • 前两者结合:出现异常直接抛出去给调用者,调用者捕获处理。

4.1.1 方式一:抛出异常

格式:
在这里插入图片描述
规范格式:代表可以抛出一切异常。
在这里插入图片描述

public class ExceptionDemo01 {
    public static void main(String[] args) throws Exception {
        System.out.println("程序开始。。。。。");
        parseTime("2011-11-11 11:11:11");
        System.out.println("程序结束。。。。。");
    }
    public static void parseTime(String date) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(date);
        System.out.println(d);
        int i = 6/0; // 除零异常:ArithmeticException 异常
    }
}

这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡


4.1.2 方式二:捕获异常

监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。

格式:
在这里插入图片描述
建议格式:
在这里插入图片描述

public class ExceptionDemo02 {
    public static void main(String[] args) {
        System.out.println("程序开始。。。。");
        parseTime("2011-11-11 11:11:11");
        System.out.println("程序结束。。。。");
    }
	public static void parseTime(String date) {
		try {
			SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
			Date d = sdf.parse(date);
			System.out.println(d);
			
			int i = 6/0; // 除零异常:ArithmeticException 异常
		} catch (Exception e) {
			e.printStackTrace(); // 打印异常栈信息
		}
	}
}

这种方式还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行


4.1.3 方式三:前两者结合

方法直接将异通过 throws 抛出去给调用者,调用者收到异常后直接捕获处理。

public class ExceptionDemo03 {
    public static void main(String[] args) {
        System.out.println("程序开始。。。。");
        try {
            parseTime("2011-11-11 11:11:11");
            System.out.println("功能操作成功~~~");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("功能操作失败~~~");
        }
        System.out.println("程序结束。。。。");
    }

    public static void parseTime(String date) throws Exception {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(date);
        System.out.println(d);
		
		int i = 6/0; // 除零异常:ArithmeticException 异常
    }
}

实际应用中,只要代码能够编译通过,并且功能可以完成,那么每一种异常处理方式似乎也都是可以的


4.2 运行时异常的处理机制

运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。
按照规范建议还是处理:建议在最外层调用处集中捕获处理即可。


五、自定义异常

Java 无法为这个世界上全部的问题提供异常类,如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。

优点:可以使用异常的机制管理业务问题,如提醒程序员注意。同时一旦出现 bug,可以用异常的形式清晰的指出出错的地方。

5.1 自定义编译时异常

编译时异常是编译阶段就报错,提醒更加强烈,一定需要处理。

步骤:
定义一个异常类继承 Exception
② 重写构造器。
③ 在出现异常的地方用 throw new 自定义对象抛出。

public class AgeIllegalException extends Exception{
    public AgeIllegalException() {
    }
    public AgeIllegalException(String message) {
        super(message);
    }
}
public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            checkAge(300);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("程序结束了~~~~");
    }
    
    public static void checkAge(int age) throws AgeIllegalException {
        if(age<0 || age>200){
            // 抛出异常
            // throw:在方法内部直接创建一个异常对象,并从此点抛出
            // throws:用在方法申明上,抛出方法内部的异常
            throw new AgeIllegalException(age + " is illegal");
        }else{
            System.out.println("年龄符合,继续执行");
        }
    }
}

5.2 自定义运行时异常

提醒不强烈,编译阶段不报错,运行时才可能出现!

步骤:
定义一个异常类继承 RuntimeException
② 重写构造器。
③ 在出现异常的地方用 throw new 自定义对象抛出。

public class AgeIllegalRuntimeException extends RuntimeException{
    public AgeIllegalRuntimeException() {
    }

    public AgeIllegalRuntimeException(String message) {
        super(message);
    }
}
public class ExceptionDemo {
    public static void main(String[] args) {
        try {
            checkAge2(300);
        } catch (Exception e) {
            e.printStackTrace();
        }
        System.out.println("程序结束了~~~~");
	}
	
	public static void checkAge2(int age) {
	    if(age<0 || age>200){
            // 抛出异常
            throw new AgeIllegalRuntimeException(age + " is illegal");
        }else{
            System.out.println("年龄符合,继续执行");
        }
    }
}

六、try-catch-finally格式

finally:放在 try-catch 后面的,无论是正常执行还是异常执行代码,最后一定要执行,除非 JVM 退出

作用:一般用于进行最后的资源释放操作(专业级做法)。

在这里插入图片描述

面试:

public class test {
    public static void main(String[] args) {
        System.out.println("算数结果:" + divided(10, 5));
    }

    public static int divided(int a, int b) {
        int re = 0;
        try {
            re = a/b;
            return re;
        } catch (Exception e) {
            System.out.println("除法出错");
            return -1;
        }finally {
            System.out.println("最终方法执行");
        }
    }
}

控制台输出:

最终方法执行
算数结果:2


文章参考:Java入门基础视频教程,java零基础自学就选黑马程序员Java入门教程(含Java项目和Java真题)

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

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

相关文章

程序员面试金典10.*

文章目录 10.1合并排序的数组10.02变位词组10.03搜索旋转数组10.05稀疏数组搜索10.09排序矩阵查找10.10 数字流的秩10.11 峰与谷 10.1合并排序的数组 这个就从后往前加入到新数组里就行。如果B的下标是-1则结束&#xff0c;A的下标是-1则一直加B的元素。 class Solution { pub…

挑战14天学完Python---初识python基本图形绘制

往期文章 目录 往期文章前言1."Python蟒蛇绘制"实例2.Python标准库 之turtle库3. 面向对象编程风格3.1 import更多玩法3.1.1使用from和import保留字共同完成3.1.2 使用import和as保留字共同完成 4.turtle的原(wan)理 (fa)4.1 turtle绘图窗体布局---turtul.setup()4.2…

京东小程序折叠屏适配探索 | 京东云技术团队

前言 随着近年来手机行业的飞速发展&#xff0c;手机从功能机进入到智能机&#xff0c;手机屏幕占比也随着技术和系统的进步越来越大&#xff0c;特别是Android 10推出以后&#xff0c;折叠屏逐渐成为Android手机发展的趋势。 图 1 Android手机屏幕发展趋势 京东小程序近年来…

Python程序员辞职后,如何踏出自由职业的第一步,聊聊我自己的看法

大家好&#xff0c;我是兴哥。有个广州的朋友说他辞职了&#xff0c;想要自由职业该怎么开始第一步呢&#xff1f;我问他你之前的收入月薪是多少&#xff0c;他说2万出头。我不得不说&#xff0c;对于写项目的自由职业程序员&#xff0c;2万是一个极高的门槛。但既然他已经辞职…

第三十章 React的路由基本使用

关于React路由&#xff0c;我们在学习之前先了解一下其他知识点&#xff1a;SPA应用、路由的理解、react中如何使用路由。 SPA应用的理解 我们知道React脚手架给我们构建的是一个单页应用程序&#xff08;SPA&#xff09;&#xff0c;在页面加载时&#xff0c;只会加载一个HT…

2.Redis入门概述

1.Redis是什么 Remote Dictionary Server(远程字典服务)是完全开源的&#xff0c;使用ANSIC语言编写遵守BSD协议&#xff0c; 是一个高性能的Key-Value数据库&#xff0c; 提供了丰富的数据结构&#xff0c;例如String、Hash、List、Set、SortedSet等等。 数据是存在内存中的&a…

学会这几个Word技巧,让你办公省时又省力(二)

Word是我们经常用到的办公软件&#xff0c;下面分享的几个小技巧&#xff0c;可以提高你的办公效率&#xff0c;一起看看吧。 1. 改变Word文档的背景颜色 有时候我们打开的Word文档是有颜色的&#xff0c;如果你想恢复白色背景&#xff0c;或者改成其他颜色&#xff0c;只…

《Linux 内核设计与实现》08. 下半部和推后执行的工作

文章目录 下半部软中断软中断的实现使用软中断 tasklettasklet 的实现使用 tasklet 工作队列工作队列的实现使用工作队列 下半部 中断处理程序的局限性&#xff1a; 中断处理程序以异步方式执行&#xff0c;并且可能打断其它代码&#xff0c;因此为了避免被打断的代码停止时间…

PR控制以及使用PR控制用于单相离/并网逆变器

文章目录 前言基本知识实际使用单相离网逆变器单相并网逆变器 PR控制器离散化基本知识 DSP实现总结 前言 最近想学习一下并网逆变器&#xff0c;需要用到PR控制&#xff0c;全网找遍了许多学习资料&#xff0c;终于掌握的差不多了&#xff0c;在此做个记录&#xff0c;以及个人…

【每日一题】23年4月

文章目录 C 技术点多边三角形剖分的最低得分&#xff08;dp思路&#xff0c;选不选问题&#xff09;移动石子到连续&#xff08;思路&#xff09;1027. 最长等差数列(动态规划)1105. 填充书架&#xff08;动态规划&#xff09;1031 两个非重叠子数组的最大和1163.按字典序排在最…

【Java 】从源码全面解析Java 线程池

文章目录 一、引言二、使用三、源码1、初始化1.1 拒绝策略1.1.1 AbortPolicy1.1.2 CallerRunsPolicy1.1.3 DiscardOldestPolicy1.1.4 DiscardPolicy1.1.5 自定义拒绝策略1.2 其余变量 2、线程池的execute方法3、线程池的addWorker方法3.1 校验3.2 添加线程 4、线程池的 worker …

PostgreSQL 基础知识:psql 提示和技巧

对于积极使用和连接到 PostgreSQL 数据库的任何开发人员或 DBA 来说&#xff0c;能够访问psql命令行工具是必不可少的。在我们的第一篇文章中&#xff0c;我们讨论了 psql的简要历史&#xff0c;并演示了如何在您选择的平台上安装它并连接到 PostgreSQL 数据库。 在本文中&…

使用腾讯云快速完成网站备案的详细过程

最近总是被备案弄得血压飙升&#xff0c;明明是一件很简单的事情&#xff0c;不知道大家为什么搞得那么复杂&#xff0c;首先了解下为什么要备案&#xff0c;根据国务院令第292号《互联网信息服务管理办法》和 《非经营性互联网信息服务备案管理办法》规定&#xff0c;国家对经…

【TCP四次挥手】

文章目录 TCP 四次挥手过程是怎样的&#xff1f;为什么挥手需要四次&#xff1f;第一次挥手丢失了&#xff0c;会发生什么&#xff1f;第二次挥手丢失了&#xff0c;会发生什么&#xff1f;第三次挥手丢失了&#xff0c;会发生什么&#xff1f;第四次挥手丢失了&#xff0c;会发…

Lecture 13(Extra Material):Q-Learning

目录 Introduction of Q-Learning Tips of Q-Learning Double DQN Dueling DQN Prioritized Reply Multi-step Noisy Net Distributional Q-function Rainbow Q-Learning for Continuous Actions Introduction of Q-Learning Critic: The output values of a critic…

为生信写的Python简明教程 | 视频3

开源生信 Python教程 生信专用简明 Python 文字和视频教程 源码在&#xff1a;https://github.com/Tong-Chen/Bioinfo_course_python 目录 背景介绍 编程开篇为什么学习Python如何安装Python如何运行Python命令和脚本使用什么编辑器写Python脚本Python程序事例Python基本语法 数…

PySpark基础入门(7):Spark SQL

概述 SparkSQL和Hive的异同 Hive和Spark 均是&#xff1a;“分布式SQL计算引擎”SparkSQL使用内存计算&#xff0c;而Hive使用磁盘迭代&#xff0c;所以SparkSQL性能较好二者都可以运行在YARN之上SparkSQL无元数据管理&#xff0c;但可以和hive集成&#xff0c;集成之后可以借…

极光笔记 | 极光推出“运营增长”解决方案,开启企业增长新引擎

摘要&#xff1a; 移动互联网流量红利见底&#xff0c;营销获客面临更多挑战 随着移动互联网流量红利见顶&#xff0c;越来越多的企业客户发现获取新客户的难度直线上升&#xff0c;获客成本持续攀高。 传统的移动互联网营销以PUSH为代表&#xff0c;采用简单粗暴的方式给用户…

PaddleVideo 简介以及文件目录详解

简介特性许可证书 PaddleVideo 文件目录总述applications 文件夹详述configs 文件夹详述docs 文件夹详述paddlevideo 文件夹详述utils 文件夹tasks 文件夹loader 文件夹modeling 文件夹solver 文件夹metrics 文件夹 简介 PaddleVideo 旨在打造一套丰富、领先且实用的 Video 工…

【阿里云】秒懂云通信

目录 一、秒懂云通信-第一回听什么? 二、短信的使用场景 1. 短信的三种类型&#xff1a;短信通知、验证、会员营销 三、短信平台的选择 1、看成功率 2、看价格 3、看体验 四、秒懂云通信 五、如何使用 Step 1&#xff1a;业务入口 Step 2&#xff1a;注册账号 Step…