• 异常(Exception)


    异常是什么

    异常就是程序在进行时的不正常行为,就像之前数组时会遇到空指针异常(NullPointerException),数组越界异常(ArrayIndexOutOfBoundsException)等等。
    在java中异常由类来表示。

    异常的分类

    异常有一个顶层类Throwable;
    Throwable派生出两个子类Error,Exception;
    Error指的是Java虚拟机无法解决的严重问题,例如递归时一直开辟栈,导致栈溢出的错误。
    Exception也分为两种异常:编译时异常和运行时异常。

    编译时异常,这种异常顾名思义是在编译时候就会发生,这种异常要在程序中捕获声明才能让程序通过。
    例如在比较器文章这篇中要实现clone方法时要通过throws关键字声明CloneNotSupportedException异常才能正常使用。

    运行时异常,这种异常全在(RunTimeException)这个类和其子类之下,编译通过,运行报错,这种异常可以交给JVM处理。

    异常的处理方法

    异常的处理一般使用throw、try、catch、finally、throws这五个关键字。

    throw抛出异常

    在程序执行时,该语句引发异常,此时就可以通过throw抛出异常来告诉程序员原因。
    一般格式为throw new 异常类名("异常产生的原因"); 例如我们进行方法传参为数组时参数是null抛出空指针异常:

    public void printArray(int[] array){
    	if(null == array){
    		throw new NullPointException("数组传参为空null");
    	}else{
    		//
    	}
    }
    

    注意事项:
    1.异常的抛出必须是在方法的内部
    2.一旦异常抛出成功之后,在该语句之后的代码就不会执行了。就像上面写的else里面的语句不会执行了。
    3.抛出的异常必须是Exception的或其子类,编译时异常必须在后续代码中处理,运行时异常可以交给JVM处理。

    异常的声明

    异常的声明就是告诉这个方法会报哪些异常,然后在这个方法内部不用对异常处理,让后面使用这个方法时对异常进行处理。
    一般格式:

    修饰符 返回值类型 方法名(参数表列) throws 异常类型1,异常类型2...{
     
    }
    

    注意事项:
    1.格式不能变,一定是将声明放在参数表列后面,可以多个异常同时声明
    2.声明的异常必须是Exception的或其子类。如果声明的异常是具有父子类关系,只声明父类也可以

    异常的捕获和处理

    使用try-catch语句来对异常进行捕获和处理。
    使用格式:

    try{
    	//会产生异常的代码
    }catch(异常类型1 e){
    	//对异常的处理代码
    }catch(异常类型2 e){
    	//对异常的处理代码
    }
    

    注意事项:
    1.像前面一样如果try中抛出异常后还有代码就不会执行,
    2.catch语句之间就像if-else语句一样,只会执行其中一个异常,
    3.如果try中抛出异常被catch捕获并处理了那就会执行try-catch之后的语句,如果没有捕获到就不会执行
    4.如果两个异常是父子类,一定要把子类异常catch放在前面
    5.如果两个异常处理方式一样也可以用单竖杠 | 来处理catch(异常类型1 | 异常类型2 e){}但是这样就不知道具体是哪个异常了。

    finally

    这个语句是跟try-catch语句一起用的,这个语句的特点就是比catch先执行,里面常放一些资源关闭代码
    格式:

    try{
    	//会产生异常的代码
    }catch(异常类型1 e){
    	//对异常的处理代码
    }catch(异常类型2 e){
    	//对异常的处理代码
    }finally{
    	//资源关闭代码
    }
    

    try 或者 catch 中如果有 return 会在这个 return 之前执行 finally. 但是如果
    finally 中也存在 return 语句, 那么就会执行 finally 中的 return, 从而不会执行到 try 中原有的 return.

    自定义异常类

    异常本质就是一个类,然后继承于已有的异常类。在写自己的异常类时类名最后一个单词使用Exception更加规范
    格式:

    class NameException extends 异常类{
    	//
    }
    

    自定义异常类时一般继承Exception 或 RunTimeException。
    继承Exception默认是编译时异常,
    继承RunTimeException是运行时异常,
    在自定义异常类中一般会实现如下的一个构造方法,来报出什么原因导致异常:

    public NameException(String message) {
            super(message);
       }
    
  • 相关阅读:
    归并排序(java)
    进入nodejs 利用http模块搭建一个简单的服务器并配合fs模块网客户端传输文件
    pdf怎么压缩的小一点?
    金仓数据库KingbaseES客户端应用参考手册--18. oid2name
    c++推箱子小游戏
    线程池简单介绍
    mysql调优
    时间模块之datatime模块、os模块、sys模块、json模块、json模块实操
    整理下最近用canvas遇到的问题吧
    从经典学习 NLP:小白到大白:1. Word Tokenization
  • 原文地址:https://blog.csdn.net/yj20040627/article/details/139310856