Java 自定义异常

自定义异常

自定义异常的必要

Java中不同的异常类,分别表示着某一种具体的异常情况。那么在开发中总是有些异常情况是核心类库中没有定义好的,此时我们需要根据自己业务的异常情况来定义异常类。

自定义异常类

自定义异常类可以参照lang包中系统提供的异常类型,ExceptionThrowable

  • 自定义的异常类要继承一个现有的异常体系

    • 编译时异常,自定义类继承java.lang.Exception
    • 运行时异常,自定义类继承java.lang.RuntimeException
  • 提供多个构造器,构造器构成重载

  • 自定义异常需要提供serialVersionUID

    static final long serialVersionUID = -3387516993124229948L;	//Exception
    static final long serialVersionUID = -7034897190745766939L;	//RuntimeException
    static final long serialVersionUID = 7818375828146090155L;	//IOException
    static final long serialVersionUID = -2848938806368998894L;	//NumberFormatException
    //每一个异常类的 serialVersionUID ,序列版本号
    

自定义异常类的示例

提供一个小于0 的异常

定义Student类,类中有属性id,有方法getId setId

实例化Student,输入数值,若非负,则调用setId赋值;若为负,则显示异常

class BelowZeroException extends Exception{static final long serialVersionUID = -33875163124229948L;		//序列版本号public BelowZeroException (){}public BelowZeroException(String name){super(name);}puubilc BelowZeroException(String message,Throwable cause){super(message,cause);}
}}public class StudentTest {public static void main(String[] args) throws BelowZeroException {Student s1 = new Student();int num;Scanner scanner = new Scanner(System.in);num = scanner.nextInt();if(num > 0){s1.setId(num);}else{throw new BelowZeroException("输入非法id");}System.out.println("此学生的id为  " + s1.getId());}
}
class Student{private int id;public void setId(int id){this.id = id;}public int getId(){return this.id;}
}

优化后

package Throwable;import java.util.Scanner;class BelowZeroException extends Exception{static final long serialVersionUID = -33875163124229948L;		//序列版本号public BelowZeroException (){}public BelowZeroException(String name){super(name);}puubilc BelowZeroException(String message,Throwable cause){super(message,cause);}
}
class Student{private int id;public int getId() {return id;}//    public void setId(int id) {
//        this.id = id;
//    }public void register(int id) throws BelowZeroException {if(id > 0){this.id = id;}else{throw new BelowZeroException("输入非法ID");}}
}
public class StudentTest {public static void main(String[] args) {Student s1 =new Student();Scanner scanner = new Scanner(System.in);try{int num = scanner.nextInt();s1.register(num);} catch (BelowZeroException e) {throw new RuntimeException(e);}System.out.println("此学生的ID为 "+ s1.getId());}
}

自定义异常类的使用

在具体的代码中,满足指定条件的情况下,需要手动使用throw + 自定义异常类的对象 将异常对象抛出

如果自定义异常类时非运行时异常,则必须要考虑如何处理此异常类的对象(使用try-catch-finallythrows处理)

为什么需要自定义异常类

​ 自定义异常类可以通过异常的名称,就可以直接判断异常出现的原因,尽管如此,有必要在实际开发场景中,不满足我们指定的条件时,指明我们自己特有的异常类,通过此异常类的名称,就能判读出具体出现的问题

程序示例

示例一

public class ReturnExceptionDemo {static void methodA() throws Exception{try {System.out.println("进入方法A");throw new Exception("制造异常");}finally {System.out.println("使用A方法中的finally");}}static void methodB(){try {System.out.println("进入方法B");return;}finally {System.out.println("调用B方法中的finally");}}public static void main(String []args){try{methodA();}catch (Exception e){System.out.println(e.getMessage());}methodB();}
}
//输出结果
进入方法A
使用A方法中的finally
制造异常
进入方法B
调用B方法中的finally

示例二

需求

在一款角色扮演游戏中,每个人都会有名字和生命值,角色的生命值不能为负数

当生命值为负数时要抛出自定义异常

自定义异常类NoLifeValueException

//自定义异常类NoLifeValueExcpeiton 继承 RuntimeException
//空参构造器 和 带参构造器
public class NoLifeValueException extends RuntimeException{private static final long serialVersionUID = -1111111111L;public NoLifeValueException(){}public NoLifeValueException(String message){super(message);}
}

定义类Person

//定义Person类
//属性: 名称和生命值
//提供getter setter方法
//提供空参构造器 带参构造器
public class Person {private String name;private int lifeValue;public Person() {}public Person(String name, int lifeValue) {this.name = name;setLifeValue(lifeValue);    //在构造器中调用setLifeValue方法}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getLifeValue() {return lifeValue;}public void setLifeValue(int lifeValue) {if(lifeValue > 0){this.lifeValue = lifeValue;}else{throw new NoLifeValueException("生命值不能为负数" + lifeValue);}}
}

main入口

public class PersonTest {public static void main(String[] args) {Person p1 = new Person("Steve",100);System.out.println("名称:"+ p1.getName()+" 生命值:"+ p1.getLifeValue());Person p2 = new Person("张三",-20);}
}
//输出结果
名称:Steve 生命值:100
Exception in thread "main" Throwable.NoLifeValueException: 生命值不能为负数-20at Throwable.Person.setLifeValue(Person.java:31)at Throwable.Person.<init>(Person.java:12)at Throwable.PersonTest.main(PersonTest.java:8)

示例三

需求

编写应用程序DicisionDemo.java 接受命令行的两个参数,要求不能输入负数,计算两数相除

对数据类型不一致(Number Format Exception) 、缺少命令行参数(ArrayIndexOutOfException)、除0(ArithmeticException)以及输入负数(BelowZeroException)进行异常处理

提示

  • 在主类(DivisionDemo)中定义异常方法(divide)完成两数相除的功能
  • 在main()方法中调用divide方法,使用异常处理语句进行异常处理
  • 在程序中,自定义对应输入负数的异常类(BelowZeroException)
  • 与形式接受参数 java DicisionDemo 20 10 //args[0] =“20” args[1]=“10”
  • Interger类的static方法parseInt(String s)将s转换对应的Int值

编写DicisionDemo主程序

public class DivisionDemo {public static void main(String[] args) {try {int m = Integer.parseInt(args[0]);int n = Integer.parseInt(args[1]);int result =divide(m,n);System.out.println("结果为 :" + result);} catch (BelowZeroException e) {System.out.println(e.getMessage());}catch (NumberFormatException e){System.out.println("数据类型不一致");}catch (ArrayIndexOutOfBoundsException e){System.out.println("缺少命令行参数");}catch(ArithmeticException e){System.out.println("非法除0");} }public static int divide (int m ,int n) throws BelowZeroException{if(m < 0 || n < 0){throw new BelowZeroException("输入负数,非法输入");}return m / n;}
}

自定义类BelowZeroException

public class BelowZeroException{public BelowZeroException(){}public BelowZeroException(String message){super(message);}
}

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

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

相关文章

Vue3中的常见组件通信之props和自定义事件

Vue3中的常见组件通信 概述 ​ 在vue3中常见的组件通信有props、mitt、v-model、 r e f s 、 refs、 refs、parent、provide、inject、pinia、slot等。不同的组件关系用不同的传递方式。常见的撘配形式如下表所示。 组件关系传递方式父传子1. props2. v-model3. $refs4. 默认…

第十二章 创建Web客户端

文章目录 第十二章 创建Web客户端SOAP向导的概述使用SOAP向导 第十二章 创建Web客户端 web客户端是访问web服务的软件。web客户端提供了一组代理方法&#xff0c;每个方法对应于web服务的一个方法。代理方法使用与它所对应的web服务方法相同的签名&#xff0c;并在被请求时调用…

Python课设-学生信息管理系统

一、效果展示图 二、前端代码 1、HTML代码 <1>index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0">…

安卓模拟鼠标,绘图板操作电脑PC端,卡卡罗特也说好,儿童节快乐

家人们&#xff0c;上链接了&#xff1a;https://download.csdn.net/download/jasonhongcn/89387887

B站如何屏蔽短视频:成都鼎茂宏升文化传媒公司

B站如何屏蔽短视频&#xff1a;优化你的观看体验 在当今数字化时代&#xff0c;B站&#xff08;哔哩哔哩&#xff09;作为国内领先的弹幕视频网站&#xff0c;以其丰富的视频资源和独特的弹幕文化吸引了大量用户。然而&#xff0c;随着短视频的兴起&#xff0c;B站也引入了短视…

Java的可见性和有序性你真的懂吗

一、可见性(Visibility) 1.指的是&#xff1a;一个线程对变量的修改可被其他线程看见。 2.Java提供了volatile、synchronized、final、Lock等来保证可见性。 3.volatile&#xff1a;volatile修饰的变量在每次访问时都会从主内存中读取&#xff0c;并且在修改后会立即刷新回主内…

intel深度相机D455的使用

一、D455介绍 Intel RealSense D455 是RealSense D400系列的一部分&#xff0c;这个系列的设备以其高精度和可靠性而闻名。D455相比于之前的型号&#xff08;如D415和D435&#xff09;&#xff0c;提供了更远的感知范围和更高的精度。 二、使用代码 我们先定义一下相关的函数…

鸿蒙OS初识

学习官网&#xff1a;https://www.harmonyos.com/cn/develop 准备 注册&#xff0c;安装软件&#xff08;node:12, DevEco Studio&#xff09;&#xff1a; https://developer.harmonyos.com/cn/docs/documentation/doc-guides/software_install-0000001053582415#ZH-CN_TOP…

MFC3d立体按钮制作

1、本程序基于前期我的博客文章MFC用CButtonST类实现图片透明按钮(免费源码下载) 2、添加CeXDib.cpp CeXDib.h ShadeButtonST.cpp ShadeButtonST.h到项目文件夹下&#xff0c;和FileView中如图。 3、在ButtonShadeDlg.h中添加代码 #include "ShadeButtonST.h" #in…

4分之1外螺纹怎么编程:挑战与策略解析

4分之1外螺纹怎么编程&#xff1a;挑战与策略解析 在机械制造领域&#xff0c;螺纹编程是一项至关重要的技术任务。当面对如4分之1外螺纹这样的具体需求时&#xff0c;编程人员需要综合运用专业知识与编程技巧&#xff0c;以确保螺纹的精确度和生产效率。本文将围绕四个方面、…

springboot595基于Java的大学生迎新系统-手把手调试搭建

springboot595基于Java的大学生迎新系统-手把手调试搭建 springboot595基于Java的大学生迎新系统-手把手调试搭建

Qml开发的两种方法

一.Qml开发的两种方法 1.Qt Creator 开发,手动编写qml代码 这种方法开发很方便&#xff0c;适合对qml语言非常熟悉的开发人员。 2.用Qt Design Studio 设计qml界面 这种方法更适合对qml不太熟悉的人&#xff0c;可以实现qml控件的拖拉拽&#xff0c;类似与widget界面开发&…

C#语言进阶(二)—事件 第二篇(.net标准事件模型)

总目录 C# 语法总目录 系列链接 C#语言进阶(二) 事件 第一篇(发布订阅模式) C#语言进阶(二) 事件 第二篇(.net标准事件模型) C#语言进阶(二) 事件 第二篇(事件访问器) 事件 第二篇目录 事件 第二篇2. .net标准事件模型 事件 第二篇 2. .net标准事件模型 标准事件模型…

【原型模式】详解

一.概念 原型模式是一种创建型设计模式&#xff0c;它的主要思想是通过复制现有对象来创建新对象&#xff0c;而不是通过实例化一个类来创建。在原型模式中&#xff0c;我们称被复制的对象为原型&#xff08;Prototype&#xff09;&#xff0c;新创建的对象为克隆体&#xff0…

用户画像知识点补充——多数据源

引入 针对用户画像项目来说&#xff08;产品&#xff09;必须要支持从多种数据源加载业务数据&#xff0c;构建用户标签。 在之前的标签模型开发中&#xff0c;主要是为了简化开发复杂度&#xff0c;业务数据统一存储到HBase表中。 数据源包含如下几个方面&#xff1a; 存储H…

【应用层】 DNS 域名协议解析

文章目录 DNS(Domain Name System)出现及演化 ⏳DNS 概括&#x1f50d;DNS定义DNS 作用 DNS工作原理⚙️域名解析DNS解析的详细工作流程 DNS域名解析方式&#x1f504;静态DNS域名解析动态DNS域名解析 DNS域名解析过程的深入分析 &#x1f9d0;递归查询迭代查询 公共DNS服务器的…

Tailwindcss Flex 布局相关的样式类及其实战案例

007 Flex布局相关的样式 flex-basics 相关的样式类 ClassPropertiesbasis-0flex-basis: 0px;basis-1flex-basis: 0.25rem; /* 4px */basis-2flex-basis: 0.5rem; /* 8px */basis-3flex-basis: 0.75rem; /* 12px */basis-4flex-basis: 1rem; /* 16px */basis-5flex-basis: 1.2…

docker-comopse容器因依懒关系无启动解决方法

1、确认出影响项目开机自启的容器 通docker logs -f 确认容器是否正常docker restart 重启容器&#xff0c;如果项目正常&#xff0c;把异常容器加入rc.local中&#xff0c;待开机一定时间后&#xff0c;重启此容器。 2、在rc.local中添加延时重启对应容器 #vim /etc/rc.loc…

STC8增强型单片机进阶开发--LED呼吸灯(PWM)

知不足而奋进 望远山而前行 文章目录 目录 文章目录 前言 目标 内容 PWM基础概念 STC8H芯片 PWMA应用 PWM配置详解 周期 占空比 模式 使能PWM 引脚配置 EAXSFR扩展寄存器 总结 前言 学习PWM&#xff08;脉宽调制&#xff09;是探索数字信号转模拟信号的重要一步&#xff0c;尤…

ad18学习笔记21:焊盘设置Paste Mask Expansion(锡膏层延伸)

在pcb上放置焊盘的时候&#xff0c;可以对焊盘进行设置&#xff0c;可以用默认的规则&#xff0c;可以用自定义的规则&#xff0c;网上很少看到自定义的规则怎么用。 参考了官方的说明文档&#xff0c;我只是稍微补充了一下 paste mask与solder mask有哪些区别_paste mask与s…