Kknock

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

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语句块去释放占用的资源。

posted on 2021-03-17 22:45  Kknock  阅读(130)  评论(0)    收藏  举报