Java异常简介

it2025-11-26  4

1 异常概念

异常:指程序执行过程中,出现的非正常情况。 注意事项: 1.异常并不是语法错误。 2.异常本身是一个类,产生异常就是创建了一个异常对象并抛出,Java会做中断处理。

2 异常的框架

异常的根类是Throwable。 其下两个子类分别为Error和Exception。 Error:严重错误,无法通过处理的错误,只能避免。 Exception:异常,可以通过代码修正。 Throwable中有三个方法,方便描述异常的信息,分别为:

public void printStackTrace();//打印异常的详细信息。包含了异常的类型,异常的原因,还包括异常出现的位置,在开发和调试阶段,都得使用printStackTrace。 public String getMessage();//获取发生异常的原因。提示给用户的时候,就提示错误原因。 public String toString();//获取异常的类型和异常描述信息(不用)。

3 异常分类

编译期异常:编译期出现异常,不处理就会编译失败。 运行时异常:运行期检查异常,编译期不检查异常。一般可不处理(交由JVM虚拟机处理)

4 异常处理机制

Java异常的处理机制:抛出异常,捕捉异常。 抛出异常:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统。 捕捉异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器,通常最后都会交给JVM处理,中断程序。

5 异常的处理方式

5.1 抛出异常throw

throw关键字用来抛出指定的异常对象,可以是各种类型的异常。 格式:

throw new 异常类名(参数);

举例:

throw new NullPointerException("要访问的arr数组不存在"); throw new ArrayIndexOutOfBoundsException("该索引在数组中不存在,已超出范围"); throw new NullPointerException("空指针异常");

注意:对于空指针异常,有着相关的方法:Objects中有个判断对象是否为空的静态方法。其源码为:

public static<T> T requireNonNull(Tob j){ if(obj==null) throw new NullPointerException(); return obj; }

5.2 声明异常throws

声明异常:如果方法内通过throw抛出了编译时异常,而没有捕获处理,那么必须通过throws进行声明,让调用者去处理。关键字throws运用于方法声明之上,用于表示当前方法不处理异常,而是提醒该方法的调用者来处理异常(抛出异常). 使用格式:

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

注意事项: 如果声明的多个异常具有继承关系,则可只声明父类异常。

5.3 捕获异常try…catch

捕获异常:Java中对异常用try…catch进行捕获,可以对出现的异常进行指定方式的处理。 使用格式:

try{ 编写可能会出现异常的代码 }catch(异常类型e){ 处理异常的代码 //打印异常信息/继续抛出异常 }

5.4 finally代码块

finally:有一些特定的代码无论异常是否发生,都需要执行。另外,因为异常会引发程序跳转,导致有些语句执行不到,在finally代码块中存放的代码都是一定会被执行的。 例如如果在try中打开了某些资源,不论是否发生异常,资源都一定要被关闭,这部分代码就可以写在try中。 注意事项: 1.finally代码块需要配合try…catch使用。 2.finally代码块中不能有return语句。

5.5 多个异常的处理方式

多个异常处理有三种方式: 1.多个异常分别处理。 2.多个异常一次捕获,多次处理。 3.多个异常一次捕获,一次处理。 通常采用一次捕获,多次处理,格式:

try{ 编写可能会出现异常的代码 }catch(异常类型 Ae){try中出现A类型异常,就用该catch来捕获.处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }catch(异常类型 Be){try中出现B类型异常,就用该catch来捕获.处理异常的代码 //记录日志/打印异常信息/继续抛出异常 }

注意事项: 1.如果多个异常具有继承关系,则子类异常必须写在(catch)父类异常之前。 2.如果父类抛出了多个异常,子类重写父类方法时,抛出和父类相同的异常或者是父类异常的子类或者不抛出异常。 3.父类方法没有抛出异常,子类重写父类该方法时也不可抛出异常。此时子类产生该异常,只能捕获处理,不能声明抛出。

6 自定义异常

开发中总存在异常是没有被事先定义好的,所以需要自定义异常。 格式:

//有两种方式,分别定义不同性质的异常 public class 异常名 extends Exception { 构造方法 } //编译期异常 public class 异常名 extends RuntimeException { 构造方法 } //运行期异常
最新回复(0)