当前位置: 首页 > 科技观察

阿里专访:Java异常你能说多少?

时间:2023-03-20 20:32:43 科技观察

Java的异常,小伙伴们应该都比较熟悉,但是很多人只是简单的使用,并没有对Java的异常系统有一个全面全面的了解。今天老顾就来和大家一起学习一下JAVA异常。3W原则处处都有3W原则,JAVA异常也可以归纳为3W:what,where,whywhat对应异常类型:answedwhatwasthrowwhere对应异常堆栈轨迹:answeredwhereitwherewherewhy对应到异常信息:answer在上图中,我们可以看出为什么Throwable是异常的第一类,而Error和Exception是它的子类。Exception分为RuntimeException和非RuntimeException子类。Error和Exception的区别先来看看它们的概念定义:(1)Error:程序无法处理的系统错误,编译器不检查。Error表示程序无法处理的致命系统错误。一般是和JVM相关的问题,比如系统崩溃、内存溢出、方法调用栈溢出等,比如:经常遇到的StackOverflowError和OutOfMemoryError。这种错误是编译器不检查的,是在系统运行过程中发生的。这些错误是我们程序本身无法处理和预防的,建议遇到时直接停止并重启程序。(2)Exception:程序可以处理的异常,捕获后可以处理。异常可以被程序捕获,也可以被处理。我们应该尽量去处理,让程序继续运行,而不是停止程序。总结一下,Error是程序无法处理的错误,Exception是可以处理的异常。上图中的Exception中有两种类型的异常,我们来看一下。(1)RuntimeException:Unpredictable,程序应该自己避免什么是不可预测的?比如:数组下标越界,访问对象空指针等。这种异常我们在写程序的时候要尽量避免。也就是我们的程序员是可以避免的。比如空指针异常,我们在编程的时候要加上空指针判断,比如if(obj==null),这样就可以避免空指针异常。(2)Non-RuntimeException:Predictable,compiler-checkableexceptions可预见的,比如:当我们打开一个文件的时候,如果没有对该文件的引用。这种异常编译器会检查出来,必须处理。这也称为CheckedException异常类型责任。从责任的角度:Error属于JVM需要承担的责任。RuntimeException是程序应该承担的责任。非运行时异常(CheckedException)可检查异常是JAVA编译器应该承担的责任。上面的代码很直观。一点:我们看到Error和RuntimeException编译器不检查,但是CheckedException异常编译器检查,也就是我们的程序员必须捕获并处理它。那怎么处理呢?(1)try-catch方法使用try-catch方法来捕获这个异常,可以在catch代码段进行异常逻辑处理,这个要看实际业务。上面的代码是一个FileNotFound异常。根据这个类型,我们知道文件句柄不存在,那怎么办呢?例如:提醒用户文件不存在(2)抛出异常的方法在一个复杂的业务中,我们程序员编写的模块很可能会被其他程序员编写的模块引用。为了让其他程序员知道我们模块的异常并要求他们处理,我们可以使用抛出异常的方法。我们看一下上层调用的处理。我们看到抛出异常需要调用者来处理。处理方法是什么?其实就是上面说的try-catch或者继续向上抛。常见错误与异常(一)RuntimeExceptionNullPointerException-空指针引用异常ClassCastException-类型转换异常IllegalArgumentException-传递非法参数异常IndexOutOfBoundsException-下标越界异常NumberFormatException-数字格式异常(二)Non-RuntimeExceptionClassNotFoundException-指定的类不能被foundExceptionIOException-IO操作异常(3)ErrorNoClassDefFoundError-找不到类定义的异常StackOverflowError-深度递归导致栈耗尽抛出异常OutOfMemoryError-内存溢出异常总结在我们的系统开发中非常重要,尤其是当我们设计系统,我们需要定义我们系统自己的异常。这就需要对异常类型、异常代码、异常信息等进行统筹规划,才能起到很好的排查作用,便于抓包处理。

猜你喜欢