什么是异常,异常的分类有哪些?
Error
和Exception
的区别?常见运行时异常(
RuntimeException
)和检查型异常(CheckedException
) 有哪些?异常的机制(异常处理的流程)?
异常的使用方法(如何抛出异常,如何捕获异常,再次抛出异常)?
throws
,throw
,try
,catch
,finally
分别代表什么意义?什么是“异常链”?
怎么自定义异常?
Java 异常类有哪些的重要方法?
文章出处
背景介绍
抽象类和接口
内部类
修饰符
装箱拆箱
注解
反射
泛型
异常
集合
IO
字符串
其他
什么是异常
异常的分类
ArrayIndexOutOfBoundsException(数组索引越界异常)
NullPointerException(空指针异常)
ClassNotFoundException(找不到类异常)
IllegalArgumentException(非法参数异常)
SecurityException(安全性异常)
NoSuchMethodException(方法未找到抛出的异常)
ClassCastException(类型转换异常类)
NumberFormatException(字符串转换为数字抛出的异常)
IOException(操作输入流和输出流时可能出现的异常)
Java 异常核心
public class ExceptionTest {
public static void doWork() {
try {
int i = 10 / 0; //会抛出异常
System.out.println("i=" + i);
} catch (ArithmeticException e) { //捕获异常
//捕获 ArithmeticException
System.out.println("ArithmeticException: " + e);
} catch (Exception e) {
//捕获 Exception
System.out.println("Exception: " + e + ";又抛出了");
throw e; //再次抛出
} finally {
System.out.println("finally 执行到这了");
}
}
public static void mayHaveTroube() throws Exception { //throws
//do something
}
public static void main(String[] args) {
doWork();
}
}
ArithmeticException: java.lang.ArithmeticException: / by zero
finally 执行到这了
Process finished with exit code 0
1)异常处理机制
异常出现时,会像 Java 中其他对象的创建一样,使用 new 在堆上创建异常对象
然后终止当前的执行路径,并且从当前环境中弹出异常对象的引用
此时,异常机制接管程序,并开始**寻找一个恰当的地方继续执行程序**
这个恰当的地方就是异常处理程序,它的任务是将程序从错误状态中恢复,以使程序能要么换一种方式运行,要么继续下去。
2)抛出异常的方式
public static void mayHaveTroube() throws Exception { //throws
//do something
}
methodname throws Exception1,Exception2,..,ExceptionN {
//...
}
3)重新抛出异常
catch(Exception e){
System.out,println("An exception was thrown");
throw e;
}
如果是
Error
、RuntimeException
或它们的子类,那么不可使用throws
关键字来声明要抛出的异常,虽然编译可以通过,但是在运行时会被系统抛出。如果一个方法出现编译时异常,要么用
try-catch
语句捕获,要么用throws
子句声明将它抛出,否则会导致编译错误。仅当抛出了异常,该方法的调用者才必须处理或者重新抛出该异常。
调用方法必须遵循任何可查异常的处理和声明规则。若覆盖一个方法,则不能声明与覆盖方法不同的异常。声明的任何异常必须是被覆盖方法所声明异常的同类或子类。
4)捕获异常
try {
// 可能会发生异常的程序代码
} catch (Type1 id1){
// 捕获并处置try抛出的异常类型Type1
}
catch (Type2 id2){
//捕获并处置try抛出的异常类型Type2
}
catch(Exception e){
System.out.println("Caught an exception");
}
String getMessage()
String getLocalizedMessage()
String toString()
void printStackTrace()
void printStackTrace(PrintStream)
void printStackTrace(java.io.PrintWriter)
Throwable fillInStackTrace()
5)异常链
6)finally
在
finally
语句块中发生了异常。在前面的代码中用了
System.exit()
退出程序。程序所在的线程死亡。
关闭 CPU。
如何自定义异常
public class MyException extends Exception{
String deviceInfo; //记录一些核心信息
public MyException() {
}
public MyException(String message) {
super(message);
}
public MyException(String message, Throwable cause) {
super(message, cause);
}
public MyException(Throwable cause) {
super(cause);
}
}
public void test2() throws MyException {
//do something
throw new MyException("");
}
public void test3() {
//do something
try {
throw new MyException("");
} catch (MyException e) {
e.printStackTrace();
}
}
总结
异常类型回答了“什么”被抛出
异常堆栈跟踪回答了“在哪“抛出
异常信息回答了“为什么“会抛出
点击原文链接可以到组织的 Github 链接,欢迎关注!