当前位置: 首页 > news >正文

day17_异常

今日内容

上课同步视频:CuteN饕餮的个人空间_哔哩哔哩_bilibili
同步笔记沐沐霸的博客_CSDN博客-Java2301
零、 复习昨日
一、作业
二、异常
三、自定义异常

零、 复习昨日

见晨考

一、作业

package com.qf.homework;import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Date;/*** --- 天道酬勤 ---** @author QiuShiju* @desc*/
public class TestBirthday2 {// 变式扩展,输入身份证号确定截止今天是否成年/***  思路:*  1. 如果年份相减小于17,肯定未成年*  2. 如果年份相减大于18,肯定成年*  3. 如果年份相减等于18,还需要判断月份和日*/public static void main(String[] args) throws ParseException {printInfo("410112200502220104");}/*** 以身份证号输出个人信息*/public static void printInfo(String idStr) throws ParseException {// 校验身份证号规则(长度18位)if (idStr.length( ) != 18) {System.out.println("身份证号有误!");return;}// 410112202210250103String birthdayStr = idStr.substring(6, 14);// 字符串变日期SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date birthday = sdf.parse(birthdayStr);// 将日期转成日历Calendar calendar = Calendar.getInstance( );calendar.setTime(birthday);// 通过日历信息获得,年月日int year = calendar.get(Calendar.YEAR);int month = calendar.get(Calendar.MONTH) + 1;int day = calendar.get(Calendar.DAY_OF_MONTH);// System.out.println(year+"-"+month+"-"+day );// 获得当前时间Calendar now = Calendar.getInstance( );int nowYear = now.get(Calendar.YEAR);int nowMonth = now.get(Calendar.MONTH) + 1;int nowDay = now.get(Calendar.DAY_OF_MONTH);// System.out.println(nowYear+"-"+nowMonth+"-"+nowDay );boolean flag = false;// 先判断年份差值if (Math.abs(nowYear - year) > 18) {// System.out.println("成年" );flag = true;} else if (Math.abs(nowYear - year) < 18) {//System.out.println("未成年" );} else {if (month < nowMonth) {//System.out.println("成年" );flag = true;} else if (month > nowMonth) {//System.out.println("未成年" );} else {if (day <= nowDay) {//System.out.println("成年" );flag = true;} else {//System.out.println("未成年" );}}}if (flag) {System.out.println("成年" );} else {System.out.println("未成年" );}}
}

计算是否成年, 方案二: 毫秒值计算

变式题: 输入身份证号,计算该人在世多少天

二、异常

2.1 介绍

异常,就是程序出现的不正常的情况.

2.2 分类

在java程序设计中,关于异常有一大类,叫做Throwable
其下又有两个分类: Error,Exception

Error: 程序出现的严重问题,且只能抛出(throw),不能试图捕获(try catch)

Exception: 是程序出现的问题,可以捕获可以抛出

image-20230221110049534

ps: 编译期又叫 受检查异常,运行时异常又叫不受检查异常…

总结目前见过的异常

ArithmeticException 算术异常
ArrayIndexOutOfBoundsException 数组下标越界异常
NullPointerException  空指针异常
ClassCastException    类转换异常
StringIndexOutOfBoundsException 字符串下标越界
NumberFormatException 数字格式化错误
ParseException      解析异常

2.3 异常的产生

在代码内部使用throw 异常对象,来产生异常.

    public static void main(String[] args) {test();}public static void test() {System.out.println("xxx" );int a = 1;if(a > 0) {// 抛出一个异常对象throw new ArrayIndexOutOfBoundsException(  );//throw new ParseException("Unparseable date: ",1);//throw new FileNotFoundException( );//throw new 异常类();}}

2.4 编译期异常&运行期异常

运行期异常: 代码执行时可能会出错 , 程序中出现的运行时异常没有强制处理… ,默认采取抛出处理异常

编译期异常: 代码编译时可能会出错,程序中出现编译期异常,就会强制要求处理

2.5 异常的处理

异常的处理的只有两种方案:

  1. 抛出(throws)
  2. 试图捕获(try catch)

2.5.1 抛出

抛出: 是将异常在方法签名上声明抛出.

public void test() throws 异常类名,异常类名2,....{...
}

在方法参数列表后,使用throws 加 异常类名来声明抛出异常
且允许声明多个异常类,中间用逗号隔开

    // 声明抛出异常public static void test4() throws ParseException {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");Date date = sdf.parse("20220101");System.out.println("后续" );}

抛出异常,抛给谁? 谁调用这个方法,异常就抛出谁,那么这个调用者就要继续再处理异常…

抛出异常后,有什么影响? 抛出异常后,异常处后续代码不再执行!!!

总结

throwthrows
位置
后面
作用

handle 处理

2.5.2 试图捕获

试图捕获 try … catch…

try{// 可能会出现异常的代码
}catch(异常类名 e) {e.xxx();
}
----------
try里面包裹代码,如果其中代码出现异常,就会被catch抓住,需要抛出异常和catch后声明的异常同一类型才可以抓住,否则抓不住! 如果try里面的代码没有任何报错,catch内的代码不执行!----------
catch还可以同时声明多个异常类,特别强调不是同时抓多个异常对象!!因为根本就不可能产生多个异常对象,因为try内部一旦出现异常,try内部的后面不执行了... ----------
虽然可以同时声明多个异常类,但是很麻烦,一般可以直接写一个最大异常Exception    

无论try…catch代码有没有错误,其结构后面的代码一定会执行!!!

    // 捕获异常public static void test5() {SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try{Date date = sdf.parse("20220101");}catch (ParseException e) {System.out.println("日期解析出错!" );}System.out.println("后续会执行" );}

2.5.3 finally

try{// ...
}catch(Exception e) {// ... 
} finally{// ...
}
或者
try{// ...
} finally{// ...
}
        // SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");// try{//     Date date = sdf.parse("20220101");// }catch (ParseException e) {//     System.out.println("日期解析出错!" );// } finally {//     System.out.println("...最终的" );// }try{System.out.println(1 /0);} finally {System.out.println("...最终的" );}

finally这么设计的作用: 为了确保某些代码必须能执行到! 一般就用于释放资源!

扩展: 配合return一起实现一些特殊的效果…

2.6 异常的应用

应用1:
设计方法时,如果这个方法会经常调用,或者被多次多层调用,尽量自行捕获异常,不要抛出!因为一旦抛出,所有使用者都需要处理该异常!

应用2:
方法重写时子类抛出的异常范围 小于等于 父类的异常范围!
特殊的,父类方法没有异常,子类重写时也不能抛出异常!!!

2.7 异常的API

最大的父类Throwable类

// 构造方法
Throwable(String message) message就是异常信息// 方法  
String getMessage() 返回此 throwable 的详细消息字符串。 
void printStackTrace()  将此 throwable 及其追踪输出至标准错误流。 
    public static void test7() {//throw new ArithmeticException("这是算术异常");//System.out.println(1/0 );SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd");try {sdf.parse("2222/11/21");} catch (ParseException e) {// 将异常信息打印到控制台// e.printStackTrace( );String message = e.getMessage( ); // 获得异常信息System.out.println(message );}}

三、自定义异常

只有当对象是Throwable类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw 语句抛出
换句话,自定义异常需要继承Throwable类

一般继承的是Throwable的子类,
继承Error那就是有Error对应的特点,即不能捕获只能抛出!!
继承Exception,就是Exception对应的特点,可以抛出可以捕获!!!
继承RuntimeException那就是运行时异常的特点,可以不用主动处理!!
继承非RuntimeException及其子类那就是编译其异常的特点!

演示: 年龄越界异常

  1. 建类
  2. 继承
  3. 写构造方法
  4. 在方法内部使用异常(产生异常)
  5. 测试

四、总结

关于异常,以后常见的是Exception
Error基本见不到,一旦见到就是严重问题必须处理
需要分清楚编译期异常有哪些,运行时期异常有哪些
分清楚: 捕获异常,抛出异常有特点
自定义异常,在后续写项目时会用到最后,关于异常最简单的处理方案: 顺其自然
http://www.lryc.cn/news/15973.html

相关文章:

  • vue中把node-sass换成dart-sass方式(解决办法)
  • 深入浅出深度学习Pytroch
  • CCNP350-401学习笔记(451-500题)
  • 3年功能测试经验,面试想拿到15k很难吗?
  • 【7/101】101次面试之测试技术面试题
  • 【蓝桥杯每日一题】前缀和算法
  • 【C#基础】C# 常用数据结构
  • MySql 及MyBatis数据的批量操作
  • 无代码表格数据库——一个企业数字化新物种
  • 第十三届蓝桥杯国赛 C++ C组 F 题、Python B组 E 题——近似GCD(AC)
  • 分享5款小众良心软件,好用到让人惊艳
  • WAF是什么?一篇文章带你全面了解WAF
  • django项目实战八(django+bootstrap实现增删改查)进阶验证码
  • IP 协议
  • 好用的SQL工具盘点:从学习到工作总有一款适合你
  • Memcache介绍
  • PTA:C课程设计(1)
  • 第二十篇 ResNet——模型讲解
  • LeetCode经典算法题:矩阵中省份数量经典题目+三角形最大周长java多种解法详解
  • Vue3通透教程【一】Vue3现状—必然趋势?
  • 打破数据孤岛,Apache Doris 助力纵腾集团快速构建流批一体数仓架构|最佳实践
  • 什么是真正的骨传导耳机,骨传导耳机原理
  • [MySQL]基本数据类型及表的基本操作
  • 华为OD机试 - 好朋友(Python) | 机试题+算法思路+考点+代码解析 【2023】
  • SAP ABAP用程序给用户增加SAP_ALL权限
  • stm32f407探索者开发板(二十)——独立看门狗实验
  • C语言进阶(五)—— 多维数组
  • 06_MySQL多表查询
  • 程序员赚钱指南,兼职社区招募
  • Qt-FFmpeg开发-实现录屏功能(10)