Day08-Java进阶-递归异常及其处理自定义异常

1. 递归

package com.itheima.recursion;public class RecursionDemo3 {/*不死神兔(斐波那契额数列)*/public static void main(String[] args) {int sum = getSum(20);System.out.println(sum);}public static int getSum(int n) {if (n == 1 || n == 2) {return 1;} else {return getSum(n - 2) + getSum(n - 1);}}
}

package com.itheima.recursion;public class RecursionDemo4 {/*猴子吃桃*/public static void main(String[] args) {int sum = monkey(1);System.out.println(sum);}public static int monkey(int day) {if (day == 10){return 1;}else{return (monkey(day + 1) + 1) * 2;}}
}

2. 异常

2.1 异常介绍

2.2 异常的处理方式

2.2.1 try...catch.. && throws

package com.itheima.exception.handle;import java.io.FileNotFoundException;
import java.io.FileReader;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;public class HandleExceptionDemo {/*异常的处理方式 :1. try...catch捕获异常好处: 异常对象可以被捕获, 后续的代码可以继续执行格式:try {可能会出现异常的代码} catch (异常名称 对象名) {异常的处理方案}执行流程:1. 执行 try {} 中的代码, 看是否有异常对象产生2. 没有 : catch就不会捕获, 后续代码继续执行3. 有 : catch捕获异常对象, 执行catch {} 中的处理方案, 后续代码继续执行2. throws 抛出异常----------------------------------------------------问题: 正在面临的异常, 是否需要暴露出来- 不需要暴露 : try...catch捕获- 需要暴露 : 抛出异常*/public static void main(String[] args) throws Exception {tryCatchDemo();}public static void method() throws ParseException, FileNotFoundException {SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日");Date date = sdf.parse("abc");System.out.println(date);FileReader fr = new FileReader("D:\\A.txt");}private static void tryCatchDemo() {System.out.println("开始");try {int[] arr = null;System.out.println(arr[10]);System.out.println(10 / 0);} catch (ArithmeticException e) {       // ArithmeticException e = new ArithmeticException();System.out.println("捕获了运算异常");} catch (NullPointerException e) {      // NullPointerException e = new NullPointerException();System.out.println("捕获了空指针异常");} catch (Exception e) {System.out.println("捕获了异常");}System.out.println("结束");}
}

2.2.2 案例

package com.itheima.exception;public class StudentAgeException extends RuntimeException {public StudentAgeException() {}public StudentAgeException(String message) {super(message);}}
package com.itheima.domain;import com.itheima.exception.StudentAgeException;public class Student {private String name;private int age;public Student() {}public Student(String name, int age) {this.name = name;setAge(age);}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age)  {if(age >= 0 && age <= 120){this.age = age;} else {// 错误的年龄throw new StudentAgeException("年龄范围有误, 需要0~120之间的年龄");}}public String toString() {return "Student{name = " + name + ", age = " + age + "}";}
}
package com.itheima.test;import com.itheima.domain.Student;
import com.itheima.exception.StudentAgeException;import java.util.Scanner;public class TryCatchTest {/*需求: 键盘录入学生的姓名和年龄, 封装为Student学生对象*/public static void main(String[] args)  {Student stu = new Student();Scanner sc = new Scanner(System.in);System.out.println("请输入学生姓名: ");String name = sc.nextLine();stu.setName(name);System.out.println("请输入学生年龄: ");int age = 0;while (true) {try {age = Integer.parseInt(sc.nextLine());stu.setAge(age);break;} catch (NumberFormatException e) {System.out.println("年龄输入有误, 请重新输入整数年龄: ");} catch (StudentAgeException e) {  // StudentAgeException e = new StudentAgeException("年龄范围有误, 需要0~120之间的年龄");String message = e.getMessage();System.out.println(message);}}System.out.println(stu);}
}

package com.itheima.exception;public class ThrowableMethodDemo {/*Throwable常用方法 :public String getMessage()  获取异常的错误原因public void printStackTrace() 展示完整的异常错误信息*/public static void main(String[] args) {System.out.println("开始");try {System.out.println(10 / 0);} catch (ArithmeticException e) {String message = e.getMessage();System.out.println(message);}System.out.println("结束");}
}

2.3 自定义异常

package com.itheima.exception;public class StudentAgeException extends RuntimeException {public StudentAgeException() {}public StudentAgeException(String message) {super(message);}}

package com.itheima.homework;public class StudentAgeException extends RuntimeException{public StudentAgeException() {}public StudentAgeException(String message) {super(message);}
}
package com.itheima.homework;public class StudentScoreException extends RuntimeException{public StudentScoreException() {}public StudentScoreException(String message) {super(message);}
}
package com.itheima.homework;public class Student {private String name;private int age;private int mathScore;private int chineseScore;private int englishScore;public Student() {}public Student(String name, int age, int mathScore, int chineseScore, int englishScore) {this.name = name;this.age = age;this.mathScore = mathScore;this.chineseScore = chineseScore;this.englishScore = englishScore;}/*** 获取** @return name*/public String getName() {return name;}/*** 设置** @param name*/public void setName(String name) {this.name = name;}/*** 获取** @return age*/public int getAge() {return age;}/*** 设置** @param age*/public void setAge(int age) {if (age >= 0 && age <= 120) {this.age = age;} else {throw new StudentAgeException("您输入的年龄有误, 请输入0~120之间的年龄");}}/*** 获取** @return mathScore*/public int getMathScore() {return mathScore;}/*** 设置** @param mathScore*/public void setMathScore(int mathScore) {this.mathScore = setScore(mathScore);}/*** 获取** @return chineseScore* @param i*/public int getChineseScore(int i) {return chineseScore;}/*** 设置** @param chineseScore*/public void setChineseScore(int chineseScore) {this.chineseScore = setScore(chineseScore);}/*** 获取** @return englishScore*/public int getEnglishScore() {return englishScore;}/*** 设置** @param englishScore*/public void setEnglishScore(int englishScore) {this.englishScore = setScore(englishScore);}public int setScore(int score) {if (score >= 0 && score <= 100) {return score;} else {throw new StudentScoreException("您输入的成绩有误, 请输入0~100之间的分数");}}public String toString() {return "Student{name = " + name + ", age = " + age + ", mathScore = " + mathScore + ", chineseScore = " + chineseScore + ", englishScore = " + englishScore + "}";}
}
package com.itheima.homework;import java.util.ArrayList;
import java.util.Scanner;public class TestException {public static void main(String[] args) {ArrayList<Student> list = new ArrayList<>();for (int i = 0; i < 3; i++) {Student stu = new Student();list.add(stu);}Scanner sc = new Scanner(System.in);for (int i = 0; i < 3; i++) {Student stu = list.get(i);System.out.println("请输入第" + (i + 1) + "名学生的姓名:");stu.setName(sc.nextLine());// 捕捉年龄输入的异常while (true) {try {System.out.println("请输入第" + (i + 1) + "名学生的年龄:");stu.setAge(Integer.parseInt(sc.nextLine()));break;} catch (StudentAgeException e) {System.out.println(e.getMessage());} catch (NumberFormatException e) {System.out.println("您输入的年龄有误, 请重新输入整数的年龄");}}// 捕捉输入数学成绩的异常while (true) {try {System.out.println("请输入第" + (i + 1) + "名学生的数学成绩:");stu.setMathScore(Integer.parseInt(sc.nextLine()));break;} catch (StudentScoreException e) {System.out.println(e.getMessage());} catch (NumberFormatException e) {System.out.println("您输入的成绩有误, 请重新输入整数成绩");}}// 捕捉输入语文成绩的异常while (true) {try {System.out.println("请输入第" + (i + 1) + "名学生语文成绩:");stu.setChineseScore(Integer.parseInt(sc.nextLine()));break;} catch (StudentScoreException e) {System.out.println(e.getMessage());} catch (NumberFormatException e) {System.out.println("您输入的成绩有误, 请重新输入整数成绩");}}// 捕捉输入英语成绩的异常while (true) {try {System.out.println("请输入第" + (i + 1) + "名学生的英语成绩:");stu.setEnglishScore(Integer.parseInt(sc.nextLine()));break;} catch (StudentScoreException e) {System.out.println(e.getMessage());} catch (NumberFormatException e) {System.out.println("您输入的成绩有误, 请重新输入整数成绩");}}}for (int i = 0; i < 3; i++) {Student stu = list.get(i);System.out.println("第" + (i + 1) + "个学生的信息为:" + stu);}}}

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

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

相关文章

【nginx】nginx启动显示80端口占用问题的解决方案

目录 &#x1f305;1. 问题描述 &#x1f30a;2. 解决方案 &#x1f305;1. 问题描述 在启动nginx服务的时候显示内容如下&#xff1a; sudo systemctl status nginx 问题出现原因&#xff1a; 根据日志显示&#xff0c;Nginx 服务启动失败&#xff0c;主要原因是无法绑定…

day1c++基础

const char*p;//值不可以改变&#xff0c;地址可以改变 const &#xff08;char*&#xff09;p; //值不可以改变&#xff0c;地址可以改变 char* const p; //值可以改变&#xff0c;地址不可以改变 const char* const p; //值不可以改变&#xff0c;地址不可以改变 char co…

【C++】封装、继承和多态

引言 在现代软件开发中&#xff0c;面向对象编程&#xff08;Object Oriented Programming&#xff09;已经成为一种广泛应用的编程范式。C作为一种支持面向对象编程的语言&#xff0c;在封装、继承和多态方面提供了强大的特性。本文将介绍C中的封装、继承和多态概念&#xff…

element plus:tree拖动节点交换位置和改变层级

图层list里有各种组件&#xff0c;用element plus的tree来渲染&#xff0c;可以把图片等组件到面板里&#xff0c;面板是容器&#xff0c;非容器组件&#xff0c;比如图片、文本等&#xff0c;就不能让其他组件拖进来。 主要在于allow-drop属性的回调函数编写&#xff0c;要理清…

数字逻辑电路基础-有限状态机

文章目录 一、有限状态机基本结构二、verilog写一个基础有限状态机(moore型状态机)三、完整代码一、有限状态机基本结构 本文主要介绍使用verilog编写有限状态机FSM(finite state machine),它主要由三部分组成,下一状态逻辑电路,当前状态时序逻辑电路和输出逻辑电路。 有…

ZYNQ之嵌入式开发04——自定义IP核实现呼吸灯、固化程序

文章目录 自定义IP核——呼吸灯实验固化程序 自定义IP核——呼吸灯实验 Xilinx官方提供了很多IP核&#xff0c;在Vivado的IP Catalog中可以查看这些IP核&#xff0c;在构建自己复杂的系统时&#xff0c;只使用Xilinx官方的免费IP核一般满足不了设计的要求&#xff0c;因此很多…

NOIP,CSP-J,CSP-S——高精度加减乘除

一、高精度加法 1、大整数的输入 int的范围,正负上下限大约为2.1*10^9; long long的范围,正负上下限大约为9.2*10^18; 如果整数成千上万位,那么这么大的整数我们如何处理? 方法:先用字符串输入,然后把每一个字符转换成为数字,存到一个int数组里 int数组中的一个位…

揭秘Faiss:大规模相似性搜索与聚类的技术神器深度解析!

Faiss&#xff08;由Facebook AI Research开发&#xff09;是一个用于高效相似性搜索和密集向量聚类的库。它用C编写&#xff0c;并提供Python绑定&#xff0c;旨在帮助研究人员和工程师在大规模数据集上进行快速的相似性搜索和聚类操作。 一、介绍&#xff1a; Faiss的核心功…

OSPF认证方式,ISIS简介,ISIS路由器类型

OSPF&#xff1a;转发&#xff0c;泛洪&#xff0c;丢弃

ROS 2边学边练(33)-- 写一个静态广播(C++)

前言 通过这一篇我们将了解并学习到如何广播静态坐标变换到tf2&#xff08;由tf2来转换这些坐标系&#xff09;。 发布静态变换对于定义机器人底座与其传感器或非移动部件之间的关系非常有用。例如&#xff0c;在以激光扫描仪中心的坐标系中推理激光扫描测量数据是最简单的。 这…

C++学习进阶版(一):用C++写简单的状态机实现

目录 一、基础知识 1、状态机 2、四大要素 3、描述方式 4、设计步骤 5、实现过程中需注意 &#xff08;1&#xff09; 状态定义 &#xff08;2&#xff09; 状态转换规则 &#xff08;3&#xff09; 输入处理 &#xff08;4&#xff09; 状态机的封装 &#xff08;5…

本地部署Docker容器可视化图形管理工具DockerUI并实现无公网IP远程访问——“cpolar内网穿透”

文章目录 前言1. 安装部署DockerUI2. 安装cpolar内网穿透3. 配置DockerUI公网访问地址4. 公网远程访问DockerUI5. 固定DockerUI公网地址 前言 DockerUI是一个docker容器镜像的可视化图形化管理工具。DockerUI可以用来轻松构建、管理和维护docker环境。它是完全开源且免费的。基…

路由过滤与引入

1、实验拓扑 2、实验要求 1、按照图示配置 IP 地址&#xff0c;R1&#xff0c;R3&#xff0c;R4 上使用 1oopback口模拟业务网段 2、运行 oSPF&#xff0c;各自协议内部互通 3、R1 和 R2 运行 RIPv2,R2&#xff0c;R3和R4在 RIP 和 oSPF 间配置双向路由引入,要求除 R4 上的业务…

基于51单片机的温度、烟雾、防盗、GSM上报智能家居系统

基于51单片机的智能家居系统 &#xff08;仿真&#xff0b;程序&#xff0b;原理图&#xff0b;设计报告&#xff09; 功能介绍 具体功能&#xff1a; 1.DS18B20检测温度&#xff0c;MQ-2检测烟雾、ADC0832实现模数转换&#xff1b; 2.按键可以设置温度、烟雾浓度阈值&#x…

【Java--数据结构】提升你的编程段位:泛型入门指南,一看就会!

前言 泛型是一种编程概念&#xff0c;它允许我们编写可以适用于多种数据类型的代码。通过使用泛型&#xff0c;我们可以在编译时期将具体的数据类型作为参数传递给代码&#xff0c;从而实现代码的复用和灵活性。 在传统的编程中&#xff0c;我们通常需要为不同的数据类型编写不…

10 JavaScript学习:函数

函数的概念 JavaScript中的函数是一段可重复使用的代码块&#xff0c;它接受输入&#xff08;称为参数&#xff09;&#xff0c;执行特定的任务&#xff0c;并返回一个值。函数可以被调用&#xff08;或者说被执行&#xff09;&#xff0c;并且可以接受不同的输入来产生不同的…

提升效率!微信自动统计数据报表,轻松实现!

在数字化时代&#xff0c;提高工作效率是每个人的追求。下面就给大家分享一个能够自动统计微信号运营数据的神器——个微管理系统&#xff0c;让大家无需手动整理和计算&#xff0c;提高工作效率&#xff01; 1、好友统计报表 它分为通讯录好友统计、新增好友统计和删除好友统…

python创建线程和结束线程

&#x1f47d;发现宝藏 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不住分享一下给大家。【点击进入巨牛的人工智能学习网站】。 python创建线程和结束线程 在 Python 中&#xff0c;线程是一种轻量级的执行单元&#xff…

Mysql 存在多条数据,按时间取最新的那一组数据

1、数据如下&#xff0c;获取每个用户最近的一次登录数据 思路1&#xff1a;order by group by 先根据UserIdLogInTime排序&#xff0c;再利用Group分组&#xff0c;即可得到每个User_Id的最新数据。 1 SELECT * FROM login_db l ORDER BY l.user_id, l.login_time DESC; 排…

【Linux】实现一个进度条

我们之前也学了gcc/vim/make和makefile&#xff0c;那么我们就用它们实现一个进度条。 在实现这个进度条之前&#xff0c;我们要先简单了解一下缓冲区和回车和换行的区别 缓冲区其实就是一块内存空间&#xff0c;我们先看这样一段代码 它的现象是先立马打印&#xff0c;三秒后程…