Java 异常

Java 异常

异常分类

image

error:Java虚拟机无法解决的严重问题。如JVM系统内部错误、资源耗尽等严重情况,一般不编写针对性的代码进行处理。
exception:运行过程中发生了人们不希望发生的事件,可以使用针对性的代码进行处理。如空指针访问、数组角标越界。

Java源程序 –javac.exe–> 字节码文件 –java.exe–> 在内存中加载、运行类


编译时checked异常 运行时runtime异常
发生时机 执行javac.exe文件名时,可能出现的异常 执行java.exe文件名时,可能出现的异常
说明 只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。 Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。一般不处理运行时异常。
常见异常 Java.lang.ClassNotFoundException
Java.lang.NoSuchMetodException
Java.lang.IndexOutOfBoundsException
Java.lang.NullPointerException

异常处理机制

抛:程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个对应异常类的对象,并将此对象抛出给调用者,由调用者执行,异常处后续的代码将不会执行。

抓:异常的处理方式,try-catch-finally与throws

方法重写的规则之一:
子类重写的方法抛出的异常类型 <= 父类该方法抛出的异常类型
多态的时候处理了父类的异常,使用子类的该方法时抛出的异常比父类的小所以也可以处理。

开发中如何选择使用哪种方法?

  1. 如果父类被重写的方法没有throws处理异常,则子类重写的方法也不能用throws
  2. 递进关系(A->B->C)的方法调用中,各方法分别采用throws,整体集中try-catch
  3. 当前方法知道如何处理该异常,则用try...catch块来处理该异常。当前方法不知道如何处理,则在定义该方法是声明抛出该异常。

异常处理机制一:try-catch-finally

1.finally可选,一定会执行即使try-catch里面有异常或者return。
2.只会匹配一个catch,类似if-ifesle
3.若catch中的异常类型有子父类关系,则子类要写在父类的上面,否则报错。(先小再大,如果先大那么小的异常类型永远不会被匹配到)
4.在try结构中声明的变量,在出了try结构之后,就不能被调用。
5.像数据库连接、输入输出流、网络编程Socket等资源,JVM不能自动的回收,需要手动进行释放。此时的资源释放就需要声明在finally中
6.try-catch不会影响到后面的代码

try{
    //可能出现异常的代码
    //!!!!try内部异常后面的代码不会执行!!!!!
}catch(异常类型1 变量名1){
    /*
    String getMessage() 获取异常信息
    printStackTrace() 打印堆栈信息
    */
    e.getMessage();
    e.printStackTrace();
    //处理异常的方式1
}catch(异常类型2 变量名2){
    //处理异常的方式2
}finally{
    //try-catch执行完后执行
    //一定会执行的代码
}

由于try-catch是异常的最终解决方案,捕获到错误就去解决,所以不会影响到后面的代码。
如下代码的两个try-catch都会执行。

try{}catch(){

}
try{}catch(){

}

体会1:使用try-catch-finally处理编译时异常,使程序在编译时不会再报错,但是运行时仍可能报错,相当于将一个编译时可能出现的异常延迟到运行时出现。
体会2:开发中,由于运行时异常比较常见,一般不处理运行时异常。

异常处理机制二:throws + 异常类型

class ExceptionTest{
    //写在方法声明处,指明此方法执行时,可能会抛出的异常类型。
    public void method() throws 异常类型{
        //并没有捕获异常,只是将异常往上抛
        //真正的处理是try-catch
    }
	public static void main(String[] args){
		int index = 10;
		String str = "hello world"
		if(index>=str.length()){
			throw new StringIndexOutOfBoundsException();
		}
		else{
			str.substring(0,index);
		}
	}
}

throws的方法只是将异常抛给了方法的调用者,并没有真正将异常处理掉。

抛出异常有三种形式

  • throws:作用在方法上,用于定义方法可能抛出的异常
  • throw:作用在方法内,表示明确抛出一个异常
  • 系统自动抛出异常:如StackOverflowError,OutOfMemoryError

用户自定义异常

手动抛出异常

关于异常对象的产生:

①系统自动生成的异常对象
②手动的生成一个异常对象,并抛出throw (i)

运行时异常可以不用处理

//运行时异常可以不用处理
throw new RuntiomeException("有些有message参数")
//需要处理因为包含了编译时异常,可选throws或者try-catch-finally
throw new Exception("xx")

自定义异常类

//1.继承现有的异常结构RuntimeException、Exception
public class MyException extends RuntimeException{
//2.提供全局常量:serialVersionUID,唯一标识类
static final long serialVersionUID = -70343551545L;
//3.提供重载的构造器
public MyException(){

}
public MyException(String msg){
    super(msg);
}
}

throws和throw的区别

类型 位置 功能
throws 作用于方法上,后面跟异常类 声明方法运行过程中可能出现的异常,处理异常的一种方式
throw 作用于方法内,后面跟异常类 生成一个异常对象,抛出一个异常类的对象
posted @ 2022-01-03 21:19  rananie  阅读(33)  评论(0编辑  收藏  举报