活动地址:CSDN21天学习挑战赛
学习的最大理由是想摆脱平庸,早一天就多一份人生的精彩;迟一天就多一天平庸的困扰。各位小伙伴,如果您:
想系统/深入学习某技术知识点…
一个人摸索学习很难坚持,想组团高效学习…
想写博客但无从下手,急需写作干货注入能量…
热爱写作,愿意让自己成为更好的人…
…
不可变集合
不可变集合就是不可被修改的集合,集合的数据项在创建的时候提供,并且在整个生命周期中都不可变。否则报错。
为什么要创建不可变集合?
如果某个数据不能被更改,把它防御性的拷贝到不可变集合中是个很好的选择,或者当集合对象被不可信的库调用时,不可变形式是安全的。
如何创建不可变集合?
List、Set、Map接口中,都存在of方法可以创建不可变集合。
异常处理
什么是异常?
异常是程序在“编译”或者“执行”过程中可能出现的问题,注意:语法错误不算在异常体系中。
常见异常比如:数组索引越界、空指针异常、日期格式异常等。
为什么要学习异常?
异常一旦出现,如果没有提前处理,程序就会退出JVM虚拟机而终止。
研究异常并且避免异常,然后提前处理异常,体现的是程序的安全,健壮性。
异常体系
Throwable包含Error、Exception
Exception包含RuntimeException以及除RuntimeException之外所有的异常
Error:系统级别问题,JVM退出等,代码无法控制
Exception:java.lang包下,称为异常类,它表示程序本身可以处理的问题。
RuntimeException及其子类:运行时异常,编译阶段不会报错。(空指针异常,数组索引越界异常)
除RuntimeException之外的所有异常:编译时异常,编译器必须处理的,否则程序不能通过编译。(日期格式异常)
运行时异常,在编译成class文件不需要处理,在运行字节码文件时可能出现的异常,运行时异常编译阶段不会出错,是运行时才可能出错的,所以编译阶段不处理也可以。建议在最外层调用处集中捕获处理即可。
常见的运行时异常:
数组索引越界异常:ArrayIndexOutOfBoundsException
空指针异常:NullPointerException
数字操作异常:ArithmeticException
类型转换异常:ClassCastException
数字转换异常:NumberFormatException
运行时异常:一般是程序员没有考虑好或者是逻辑不严谨引起的程序错误,程序员水平不行。
编译时异常:是在编译成class文件时必须要处理的异常,也称之为受检异常
编译时异常的作用:担心程序员水平不行,在编译阶段就爆出一个错误,目的在于提醒不要出错。
编译时异常的处理形式:
出现异常直接抛出去给调用者,调用者也继续抛出去
出现异常自己捕获,不麻烦别人
前两者结合,出现异常直接抛出去给调用者,调用者捕获处理
异常处理方式1——throws
throws:用在方法上,可以将方法内部出现的异常抛出去给本方法的调用者处理
这种方式并不好,发生异常的方法自己不处理异常,如果异常最终抛出去给虚拟机将引起程序死亡。
抛出异常格式:
方法 throws 异常1,异常2,异常3…{
}
规范做法:
方法 throws Exception{
}//代表可以抛出一切异常
异常处理方式2——try…catch…
监视捕获异常,用在方法内部,可以将方法内部出现的异常直接捕获处理。
这种方法还可以,发生异常的方法自己独立完成异常的处理,程序可以继续往下执行。
格式:
try{
//监视可能出现异常的代码
}catch(异常类型1 变量){
//处理异常
}catch(异常类型2 变量){
//处理异常
}…
建议格式:
try{
//可能出现异常的代码
}catch(Exception e){
e.printlStackTrace();//直接打印异常栈信息
}
Exception可以捕获处理一切异常类型
异常处理方式3——前两者结合
方法直接将异常通过throws抛出去给调用者,调用者收到异常后直接捕获处理
总结:
在开发中按照规范来说第三种方式是最好的:底层的异常抛出去给最外层,最外层集中捕获处理
实际应用中,只要代码能够编译通过,并且功能完成,那么每一种异常处理方式似乎也都是可以的。