16.Java语言中的异常体系以及异常处理

版权声明:原创,转载请说明,谢谢! https://blog.csdn.net/ajia5216/article/details/82632565

异常

指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止。

异常的根类是 java.lang.Throwable ,

其下有两个子类:java.lang.Error 与 java.lang.Exception

1.Throwable体系:

a).Error:严重错误Error,无法通过处理的错误,只能事先避免,好比绝症。

b).Exception:表示异常,异常产生后程序员可以通过代码的方式纠正,使程序继续运行,是必须要处理的。好比感冒、阑

尾炎。

2.Throwable中的常用方法:

a).public void printStackTrace() :打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和

调试阶段,都得使用printStackTrace。

b).public String getMessage() :获取发生异常的原因。提示给用户的时候,就提示错误原因。

3.异常(Exception)的分类:根据在编译时期还是运行时期去检查异常

a).编译时期异常:checked异常。在编译时期,就会检查,如果没有处理异常,则编译失败。(如日期格式化异常)

b).运行时期异常:runtime异常。在运行时期,检查异常.在编译时期,运行异常不会编译器检测(不报错)。

4.异常产生的过程解析

1).JVM执行到有异常的代码;

       2).JVM要识别出这种异常;

       3).JVM到类库中找到描述这个异常的“异常类”,并创建对象;

       4).判断我们的代码中是否希望“捕获这种异常”:

                     是:去执行“捕获异常的代码”;

                     否:在控制台打印异常信息,并结束程序(这是我们不希望看到的)

异常的处理

Java异常处理的五个关键字:try、catch、finally、throw、throws

1.方法内抛出异常throw

定义的方法,如需要接收参数,首先应对参数做判断是否合法,如果不合法告知调用处发生异常,那么就需要用到‘’

throw抛出异常

使用:创建一个异常对象。封装一些提示信息(信息可以自己编写)。通过throw抛给调用者

格式:throw new 异常类名(参数);        throw用在方法内,用来抛出一个异常对象

例如:throw new NullPointerException("要访问的arr数组不存在");

注意:如果throw抛出的是一个“运行期异常”,调用处可以不处理;如果不处理,报错程序退出。如果throw抛出了一

个“编译期异常”,方法声明处必须显示的使用throws声明此异常,并且调用处也必须处理(try..catch或者继续throws出

去),否则编译错误

 

2.捕获异常try…catch

       用来捕获异常,try里执行可能发生异常的代码,cathc里执行捕获异常信息。

  

3.try...catch...catch语句

       不确定异常类型,可以catch多个异常类型

注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。(比如:Exception异常应该写在下面的catch)

4.声明抛出异常throws

       如果方法内通过throw抛出了编译时异常,那么必须通过throws进行声明,让调用者去处理。关键字throws运用于方法声明之上

注意:如果throws后面的是“编译期异常”,调用的代码必须要使用try...catch...或者继续抛出,否则编译错误。如果throws后面的是“运行时异常”,调用处可以不处理,编译可以通过,但不建议。

5.异常的处理_try...catch...finally语句

       处理一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到的问题

       如果try或者catch里有return语句,return先执行一般,执行finally里的代码,再继续执行完return

6.常见异常:

       1).空指针异常:NullPointerException(运行时异常)

       2).数组下标越界异常:ArrayIndexOutOfBoundsException(运行时异常)

       3).数字转换异常:NumberFormatException(运行时异常)

       4).算术运算异常:ArithmeticException(运行时异常)

       5).转换异常:ParseException(编译期异常)--必须要捕获,否则编译错误

7.Objects类的非空判断

public static <T> T requireNonNull(T obj) :查看指定引用对象不是null。

方法源码做了判断,如果为null抛出异常,调用这个方法可以不用自己写抛异常

自定义异常

在开发中根据自己业务的异常情况来定义异常类.

异常类如何定义:

1. 自定义一个编译期异常: 自定义类 并继承于 java.lang.Exception 。

2. 自定义一个运行时期的异常类:自定义类 并继承于 java.lang.RuntimeException

然后像使用类库中的异常类一样使用

示例:

       1).定义异常类:

                public class AgeException extends Exception{
                                
public AgeException(String msg) {
                                      
super(msg);
                                 }
                           }

       2).使用异常类:

                public class Student {
                                  
private int age;

                                   
public void setAge(int age) throws AgeException {
                                         
if (age < 15 || age > 50) {
                                            
throw new AgeException("年龄错误,必须在1550岁之间!");
                                         }
                                         
this.age = age;
                                   }
                           }

       3).测试代码:

               public class Demo {
  
                               public static void main(String[] args) {
    
                                   Student stu = new Student();

     
                                  try {
          
                                   stu.setAge(100);
      
                                 } catch (AgeException e) {
      
                                       System.out.println("异常信息:" + e.getMessage());
     
                                 }

  
                             }
                          }

猜你喜欢

转载自blog.csdn.net/ajia5216/article/details/82632565
今日推荐