Java异常之自定义异常类详解和代码举例

2023-10-31

Java语言的异常

异常处理机制

  1. Java中的异常概念
    1. 异常是程序在运行过程中由于算法问或软件设计等问题导致的程序异常事件。
    2. 异常的前提是可以识别并被捕获的。
    3. Java以面向对象的方法来处理异常的;Java提供了各种类型的异常类。
    4. Java允许自定义异常类。
  2. Java异常的产生过程
    1. 程序运行若发生异常,就会触发能被监听器捕获的异常事件,该事件的处理程 序会生成一个对应的
    异常对象并交给JVM,由 JVM查找相应的代码处理该异 常。
    2. 生成异常对象并将其交给JVM的过程称为捕获异常。
    3. 常本身作为一个对象,即产生一个异常就是产生一个异常对象;异常对象可 能由应用程序本身产
    生,也可能由JVM产生,这取决于异常的种类。
  3. 异常的本质
    1 .每个异常类都代表一种运行错误,类中包含错误信息及错误处理的方法等内容。
    2. 异常本质上是一个程序运行时发生的事件,该事件将导致程序的运行中断;尽 管如此,在处理异常
    的代码中可以调整程序运行的方向,使程序仍可继续执行。
  4. 异常的处理
    1. 程序产生异常,系统捕获异常,程序员编写异常处理程序。

异常处理类

  • 在 Java 中,Throwable 类是 Java 语言中所有错误或异常的超类,它有两个直接子类:Error和Exception。
  • Error类及其子类代表了程序运行时Java系统内部的错误,程序设计者无能为力,程序也不能从Error中恢复,因此不必处理它们,从技术上讲Error不是异常。
  • Exception类及其子类代表了用户程序能够捕捉到的异常,因此应该是程序设计者要关心的、尽可能要处理的部分。

异常的处理

在 Java 中,通常用 trycatchfinally 捕捉并处理异常,用 throw是方法里面抛、throws是在方法上抛出异常。

   使用try-catch-finally捕获和处理异常 语法结构: 
 	try{   
 		要检查的语句序列:可能要抛出异常的代码 
 	}catch(异常类名 形参对象名){   
 		异常发生时处理的语句序列 
 	}finally{   
 		无论是否产生异常,都要执行这部分语句 
 	} 

例如:

Scanner scn=new Scanner(System.in);
SimpleDateFormat sdf=new SimpleDateFormat("yyyy-MM-dd");
System.out.println("请输入出生日期(yyyy-MM-dd):");
String strBirth=scn.next();
try {
    Date birth=sdf.parse(strBirth);
    System.out.println("生日:"+birth);
}catch(ParseException pe) {
    System.out.println("生日错误!");
    pe.printStackTrace();
}finally {
    System.out.println("程序执行finally块!");
        }

多异常的处理

  • 多异常需要程序设计者熟悉各类异常。初学者在不熟悉各种异常类的情况下可 以使用Exception类。
  • 多异常的处理思想与switch-case结构非常类似。

抛出异常

  • 1.在捕获异常之前,必须有一段代码生成并抛出一个异常对象。
  • 2.异常类型不同,抛出异常的方法也不同,分为:系统自动抛出的异常指定方法抛出的异常
  • 3.系统定义的异常由系统抛出;指定方法抛出的异常需使用关键字throwthrows

我们主要讨论由方法抛出的异常用法。

  • 抛出异常的方法与调用方法处理异常
    1.异常的产生和处理可以在一个方法内进行;
    2.异常的产生和处理也可以不在一个方法中,即一个方法产生异常,由该方法的调用者去处理异常 相对应地,异常有关的方法就有两个:有抛出异常的方法 和处理异常的方法。

  • 抛出异常的方法
    1.在方法体内使用throw抛出异常:throw 由异常类产生的对象;
    2.在方法头部添加throws抛出异常
    [修饰符] 返回值类型 方法名([参数列表]) throws 异常列表{
    … …
    }
    由上述两种方式抛出异常,在该方法内就不必提供 try-catch-finally块去处理异常,有调用者的程序处理。

  • 处理异常的方法
    1.如果程序设计者调用了一个会抛出异常的方法,要么try-catch处理这个异常,要么将异常继续抛出。

样例:
1.直接抛

package Test.javawork.hextodecString;


/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexString{

    public static String hexToDecString(String hexString) throws HexFormatException {
        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
        throw new HexFormatException(hexString+"不是16进制");//在方法里面抛异常,但不处理,由方法体抛出,调用者去处理
        return "是16进制";
    }

    public static void main(String[] args) {

        String s = null;
        try {
            s = HexString.hexToDecString("123we");
        } catch (HexFormatException e) {
            e.printStackTrace();
        }
        System.out.println(s);
    }
}

2.直接处理。

package Test.javawork.hextodecString;


/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexString{

    public static String hexToDecString(String hexString) {
        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
            try {
                throw new HexFormatException(hexString+"不是16进制");//在方法里面抛异常,但不处理,由方法体抛出,调用者去处理
            } catch (HexFormatException e) {
                e.printStackTrace();
            }
        return "是16进制";
    }

    public static void main(String[] args) {

        String s = HexString.hexToDecString("123we");
        System.out.println(s);

    }
}
  • 注意直接抛是不会运行后面的程序的直接就停止了。直接处理的话,处理完之后就会继续运行接下面的程序。

自定义异常类

java提供的异常类,不够我们使用,需要我们自己定义一些异常类
格式:

public class XXXXException extends Exception 或者RuntimeException{
          添加一个空参构造方法
          添加一个带异常信息的构造方法
  }

注意:

  • 自定义异常类一般都是以Exception结尾,说明该类是个异常类
  • 自定义异常类,必须继承Exception 或者RuntimeException继承Exception的话:那么自定义的异常类就是一个编译期异常,如果方法内部抛出了编译器异常,就必须处理这个异常,要么Try()。。。。catch或者throws
    继承RuntimeException的话:那么这个自定义的异常类就是一个运行期异常,无需处理,直接抛,直接交给虚拟机处理(中断处理)

例自定义类:

package Test.javawork.hextodecString;

/**
 * @author : xjszsd
 * @date : 2022-05-05 16:29
 */
public class HexFormatException extends Exception{

    public HexFormatException(String message) {
        super(message);

    }

}
package Test.javawork.hextodecString;


public class HexString{
    
    public static String hexToDecString(String hexString) throws HexFormatException {

        String regex="^[A-Fa-f0-9]+$";
        if(!hexString.matches(regex))
        throw new HexFormatException(hexString+"不是16进制");

        return "是16进制";
    }

    public static void main(String[] args) {

        String s = null;
        try {
            s = HexString.hexToDecString("123we");
        } catch (HexFormatException e) {
            e.printStackTrace();
        }
        System.out.println(s);

    }
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Java异常之自定义异常类详解和代码举例 的相关文章

随机推荐

  • 传智播客技术社区_播客与网络技术的未来

    传智播客技术社区 Episode zero We recorded a test episode of The Versioning Show and had so much fun doing it we thought we d mak
  • WebGL简易教程(十五):加载gltf模型

    目录 1 概述 2 实例 2 1 数据 2 2 程序 2 2 1 文件读取 2 2 2 glTF格式解析 2 2 2 1 场景节点 2 2 2 2 网格 2 2 2 3 缓冲 缓冲视图和访问器 2 2 2 4 纹理材质 2 2 3 初始化顶
  • Qt 为.h和.cpp文件添加ui文件

    假设在工程中已经有了一个纯类A的头文件a h和源文件a cpp 现在想给这个纯类文件添加UI 可以通过以下操作来实现 给工程添加一个和类同名的UI文件a ui 在a cpp中添加UI的头文件 头文件的名字应该形如ui xxx h 但在添加时
  • Composer警告Warning:This development build of composer is over 60 days old......

    今天查看了一下服务器安装的Composer版本 报了一个警告 意思是安装已经超过60天了 需要执行 usr bin composer self update 升级到最新版本 然后我就执行了 再次查看版本确实更新到官方最新的1 7 3版本 但
  • IDEA自动补全返回值的快捷键

    首先 将光标移至方法的末尾 然后 使用 ctrl alt v 示例 补全以前 discoveryClient getServices 补全以后 List
  • 模板方法(template method)c++版本

    大话设计模式中的template method c 版本 template method cpp Created on Jul 24 2017 Author clh01s 163 com 模板方法 include
  • C++基础知识 - deque容器概述

    deque容器概念 deque是 double ended queue 的缩写 和vector一样都是STL的容器 唯一不同的是 deque是双端数组 而vector是单端的 Deque 特点 deque在接口上和vector非常相似 在许
  • c语言输出中文为乱码_C语言输出乱码问题

    题目 要求输出国际象棋棋盘 include include conio h int main int i j for i 0 i lt 8 i for j 0 j lt 8 j if i j 2 0 printf c c 219 219 e
  • QT5.2中新建lib库,在引用时出现error LNK2019: 无法解析的外部符号错误

    1 由于在VS2010中新建QT的lib库时默认的是新建动态链接库 然后我在配置属性中改为lib库 结果生成的lib库在引用是出现error LNK2019 无法解析的外部符号错误 2 error LNK2019 无法解析的外部符号 dec
  • 超越Swin

    作者 科技猛兽 编辑 极市平台 点击下方卡片 关注 自动驾驶之心 公众号 ADAS巨卷干货 即可获取 点击进入 自动驾驶之心 目标检测 技术交流群 后台回复 transformer综述 获取2022最新ViT综述论文 导读 本文提出 FCM
  • Java方法和数组练习

    个人简介 作者简介 大家好 我是W chuanqi 一个编程爱好者 个人主页 W chaunqi 支持我 点赞 收藏 留言 愿你我共勉 没有什么比勇气更温文尔雅 没有什么比怯懦更冷酷无情 Java方法和数组练习 1 获取每月天数 根据输入的
  • el-upload 上传视频并回显

    el upload上传视频 并且显示上传的视频
  • python基础编程_25_拷贝函数,copy()

    import copy a 1 2 3 4 a b b a 引用 除非直接给a重新赋值 否则a变则b变 b变则a变 c copy copy a 浅复制 只会拷贝父对象 不会拷贝父对象中的子对象 所以若a的子对象变则c 变 但是父对象变c不会
  • C++利用Poco库实现QT的信号与槽效果

    C 利用Poco库实现QT的信号与槽效果 定义信号类 信号类的使用 定义类型Model main头文件引用 main定义信号发送类 main定义信号接收类 main主函数 引用的Poco库 参考资源 C 利用Poco库实现QT的信号与槽效果
  • Python3,使用Flask来实现接口请求

    Flask之实现接口请求 1 引言 2 Flask 2 1 flask 的环境安装 2 2 flask构建web框架 2 3 flask构建get请求 2 4 flask构建post请求 2 41 代码编写 2 4 2 安装RestClie
  • j2me总结(三)

    高级界面开发 二 本编介绍高级界面下的类 1 Form Form是高级界面中最重要的类 是一个典型的容器控件类 是一个包含多个UI组件的屏幕对象 故名思意 form为表单的意思 在form中可以包含Item类 Form上的每一个元素都会分配
  • vue .number修饰符

    项目中遇到这样一个问题 某个input框用来输入价格之类的数字 我想对input的取值区间做判断 但是发现输入后变成了String类型 所以用了vue中的 number修饰符 这样就可以获得Number类型了 很方便
  • Qt 5 帮助文档的使用

    Qt 5 帮助文档的使用 Qt 5 帮助文档的使用学习图形界面开发 肯定离不开帮助文档的使用 因为它不像 C 语言那样就那么几个函数接口 图形接口的接口可以用海量来形容 常用的我们可能能记住 其它的真的没有必要去记 用到什么就去帮助文档查看
  • C++ 读写CSV文件

    include
  • Java异常之自定义异常类详解和代码举例

    Java语言的异常 异常处理机制 Java中的异常概念 1 异常是程序在运行过程中由于算法问或软件设计等问题导致的程序异常事件 2 异常的前提是可以识别并被捕获的 3 Java以面向对象的方法来处理异常的 Java提供了各种类型的异常类 4