写代码可定不可能一点错误都没有,有的错误是自己的原因造成的,实际上代码还是能正常跑起来,就是业务上留了个很大的坑。但还有一些错误是代码会报错,影响操作流程的。
后者常见的有Error和Exception,代码出错,代码跑不下去。所以说先从认识两者开始。
一 Exception和Error
Exception和Error这两个类有共同的父类,就是Throwable类。而这个Throwable类是Java的异常处理一个重要组成部分,他是唯独一个可以throw和catch的,这个抛出或者捕获的能力是Throwable类在Java中独有的,是Java异常处理机制的重要基本的部分毫不为过。
那为什么还要分成Error和Excepeion这两部分,区别是什么?
Error是正常情况不会碰到的,不如说内存不够这些,常见的outOfMemery,StackOverFlow,虚拟机系统环境硬件等问题这些报错,除此之外还有一些匪夷所思的问题比如说:LinkageError以及他的子类NoClassDefFoundError这两个举例子:LinkageError报错是这样的,编译的时候A类和B类兼容的,彼此是连接的,但是运行的时候A类和B类不能兼容。NoClassDefFoundError则是编译的时候这个文件有,编译通过了,但是真正运行时找不到了这个文件。
Exception则是代码运行时出问题,可能是设备的原因的IO异常,也可能是运行时反射异常或者是代码有问题。有人分为分类为可检查和不可检查的。
所谓的可检查异常及时自己要显示抛出的,编译器就要检查的,不可检查就是常见的空指针异常,越界什么的(之前有一个老大说过空指针异常是最好解决的错误,当时的我还在茫茫多的空指针报错中不知所措)。实际上这些可以在代码中避免,比如说,少弄个null传参,哪怕是新建一个空的集合都比他强。
贴一张Throwable,Error和Exception的部分全家福
实际上自习看图的话,还是有很多收获的,首先是看Error分成了两类一种是LinkageError,这里我就叫他连接错误,出现不兼容连接不上的一般都是刚开始编译什么的通过了,但是真正用的时候出了问题,比较喜欢字节流编码等一些黑魔法来写代码的可能会遇到这种问题,一种是VirtualMachineError虚拟机错误,虚拟机是Java在各个平台使用的基础,基础都有问题那肯定是有错误。
Exception也是一样分为两类:IOException,IO异常,实际上很多事情最后的瓶颈都在IO上,存储设备,网络设备上等。比给的内存太小,带宽不行这些有的时候可以通过代码来,为什么内存不够,是不是你一次性请求的数据太多了来检查问题。或者通过“钞能力”来升级解决。RuntimeException是大家写代码遇见最多的,那空指针为例子,你上来就是给一个null,不出空指针才怪。
二 try catch
实际上我之前很少写try catch,一方面try catch有时候不需要,你代码处理好,多校验有时候就可以了,而且出了错可以在日志直接看。但是有时候try catch却是很必要的,比如我最近关于操作记录的需求。
这个try catch首先是用来捕获异常的,第二就是我们要避免异常情况出现,不要花费太多精力去写异常处理情况,举个例子,写代码出现空指针异常,最好的方式是去校验null的情况,遇到直接返回报错就可以。不要本末倒置,为了异常去写异常,你避免过滤掉对应情况,不应该为空你就限制不为空,给一个返回信息给前端就可以了。
要求操作的同时,记录统计设备详情,中间涉及到统计有时候不同的订单类型不同种类的设备确实很容易出现,参数太多导致一不注意就会报错,但是这并不是主流程,不能你记录不了你就不让交易继续,所以try catch就有用了,catch到异常,打印日志继续下一步
记住千万不要生吞异常,这根随随便便return是一样的遇到问题,查日志都没法查。
下面是一个try catch流程,你可以设想一下如果出问题,catch到异常什么都没做,基本什么异常信息都不会留下,所以try catch要注意打印日志什么的必须留下记录
public class TryCatchTest {
@Test
public void tryCatchTest(){
System.out.println(" ---------------- before catch exception -------------- ");
try {
List list = null;
List<String> addList = new ArrayList<>();
list.addAll(addList);
}catch (Exception e){
e.printStackTrace();
System.out.println(" error was catched ");
}
System.out.println(" ----------------after catch exception --------------- ");
}
最后抛一个小问题就是NoClassDefFoundError 和 ClassNotFoundException 有什么区别?实际上我已经说一大半了在上面。