二十九、异常处理

news2024/10/1 19:23:21

目录

①前言:

②常见的运行时异常

③常见的编译时异常

④异常的处理机制

⑤自定义异常


①前言:

1.什么是异常?

        异常是程序在“编译”或者“执行”的过程中可能出现的问题,注意:语法错误不算在异常体系中。

        比如:   数据索引越界异常,空指针异常,日期格式异常,等。

2.为什么要学习异常?

        异常一旦出现,如果没有提前处理,程序就会退出JVM虚拟机而终止。

        研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性。

3.异常体系

        Error: 系统级别的问题,JVM退出等,代码无法控制。

        Exception: java.lang包下,称为异常类,它表示程序本身可以处理的问题。

        RuntimeException及其子类: 运行时异常,编译阶段不会报错。(空指针异常,数组索引越界异常)

        除RuntimeException之外的所有异常: 编译时异常,编译器必须处理的,否则程序不能通过编译。(日期格式化异常)

4.编译时异常和运行时异常

        javac.exe 编译时异常,是在编译成class文件时必须要处理的异常,也称之为受检异常。

        java.exe 运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常。

简单来说:

        编译时异常,就是在编译时就出现的异常;

        运行时异常,就是在运行时出现的异常。

②常见的运行时异常

1.运行时异常

        直接继承自RuntimeException或者其子类,编译阶段不会报错,运行时可能出现的错误。

2.运行时异常示例:

        ①数据索引越界异常ArrayIndexOutOfBoundsException

        ②空指针异常NullPointerException 直接输出没问题,但调用空指针的变量的功能就会报错

        ③类型转换异常ClassCastException

        ④数学操作异常ArithmeticException

        ⑤数字转换异常NumberFormatException

运行时异常:

                一般是程序员业务没考虑就好或者编译逻辑不严谨引起的程序错误。

3.代码演示:

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**异常  程序在编译或运行中出现错误(语法错误不算在异常体系中)
 * Throwable
 * Error  系统级别的错误
 * Exception  程序级别的异常(RuntimeException  运行时异常 ) 编译时异常(受检异常)
 */
public class Exception_Demo1 {
    public static void main(String[] args) throws ParseException {
        //运行时异常
//        //1.数据索引越界异常ArrayIndexOutOfBoundsException
//        int[] arr = {10,21,34};
//        System.out.println(arr[3]);//越界异常
//        //2.空指针异常NullPointerException  直接输出没问题,但调用空指针的变量的功能就会报错
//        String name = null;
//        System.out.println(name);
//        System.out.println(name.length());
//        //3.类型转换异常ClassCastException
//        Object o = 23;
//        String s = (String) o;
//        //4.数学操作异常ArithmeticException
//        int c = 10/0;
//        //5.数据转换异常NumberFormatException
//        String number = "23 aa  bb";
//        Integer it = Integer.valueOf(number);
//        System.out.println(it+1);
    }
}

③常见的编译时异常

1.编译时异常

        除RuntimeException之外的所有异常,编译阶段就报错,必须处理,否则代码不通过。

2.编译时异常的作用是什么?

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

3.代码演示:

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**
 * 编译时异常的解决方式:
 * 1、抛出异常:只能抛出一个异常
 * 抛出异常规范操作 直接抛出throws Exception{}
 * 抛出异常并不好,如果异常最终抛出去给虚拟机会引起程序死亡
 *2、 监视捕获异常格式 :捕获异常
 * try{
 * 监视可能出现异常的代码
 * }catch(异常类型1 变量){
 * //处理异常
 * }
 * 3、 前两者结合
 *
 * 运行时异常处理方式:
 * 编译阶段不会报错,可以不抛,默认抛上去
 */
public class Exception_Demo1 {
    public static void main(String[] args) throws ParseException {
        //编译时异常
        //简单日期格式化类
//        String date = "2015-01-12  10:23:21";
//        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
//        //解析字符串成为日期对象
//        Date d = sdf.parse(date);
//        System.out.println(d);
        passTime("2022-12-11 12:24:13");
    }
    public static void passTime(String date){
​
        System.out.println("--------------------------------------");
        try {
            SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
            Date d = sdf.parse(date);
            System.out.println(d);
        } catch (Exception e) {
//            e.printStackTrace();//打印异常栈信息
            System.out.println("出现了解析时间异常");
        }
        try {
            InputStream is = new FileInputStream("E:/meinv.jpg");
        } catch (Exception ex) {
//            ex.printStackTrace();
            System.out.println("没有这个文件,不要骗我");
        }
    }
}

④异常的处理机制

1.编译时异常

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

2.编译时异常的处理形式有三种:

        ①出现异常直接抛出去给调用者,调用者也继续抛出去。

        ②出现异常自己捕获处理,不麻烦别人;

        ③前两者结合,出现异常直接抛出去给调用者,调用者捕获处理。

3.异常处理方式之一:throws

        throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理。

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

抛出异常格式:

规范做法:

 

4.异常处理方式之二:try...catch...

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

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

格式:

 

5.异常处理方式之三:前两者结合

        方法直接将异常通过throws抛出去给调用者

        调用者收到异常后直接捕获处理。

6.代码演示:

import java.io.FileInputStream;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
​
/**
    Exception 异常处理方式
 */
public class Exception_Test1 {
    //异常处理方式之二:try...catch...
    public static void main(String[] args) {
        System.out.println("程序开始~~");
        try {
            passTime("2022-12-11 12:24:13");
            System.out.println("程序操作成功~~");
        } catch (Exception e) {
            e.printStackTrace();
            System.out.println("程序操作失败~~");
        }
        System.out.println("程序结束~~");
    }
​
    //异常处理方式之一:throws
    public static void passTime(String date) throws Exception{
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        Date d = sdf.parse(date);
        System.out.println(d);
​
        InputStream is = new FileInputStream("E:/meinv.jpg");
    }
}

7.异常处理的总结

        在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理。

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

8.案例:异常处理使代码更稳健的案例

需求:

        键盘录入一个合理的价格为止(必须是数值,值必须大于0)。

分析:

        定义一个死循环,让用户不断的输入价格;

import java.util.Scanner;
​
/**  案例
 *  键盘录入一个合理的价格位置
 *  定义一个死循环,不断输入价格
 */
public class Exception_Test2 {
    public static void main(String[] args) {
        Scanner sc = new Scanner(System.in);
        while (true) {
            try {
                System.out.println("请您输入一个合理的价格");
                String priceStr = sc.nextLine();//接一行数据
                //转换成double类型的价格  判断价格大于0
                double price = Double.valueOf(priceStr);
                if (price >0) {
                    System.out.println("定价:"+price);
                    break;
                }else {
                    System.out.println("价格必须是正数~~");
                }
            } catch (NumberFormatException e) {
                System.out.println("用户输入的数据无效,请您输入合法的数据");
            }
        }
        System.out.println("----------------------------------");
​
        //自定义异常
        try {
            checkAge(34);
        } catch (Exception_Demo2 e) {
            throw new RuntimeException(e);
        }
    }
    public static void checkAge(int age) throws Exception_Demo2 {
        if (age<0 || age>200){
            //抛出去一个异常对象给调用者
            //throw:在方法内部直接创建一个异常对象,并由此点抛出
            //throws:用在方法上面声明上的,抛出方法内部的异常
            throw new Exception_Demo2(age+"IS Illeagal!");
        }else {
            System.out.println("年龄合法,推荐商品给其购买");
        }
    }
}

⑤自定义异常

1.自定义异常的必要?

        java无法为这个世界上全部问题提供异常类。

        如果企业想通过异常的方式来管理自己的某个业务问题,就需要自定义异常类了。

2.自定义异常的好处?

        可以使用异常的机制管理业务问题,如提醒程序员注意;

        同时一旦出现bug,可以用异常的形式清晰的指出出错的地方。

3.自定义异常的分类

        (1)自定义编译时异常

                ①定义一个异常继承Exception;

                ②重写构造器;

                ③在出现异常的地方用throw new自定义对象抛出。

        作用:

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

代码演示:

/**自定义异常
 * 1、自定义编译异常
 * 1。继承Exception
 * 2.重写构造器
 * 3.在出现异常的地方,用throw new自定义对象抛出
 * 作用:编译时异常编译时就报错,提醒更加强烈,一定需要处理
 *
 * 2、自定义运行异常
 * 1。继承RuntimeException
 * 2.重写构造器
 * 3.在出现异常的地方,用throw new自定义对象抛出
 * 作用:运行时才出现
 *
 *
 * throw:在方法内部直接创建一个异常对象,并由此点抛出
 * throws:用在方法上面声明上的,抛出方法内部的异常
 */
public class Exception_Demo2 extends Exception {
    public static void main(String[] args) {
        try {
            checkAge(-34);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }
​
    public static void checkAge(int age)throws Exception{
        if (age < 0 || age > 200){
            /*抛出一个异常对象给调用者
            throw:在方法内部直接创建一个异常对象,并从此点抛出。
            throws:用在方法申明上的,抛出方法内部的异常。
             */
​
            throw new Exception(age+"is illeagal");
        }else {
            System.out.println("年龄合法:推荐商品给其购买~~~");
        }
    }
}

        (2)自定义运行时异常

                ①定义一个异常类继承RuntimeException;

                ②重写构造器;

                ③在出现异常的地方用throw new 自定义对象抛出。

        作用:

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

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

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

相关文章

C语言的程序环境和预处理详解

目录 一、程序的翻译环境和执行环境 二、编译和链接详解 2、1 翻译环境 2、2 编译过程详解 2、3 执行环境 三、预处理详解 3、1 预定义符号 3、2 #define 3、2、1 #define定义的符号 3、2、2 #define 定义宏 3、2、3 #define 替换规则 3、3 宏和函数的对比 3、4 条件编译 3、5…

CUDA中的底层驱动API

文章目录CUDA底层驱动API1. Context2. Module3. Kernel Execution4. Interoperability between Runtime and Driver APIs5. Driver Entry Point Access5.1. Introduction5.2. Driver Function Typedefs5.3. Driver Function Retrieval5.3.1. Using the driver API5.3.2. Using …

Springboot扩展点之BeanPostProcessor

前言 Springboot&#xff08;Spring&#xff09;的扩展点其实有很多&#xff0c;但是都有一个共同点&#xff0c;都是围绕着Bean和BeanFactory&#xff08;容器&#xff09;展开的&#xff0c;其实这也很好理解&#xff0c;Spring的核心是控制反转、依赖注入、面向切面编程&…

西湖论剑 2023 比赛复现

WEB real_ez_node 在 route/index.js 中&#xff1a; router.post(/copy,(req,res)>{res.setHeader(Content-type,text/html;charsetutf-8)var ip req.connection.remoteAddress;console.log(ip);var obj {msg: ,}if (!ip.includes(127.0.0.1)) {obj.msg"only for…

【设计模式之美 设计原则与思想:面向对象】13丨实战二(上):如何对接口鉴权这样一个功能开发做面向对象分析?

面向对象分析&#xff08;OOA&#xff09;、面向对象设计&#xff08;OOD&#xff09;、面向对象编程&#xff08;OOP&#xff09;&#xff0c;是面向对象开发的三个主要环节。在前面的章节中&#xff0c;我对三者的讲解比较偏理论、偏概括性&#xff0c;目的是让你先有一个宏观…

电脑重装系统注册表恢复方法

​今天讲关于大家的电脑在遇到一些故障的时候&#xff0c;以及电脑用久了之后会卡顿&#xff0c;那么这时候大家一般都会给电脑重装系统。重装系统之后却发现自己电脑里的注册表不见了&#xff0c;重装系统后怎么恢复注册表?小编就带着大家一起学习重装系统注册表恢复到底是怎…

【博客615】通过systemd设置cgroup来限制服务资源争抢

通过systemd设置cgroup来限制服务资源争抢 1、场景 我们的宿主机上通常会用systemctl来管理一些agent服务&#xff0c;此时我们需要限制服务的cpu&#xff0c;memory等资源用量&#xff0c;以防止服务之前互相争抢资源&#xff0c;导致某些核心agent运行异常 2、systemd与cgro…

生成树协议 — STP

目录 一、环路的出现 1、广播风暴&#xff1a; 2、MAC地址表翻滚&#xff1a; 二、生成树 1、定义&#xff1a; 2、生成树使用的算法&#xff1a; 三、802.1D 1、BPDU&#xff1a; 2、TCN—拓扑变更消息&#xff08;也是BPDU&#xff09;&#xff1a; 3、部分名词&am…

【Python小游戏】某程序员将套圈游戏玩儿到了巅峰,好嗨哟~Pygame代码版《牛牛套圈》已上线,大人的套圈游戏太嗨了,小孩勿进。

前言 世上选择那么多。 关注栗子同学会是您最明智的选择哦。 所有文章完整的素材源码都在&#x1f447;&#x1f447; 粉丝白嫖源码福利&#xff0c;请移步至CSDN社区或文末公众hao即可免费。 “幸运牛牛套圈圈”套住欢乐&#xff0c;圈住幸福&#xff0c;等你来挑战&#xf…

用OpeAI API打造ChatGPT桌面端应用

用OpeAI API打造ChatGPT桌面端应用 自从《如何用ChatGPT高效完成工作》这篇文章火了之后&#xff0c;我在公司内部分享了一下”摸鱼“的先进经验&#xff0c;激发起广大同事一起”摸鱼“的热情。但是注册ChatGPT账号非常麻烦&#xff0c;既要Science上网&#xff0c;又要海外手…

Spark环境搭建

文章目录Spark 概述Spark 发展历史使用现状官网介绍流行原因组成模块Spark环境搭建-Local模式(本地模式)Spark环境搭建-Standalone(独立集群)Spark环境搭建-Standalone-HA(高可用)Spark环境搭建-Spark-On-Yarn两种模式Spark 概述 Spark 发展历史 2009年诞生2014年成为Apache顶…

Java笔记-线程中断

线程的中断 1.应用场景&#xff1a; 假设从网络下载一个100M的文件&#xff0c;如果网速很慢&#xff0c;用户等得不耐烦&#xff0c;就可能在下载过程中点“取消”&#xff0c;这时&#xff0c;程序就需要中断下载线程的执行。 2.常用中断线程的方法&#xff1a; 1.使用标…

Canvas鼠标滚轮缩放以及画布拖动(图文并茂版)

Canvas鼠标滚轮缩放以及画布拖动 本文会带大家认识Canvas中常用的坐标变换方法 translate 和 scale&#xff0c;并结合这两个方法&#xff0c;实现鼠标滚轮缩放以及画布拖动功能。 Canvas的坐标变换 Canvas 绘图的缩放以及画布拖动主要通过 CanvasRenderingContext2D 提供的 …

C++设计模式(13)——装饰模式

亦称&#xff1a; 装饰者模式、装饰器模式、Wrapper、Decorator 意图 装饰模式是一种结构型设计模式&#xff0c; 允许你通过将对象放入包含行为的特殊封装对象中来为原对象绑定新的行为。 问题 假设你正在开发一个提供通知功能的库&#xff0c; 其他程序可使用它向用户发…

注册ChatGPT的辛酸血泪史,不能算教程的教程

注册ChatGPT的血泪史 2月份了&#xff0c;改论文降重了&#xff0c;所以想搞个ChatGPT玩玩&#xff0c;本以为有渠道能顺序上车&#xff0c;但是看了很多教程&#xff0c;也进了很多交流群&#xff0c;都喵的(要不是卖号&#xff0c;租体验&#xff0c;liar)&#xff0c;所以自…

java ssm高校教材管理平台 idea maven

设计并且实现一个基于JSP技术的高校教材管理平台的设计与实现。采用MYSQL为数据库开发平台&#xff0c;SSM框架&#xff0c;Tomcat网络信息服务作为应用服务器。高校教材管理平台的设计与实现的功能已基本实现&#xff0c;主要学生、教材管理、学习教材、教材入库、教材领取、缴…

C语言 大数加法 大数乘法

最近刷题&#xff0c;总遇到大数加法&#xff08;浮点数&#xff09;和乘法问题(阶乘)&#xff0c;总结一下思路。 大数乘法主要思想&#xff1a;编程实现竖式乘法&#xff08;小学时候学的列竖式计算乘法&#xff09;创建一个很大的数组&#xff0c;用于存储大数的每一位。&am…

Android Q WiFi 代码框架

同学,别退出呀,我可是全网最牛逼的 WIFI/BT/GPS/NFC分析博主,我写了上百篇文章,请点击下面了解本专栏,进入本博主主页看看再走呗,一定不会让你后悔的,记得一定要去看主页置顶文章哦。 1 wifi 架构图 备注:在Android 9.0中,WiFi的状态处理在WifiStateMachine中进行,到…

c语言数据结构-图的遍历

(创作不易&#xff0c;感谢有你&#xff0c;你的支持&#xff0c;就是我前行的最大动力&#xff0c;如果看完对你有帮助&#xff0c;请留下您的足迹&#xff09; 目录 定义&#xff1a; 两种遍历方法&#xff1a; 深度优先搜索&#xff08;DFS&#xff09;&#xff1a; …

ElasticJob-Lite架构篇 - 认知分布式任务调度ElasticJob-Lite

前言 本文基于 ElasticJob-Lite 3.x 版本展开分析。 如果 Quartz 集群中有多个服务端节点&#xff0c;任务决定在哪个服务端节点上执行的呢&#xff1f; Quartz 采用随机负载&#xff0c;通过 DB 抢占下一个即将触发的 Trigger 绑定的任务的执行权限。 在 Quartz 的基础上&…