袁艺

个人站

欢迎来到我的个人站~


异常

异常

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

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

异常的继承体系

Throwable: 它是所有错误与异常的超类(祖宗类)
	|- Error 错误
	|- Exception 编译期异常,进行编译JAVA程序时出现的问题
	|- RuntimeException 运行期异常, JAVA程序运行过程中出现的问题
运行时期异常的特点:
	方法中抛出运行时期异常,方法定义中无需throws声明,调用者也无需处理此异常
	运行时期异常一旦发生,需要程序人员修改源代码.

异常和错误的区别

  • 异常:指程序在编译、运行期间发生了某种异常,我们可以对异常进行具体的处理,如果不处理,程序将会结束运行。
  • 错误:指程序在运行期间发生了某种错误,Error通常没有具体的处理方式,程序将会结束运行。
    • Error一般都是系统级别的问题,都是jvm所在系统发生的,并反馈给jvm
    • 我们无法针对其处理,只能修正代码

异常产生的原因

例子:ArrayIndexOfBoundsException

异常

throw抛出异常

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

  1. 创建一个异常对象。封装一些提示信息(信息可以自己编写)。
  2. 需要将这个异常对象告知给调用者。通过关键字throw告知调用者。throw 异常对象;
  3. throw new 异常类名(参数);

例子:throw new NullPointerException(“要访问的arr数组不存在”); throw new ArrayIndexOutOfBoundsException(“该索引在数组中不存在,已超出范围”);

捕获异常

捕获异常格式: try {

//需要被检测的语句。

} catch(异常类 变量) { //参数。

//异常的处理语句。

} finally {

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

}

异常处理的组合方式

  • try catch finally组合:检测异常,并传递给catch处理,并在finally中进行资源释放。

  • try catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对异常进行捕获处理。

  • 一个try 多个catch组合 : 对代码进行异常检测,并对检测的异常传递给catch处理。对每种异常信息进行不同的捕获处理。 注意:这种异常处理方式,要求多个catch中的异常不能相同,并且若catch中的多个异常之间有子父类异常的关系,那么子类异常要求在上面的catch处理,父类异常在下面的catch处理。
  • try finally 组合: 对代码进行异常检测,检测到异常后因为没有catch,所以一样会被默认jvm抛出。异常是没有捕获处理的。但是功能所开启资源需要进行关闭,所有finally。只为关闭资源。

异常在方法重写中的注意点

  1. 子类覆盖父类方法时,如果父类的方法声明异常,子类只能声明父类异常或者该异常的子类,或者不声明。 ​

    例如
    class Fu {
    	public void method () throws RuntimeException {
    }
    }
    class Zi extends Fu {
    	public void method() throws RuntimeException { }  //抛出父类一样的异常
    	//public void method() throws NullPointerException{ } //抛出父类子异常
    }
    
    
  2. 当父类方法声明多个异常时,子类覆盖时只能声明多个异常的子集。 ​

    例如
    class Fu {
    	public void method () throws NullPointerException, ClassCastException{
    }
    }
    class Zi extends Fu {
    	public void method()throws NullPointerException, ClassCastException { }  		public void method() throws NullPointerException{ } //抛出父类异常中的一部分
    	public void method() throws ClassCastException { } //抛出父类异常中的一部分
    }
    
    
  3. 当被覆盖的方法没有异常声明时,子类覆盖时无法声明异常的。

    例如
    class Fu {
    	public void method (){
    }
    }
    class Zi extends Fu {
    	public void method() throws Exception { }//错误的方式
    }
    
    

Throwable异常类中常用的方法

  • getMessage()方法

    返回该异常的详细信息字符串,即异常提示信息

  • toString()方法

    返回该异常的名称与详细信息字符串

  • printStackTrace()方法

    在控制台输出该异常的名称与详细信息字符串、异常出现的代码位置

面试题

  1. throw 和throws 的区别是什么 throw 定义在方法中,后边跟的是异常对象 同时只能抛出一个异常对象 throws 定义在方法的声明上,后边跟的是异常的类型 后边同时可以跟多个数据类型
  2. finally 返回路径面试题 finally :在正常情况下,肯定执行的代码 在try中return,在finally中修改: //返回路径:每次碰到return就会在返回路径中临时存储这个被返回的值,无论方法内有任何的改变,返回路径中的这个值一致不变。
代码
public class Demo01 {
    
    public static void main(String[] args) {
            Test t  = new Test();
            int method = t.method();
            System.out.println(method);
    }
    }
    class Test{
     	public int method(){
    	int i = 0;
        try{
           	System.out.println(1/0);
        	return i;
        }catch(Exception e){
        	  e.printStackTrace();
        }finally{
        	i = 200;
        	System.out.println("我一定会运行");
        }
    	return i;
    }
    //返回路径:每次碰到return就会在返回路径中临时存储这个被返回的值,无论方法内有任何的改变,返回路径中的这个值一致不变。
}