【JavaSE】异常(Exception)

07-02 1628阅读

目录

  • 异常是什么
  • 异常的分类
  • 异常的处理方法
    • throw抛出异常
    • 异常的声明
    • 异常的捕获和处理
    • finally
    • 自定义异常类

      【JavaSE】异常(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);
         }
      
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]