1.Error和Exception
1)异常(Exception)是软件运行过程中产生的异常情况,如文件丢失或网络中断等,出现异常时若无特殊处理则程序立即终止,这会影响正常的程序执行流程,所以需要我们根据异常类型作出合理的处理以免程序中止或崩溃。
0作被除数 就是程序中可能出现的特殊情况,这就称之为Exception,需要特殊处理。
Exception分支中有一个常见的子类RuntimeException(运行时异常),其下有:
a. ArrayIndexOutOfBoundsException(数组下标越界)
b. NullPointerExcepetion(空指针异常)
c. ArithmeticException(算术异常)
d.MissingResourceException(资源缺失)
e.ClassNorFoundException(类丢失)
Exception一般是由程序逻辑错误引起的,所有在编写代码时要从逻辑上考虑周到,尽可能避免这些情况的发生。
可以通过程序阻止和处理,这也是不同于Error错误类型的一个重要特点。
2)错误(Error)是指Java虚拟机生成并抛出的一种错误,比如栈溢出、内存耗尽等错误,大多数的错误与代码编写者所执行的操作无关,在应用程序的控制和处理能力之外,绝大多数是程序运行时不可出现的状态。
错误一旦出现就可能造成严重的后果,我们在编写程序时要尽量避免错误的出现。
比如,OutrOfMemoryError:JVM不再有继续执行操作所需的内存资源,此时JVM一般会选择线程终止。
在Java中,异常是被当做对象来进行处理,同时定义了一个基类java.lang.Throwable作为所有异常的超类。
Java API中定义了许多异常类,分为两大类:错误Error和异常Exception。

2.捕获和抛出异常
捕获和抛出是Java中处理异常的两种动作。捕获是主动获取程序中的异常并对其进行相应操作进行处理,而抛出是通过某些条件主动抛出异常供调用者进行不同操作。
主要涉及到的关键字有5个,分别如下:
1)try:提供代码区,在该代码区中检测异常情况;
2)catch:主动捕获异常,catch()括号内为不同的异常情况,以此进行不同操作来处理;
3)finally:在try-catch处理之后的最终处理,常用于进行一些善后操作,比如IO类中的资源回收等(Scanner.close());
4)throw:编写程序时我们可能已经知道这部分代码段会出现异常,我们可以根据条件主动抛出异常类型(throw new XXException(););
5)throws:主要用于方法中(public void test(int a, int b) throws XXXException{}),当方法中出现XXXException异常时抛出,转到上层方法再去处理。
代码示例:

结果1:正常计算

结果2:除数为0

结果3:计算结果为负数

注意点:
1)异常和错误的分类和包含情况如下图所示,throwable范围最大。
在使用catch关键字时,要注意从上到下异常范围为从小到大,否则会编译报错(即部分异常无法到达);
throws关键字时要注意Exception的包含情况,方法只会抛出throws关键字之后的异常。

2)ctrl+alt+t 可以快速配置try-catch异常捕获;
3)可以通过printStackTrace方法来打印Exception或Error信息。
3.自定义异常及经验小结
一般情况下,Java内部已经定义很多异常,已经基本上满足了我们日常需求,但当我们设计开源框架或者大型系统时,可能需要自定义一些异常类型供系统调用。自定义异常类,只需要新建一个类继承Exception类即可
自定义异常类的使用步骤:
1)创建自定义类;
2)在方法中通过throw关键字抛出异常对象;
3)如果在当前方法中处理异常,则通过try-catch语句捕获并处理;否则在方法的声明处通过throws关键字指明要抛出给方法调用者的异常,再出现异常方法的方法调用者中捕获该异常并进行处理
代码示例:

结果:

当num为2时,结果:
异常的经验小结:
1)处理运行时异常,主要通过逻辑去合理规避并辅助用try-catch处理;
2)在多重catch块后面,可以加入一个catch(Exception)来处理可能被遗漏的异常;
3)对于不确定的代码也加入try-catch,处理潜在的异常;
4)尽量对异常去进行处理,而不是简单地调用 printStackTrace()去打印输出;
5)具体如何处理异常要根据业务需求、使用场景和异常类型具体分析;
6)尽量添加finaly语句块去释放占用的资源。
浙公网安备 33010602011771号