10月27, 2020

JAVA异常整理

异常

Throwable

Throwable类是所有错误跟异常类的超类.

Exception

Exception异常类及其子类都是继承自Throwable类,用来表示java中可能出现的异常,并且合理的处理这些异常。

RuntimeException

RuntimeException类是运行异常类,继承自Exception类,它以及它的子类只能在运行过程中存在,当出现时,只能修改源代码,此异常无法处理。

特点:

   方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常

   运行时期异常一旦发生,需要程序人员修改源代码

Error

Error类是与Exception的平级的类,用来表示Java中存在的严重错误,只能通过修改代码来解决问题。

区别

Exception与Error区别:

Exception是指程序在编译或者运行时出现的某种异常问题,我们可以对异常进行某种处理,如果不处理异常的话,程序将会停止运行。

Error是指程序在运行时出现的严重问题,无法处理,程序将会停止运行,Error通常都是系统级别的问题,都是虚拟机jvm所在系统发生的,只能通过修改源代码解决问题。

异常的产生
  1. 运行或编译时产生异常。
  2. 创建异常类的对象。
  3. 声明异常类。
  4. 将异常类对象传给调用者(main()方法)处理。
  5. 调用者无法处理,再将异常类对象传给jvm虚拟机。
  6. jvm虚拟机将异常类的信息(名称、详细信息、异常所处的位置)打印在屏幕上,并且停止程序的运行。
抛出异常throw

在java中,提供了一个throw关键字,用来抛出一个指定的异常。

使用方法:

1.创建一个异常对象。封装一些提示信息

2.将这个异常告知调用者

使用格式:throw new 异常类名(参数);

声明异常throws

声明异常格式:

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

}

捕获异常try...catch...finally

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

语句格式:

ry {
     //需要被检测的语句。
}catch(异常类 变量) { //参数。
     //异常的处理语句。
}finally {
     //一定会被执行的语句。
}

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

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

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

捕获异常的组合方式
  1. try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。
  2. try catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。
  3. 一个try 多个catch组合: 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
  4. try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。
package learn.javase;
/**
 * 异常的抛出(throw)与声明(throws)
 * @author Jole
 *
 */
public class ThrowsDemo {
    public static void main(String[] args){
        String[] str = {};
//        System.out.println(throwT(null));
        System.out.println(throwT2(null));
    }

    public static int throwT(String[] arr) throws NullPointerException{
        if(arr==null) {
            throw new NullPointerException("数组不能为空!");
        }
        int num = arr.length;
        return num;
    }

    public static int throwT2(String[] arr){
        int num =0;
        try {
            num = arr.length;
        }catch(Exception e) {
            System.out.println(e.toString());
        }finally {
            System.out.println("hhhhh");
        }
        return num;
    }
}
自定义异常
package learn.javase;
/**
 * 自定义异常,需集成RuntimeException运行时异常
 * @author Jole
 *
 */
public class TrcyTest {

    public static void main(String[] args) {
        getEx(1);
    }

    public static void getEx(int ... num){
        for(int i : num) {
            if(i==1) {
                throw new TryDemoException("不能等于1");
            }
        }
    }

}

自定义异常需要继承RuntimeException

package learn.javase;
/**
 * 抛出异常  new 异常名称,继承RuntimeException运行时异常
 * @author Jole
 *
 */
public class TryDemoException extends RuntimeException{

    public TryDemoException(String s) {
        super(s);
    }
}
子父类异常
  1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。

    package learn.javase;
    /**
     * 子夫类异常
     * 1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。
     * 2. 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。
     * 3. 当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。
     * @author Jole
     *
     */
    public class ZifuException extends FuException{
    
        //抛出父类一样的异常
        public void method() throws RuntimeException {
    
        }  
        //抛出父类子异常
        public void method2() throws NullPointerException{
    
        }
    }

    父类:

    package learn.javase;
    
    public class FuException {
    
        public void method () throws RuntimeException {
    
        }
    }
  1. 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。

    package learn.javase;
    /**
     * 子类异常
     * @author Jole
     *
     */
    public class Zexception extends Fexception{
        //抛出父类全部异常
        public void method() throws NullPointerException, ClassCastException {
    
        }        
        //抛出父类异常中的一部分
    //    public void method() throws NullPointerException{
    
    //    } 
        //抛出父类异常中的一部分
    //    public void method() throws ClassCastException {
    
    //    } 
    }

    父类异常:

    package learn.javase;
    /**
     * 父类抛出多个异常
     * @author Jole
     *
     */
    public class Fexception {
         public void method () throws NullPointerException, ClassCastException{
    
         }
    }
  1. 当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

    package learn.javase;
    
    public class Zi extends Fu{
        //错误的方式,会报错。
        public void method() throws Exception {
    
        }
    }

    父类:

    package learn.javase;
    
    public class Fu {
        public void method (){
    
        }
    }

本文链接:https://www.yanxizhu.com/post/threadable.html

-- EOF --

Comments