今天我在进行技术互问时,老师突然问了我一个附加问题——怎样避免递归时内存溢出的现象,我在网上找到了递归终止条件: 1. 添加递归深度参数到递归函数的参数中 每次调用深度加一,在函数体中添加条件语句,当深度超过某个值时强行return; 2. 引入元素栈结构,每次递归的一些需要记录的内容,通常会压入栈中,适当的时候再弹出 在函数体中,添加条件语句,判断栈大小或者栈元素,达到条件时进行return;可能还会有别的方法,将这些方法用在递归中可以很好地解决内存溢出问题。
下面开始今天学习内容的复盘...
1.Date类
首先,计算机时间原点是1970年1月1日00:00:00。Date类代表了一个特定的时间,精确到毫秒。Date类的一个方法是public Date()用来分配一个Date对象,并初始化,以便它代表它被分配的时间,精确到毫秒。第二个方法是public Date(long date)用来分配一个 Date对象,并将其初始化为表示从标准基准时间起指定的毫秒数。
2.SimpleDateFormat类
SimpleDateFormat是一个具体的类,用于以区域设置敏感的方式格式化和解析日期。SimpleDateFormat类的常用方法:(1)public SimpleDateFormat()用于构造一个SimpleDateFormat,使用默认模式和日期格式。(2)public SimpleDateFormat(String pattern)用于构造一个SimpleDateFormat使用给定的模式和默认的日期格式。(3)public final String format(Date date)用于将日期格式化成日期/时间字符串(4)public Date parse(String source)用于从给定字符串的开始解析文本以生成日期
3.Period
方法名 | 说明 |
---|---|
public static Period between(开始时间,结束时间) | 计算两个“时间"的间隔 |
public int getYears() | 获得这段时间的年数 |
public int getMonths() | 获得此期间的总月数 |
public int getDays() | 获得此期间的天数 |
public long toTotalMonths() | 获取此期间的总月数 |
4.Duration
方法名 | 说明 |
---|---|
public static Durationbetween(开始时间,结束时间) | 计算两个“时间"的间隔 |
public long toSeconds() | 获得此时间间隔的秒 |
public int toMillis() | 获得此时间间隔的毫秒 |
public int toNanos() | 获得此时间间隔的纳秒 |
5.异常的体系结构图
6.编译时异常和运行时异常的区别
编译时异常:都是Exception类及其子类。必须显示处理,否则程序就会发生错误,无法通过编译。
运行时异常:都是RuntimeException类及其子类。无需显示处理,也可以和编译时异常一样处理。
7.throw抛出异常
格式:throw new 异常();
注意:这个格式是在方法内的,表示当前代码手动抛出一个异常,下面的代码不用再执行了
throws和throw的区别:
throws | throw |
---|---|
用在方法声明后面,跟的是异常类名 | 用在方法体内,跟的是异常对象名 |
表示声明异常,调用该方法有可能会出现这样的异常 | 表示手动抛出异常对象,由方法体内的语句处理 |
8.try-catch方式处理异常
定义格式:
try { 可能出现异常的代码; } catch(异常类名 变量名) { 异常的处理代码; }
执行流程:(1)程序从 try 里面的代码开始执行(2)出现异常,就会跳转到对应的 catch 里面去执行(3)执行完毕之后,程序还可以继续往下执行
注意:
-
如果 try 中没有遇到问题,怎么执行?
会把try中所有的代码全部执行完毕,不会执行catch里面的代码
-
如果 try 中遇到了问题,那么 try 下面的代码还会执行吗?
那么直接跳转到对应的catch语句中,try下面的代码就不会再执行了 当catch里面的语句全部执行完毕,表示整个体系全部执行完全,继续执行下面的代码
-
如果出现的问题没有被捕获,那么程序如何运行?
那么try...catch就相当于没有写.那么也就是自己没有处理. 默认交给虚拟机处理.
-
同时有可能出现多个异常怎么处理?
出现多个异常,那么就写多个catch就可以了. 注意点:如果多个异常之间存在子父类关系.那么父类一定要写在下面