异常
-
所有已实现的接口:
-
public class **Throwable**extends Objectimplements Serializable
Throwable
类是 Java 语言中所有错误或异常的超类。只有当对象是此类(或其子类之一)的实例时,才能通过 Java 虚拟机或者 Java throw
语句抛出。类似地,只有此类或其子类之一才可以是 catch
子句中的参数类型。
两个子类的实例,Error
和 Exception
,通常用于指示发生了异常情况。通常,这些实例是在异常情况的上下文中新近创建的,因此包含了相关的信息(比如堆栈跟踪数据)。
Throwable 包含了其线程创建时线程执行堆栈的快照。它还包含了给出有关错误更多信息的消息字符串。最后,它还可以包含 cause(原因):另一个导致此 throwable 抛出的 throwable。此 cause 设施在 1.4 版本中首次出现。它也称为异常链 设施,因为 cause 自身也会有 cause,依此类推,就形成了异常链,每个异常都是由另一个异常引起的。
导致 throwable cause 的一个理由是,抛出它的类构建在低层抽象之中,而高层操作由于低层操作的失败而失败。让低层抛出的 throwable 向外传播是一种糟糕的设计方法,因为它通常与高层提供的抽象不相关。此外,这样做将高层 API 与其实现细节关联起来,假定低层异常是经过检查的异常。抛出“经过包装的异常”(即包含 cause 的异常)允许高层与其调用方交流失败详细信息,而不会招致上述任何一个缺点。这种方式保留了改变高层实现而不改变其 API 的灵活性(尤其是,异常集合通过其方法抛出)。
导致 throwable cause 的另一个 cause 是,抛出它的方法必须符合通用接口,而通用接口不允许方法直接抛出 cause。例如,假定持久集合符合 Collection
接口,而其持久性在 java.io
的基础上实现。假定 add
方法的内部可以抛出 IOException
。实现可以与其调用方交流 IOException
的详细消息,同时通过以一种合适的未检查的异常来包装 IOException
,使其符合 Collection
接口。(持久集合的规范应该指示它能够抛出这种异常。)
Cause 可以通过两种方式与 throwable 关联起来:通过一个将 cause 看作参数的构造方法;或者通过 initCause(Throwable)
方法。对于那些希望将 cause 与其关联起来的新 throwable 类,应该提供带有 cause 的构造方法,并委托(可能间接)给一个带有 cause 的 Throwable
构造方法。例如:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw new HighLevelException(le); // Chaining-aware constructor
}
因为 initCause
方法是公共的,它允许 cause 与任何 throwable 相关联,甚至包括“遗留 throwable”,它的实现提前将异常链机制的附件应用到 Throwable
。例如:
try {
lowLevelOp();
} catch (LowLevelException le) {
throw (HighLevelException)
new HighLevelException().initCause(le); // Legacy constructor
}
Error
-
public class Error extends Throwable
Error
是 Throwable
的子类,用于指示合理的应用程序不应该试图捕获的严重问题。大多数这样的错误都是异常条件。虽然 ThreadDeath
错误是一个“正规”的条件,但它也是 Error
的子类,因为大多数应用程序都不应该试图捕获它。
在执行该方法期间,无需在其 throws
子句中声明可能抛出但是未能捕获的 Error
的任何子类,因为这些错误可能是再也不会发生的异常条件。
Exception
-
public class Exception
extends Throwable类
异常
及其子类是形式Throwable
指示合理的应用程序想要捕获的条件。异常
类和任何不是RuntimeException
的子类的子类都是检查异常 。 检查的异常需要在方法或构造函数的throws
子句中声明,如果它们可以通过执行方法或构造函数抛出,并在方法或构造函数边界之外传播。
throw关键字
public static int method(Integer integer){
/*if (integer==null){
throw new NullPointerException("传参异常");
}*/
Objects.requireNonNull(integer);
return integer;
}
throws关键字—声明异常
交给JVM处理——中断处理。
public static void method2(Integer integer) throws Exception {
if (integer==null){
throw new Exception("传参异常");
}
}
try...catch捕获异常
SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-DD");
Date parse = null;
try {//处理异常,后续代码可以执行。
parse = format.parse("2019-1208");
} catch (ParseException e) {
e.printStackTrace();
System.out.println(new Exception("解析异常"));
return;//结束方法
}
System.out.println("hahaha");
finally代码块
无论是否有异常都会执行finally代码块。