2018-08-06Java中的异常捕获和Throw详细细节

异常的定义:

Java代码在运行时期发生的问题就是异常!

在Java中,把异常信息封装成了一个类!当出现了问题时,就会创建异常类对象并抛出异常相关的信息(异常信息,位置…)!

异常的继承关系:

Object-->Throwable-->Exception-->RuntimeException

//可以选中异常类型,然后Ctrl+T来查看继承关系!

     Throwable: 它是所有错误与异常的超类

         |- Error 错误

         |- Exception 编译期异常,进行编译JAVA程序时出现的问题

              |- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题

//内存溢出错误!

//数组越界异常,以上代码中arrint数组下标只到2,但是调用的方法中却用了下标3,因此发生数组越界异常!

当发生数组越界异常时,JVM会做两件事:

①   创建异常对象ArrayIndexOutOfBoundsException TestEx;

②   将异常对象抛给调用者(这里是get(arrint))!

③   JVM将错误对象抛给Main方法发现还是没有处理语句,继续往上抛给虚拟机(JVM),JVM会将异常信息以红字的方式打印在控制台以及结束程序!

Error:错误!

Exception:异常!

指程序在运行期间发生了某种错误,Error错误通常没有具体的处理方式,程序将会结束运行!往往都是系统级别的问题,都是JVM所在系统发生的,并反馈给JVM的,我们无法针对处理,只能修正代码!

在Java中,提供了一个Throw关键字,它用来抛出一个指定的异常对象:

①   创建一个异常对象,封装一些提示信息(信息可以自己编写)!

②   用Throw关键字将这个异常对象告知给调用者!

格式:

throw new 异常类名(参数);

//目前学到的RuntimeException的构造方法:

声明异常Throws:

将问题标识出来,报告给调用者!如果方法内通过Throw抛出了编译时异常,而没有捕获处理,那么必须通过Throws进行声明,让调用者去处理!

声明异常格式:

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

异常捕获:Java中对异常有针对性的语句进行捕获,可以对出现的异常进行指定方式的处理!

捕获异常格式:

try {

     //需要被检测的语句。

}

catch(异常类 变量) {

     //异常的处理语句。

}

finally {

     //一定会被执行的语句。

}

try:该代码块中编写可能产生异常的代码!

catch:用来进行某种异常的捕获,实现对捕获到的异常进行处理!

finally:有一些特定的代码无论异常是否发生,都需要执行!另外,因为异常会引发程序跳转,导致有些语句执行不到,而finally就是解决这个问题的,在finally代码块中存放的代码都是一定会被执行的!

//try-catch如果捕获到了异常,try-catch以下的代码是不会被执行的!

Try-Catch-Finally捕获异常的组合方式:

①   Try-Catch-Finally组合:检测异常,并传递给Catch处理,并在Finally中进行资源释放!

②   Try-Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理!对异常进行捕获处理!

③   一个Try多个Catch组合:对代码进行异常检测,并对检测的异常传递给catch处理,对每种异常信息进行不同的捕获处理!

④   Try-Finally组合:对代码进行异常检测,检测到异常后因为没有Catch,所以一样会被默认JVM抛出!异常是没有捕获处理的,但是功能所开启资源需要进行关闭,所有Finally只为关闭资源!

运行时期异常RuntimeException:

RuntimeException和他的所有子类异常,都属于运行时期异常!

方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常,运行时期异常一旦发生,需要程序人员修改源代码!

异常在方法重写中的细节:

①   子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明!

②   当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集!

③   当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的!

 

异常中常用的方法:

①   getMessage()异常类名和异常信息!

②   printStackTrace()打印异常详细信息!

③   toString()异常信息!

 

自定义异常:

格式:

Class 异常名 extends Exception{

//或者继承RuntimeException!

     public 异常名(){

        

}

     public 异常名(String s){

super(s);

}

}

//以上调用父类Exception的有参构造!

 

示例代码:

try{

     可能会发生异常的代码

}catch(异常对象 ex){

     处理语句

}finally{

     不管出不出现异常必须执行的语句

     一般写释放资源的语句

}

package com.oracle.errorexception;

public class Demo03{

     public static void main(String[] args) {

         int[] arr=null;

         try{

              int index=get(arr);

              System.out.println(index);

         }catch(NullPointerException ex){

              System.out.println(ex);

         }

     }

     public static int get(int[] arr) throws NullPointerException,ArrayIndexOutOfBoundsException{

         if(arr==null){

              throw new NullPointerException("数组为空");

         }

         if(arr.length<4){

              throw new ArrayIndexOutOfBoundsException("数组长度不够");

         }

         return arr[3]+1;

     }

}

//try中一旦发生异常,try中其余代码将不再执行,直接跳到catch进行异常捕获!

 

//RuntimeException及其子类不需要Throws!

 

package com.oracle.errorexception;

public class Demo04{

     public void eat() throws Exception{

        

     }

}

class Zi extends Demo04{

     //如果父类方法抛出异常,那么子类重写后的方法有两种选择:①不抛异常②抛异常,但是异常类型不能超越父类!

     //如果父类没有异常,子类重写后不能抛出异常!但是如果重写后的方法中调用了抛出异常的方法,只能Try-Catch

     public void eat(){

        

     }

}

原文地址:https://www.cnblogs.com/postgredingdangniu/p/9430921.html