当程序执行过程中有时会出现了不正常的情况,这种不正常的情况叫做异常。Java提供了异常的处理方式,Java把异常信息打印输出到控制台,供程序员参考,程序员看到异常信息后,可以对异常信息进行修改,让程序变得更加健壮。
1、异常信息是JVM打印的。
2、 Java语言中异常是以什么形式存在的呢?
* 异常在Java中是以类的形式存在的,每一个异常类都可以创建异常对象。
* 类是模板,对象是实际存在的个体。
举个简单的例子:
书包丢了(异常类)
昨天,小红的书包丢了(异常对象)
今天,小明的书包丢了(异常对象)
明天, 小花的书包丢了(异常对象)
3、以下代码进行简单的了解:
public class Test3 {
public static void main(String[] args) {
int a = 10;
int b = 0;
//JVM执行到此处的时候,会new异常对象:ArithmeticException: / by zero
//并且JVM将new的异常对象抛出,打印输出信息到控制台了
int c = a / b;//出现异常
//这句无法执行,以为JVM终止了程序的执行
System.out.println("Hello World");
}
}
4、异常在Java中以类和对象的形式存在,那么异常的继承结构是怎样的?
Object
Object 下有 Throwable
Throwable 下有两个分支:Error (不可处理,直接退出)和 Exception (可处理的)
Exception 下有两个分支:
Exception 的直接子类:编译时异常(要求程序员在编写程序阶段必须对这些异常进行预处理)
RuntimeException (运行时异常)
注:异常都是在运行阶段发生的,因为只有程序运行阶段才可以new对象,异常的发生就是new异常对象。
5、编译时异常和运行时异常的区别?
* 编译时异常一般发生的概率比较高。举个例子,出门前发现下雨,不打伞的话会发生生病异常,但是如果出门拿伞(即在异常发生之前进行预处理),就可以避免异常的发生。因此编译时异常需要进行预处理
* 运行时异常一般发生的概率比较低。比如出门被飞机砸到,也会出现异常,但这种异常概率很低,不需要进行预处理。
6、运行时异常还有其他名字:
非受检异常 非受控异常
7、Java中对异常的处理方式有两种:
* 在方法声明的位置上,使用throws关键字。(抛给上一级,谁调用我,我就抛给谁)
* 使用try......catch语句进行异常的捕捉.(这件事发生了谁也不知道,因为被我捕捉了)
注:Java中异常发生之后如果一直上抛,最终抛给了main方法,main方法继续上抛,抛给了调用者JVM,JVM知道这个异常发生,只有一个结果,就是终止JVM的执行.
通过以下代码进行进一步的了解:
第一种处理方法:
public class Test5 {
//第一种处理方法:在方法声明的位置上继续使用 throws ,来完成异常的继续上抛,抛给调用者
//上抛类似于推卸责任,继续把异常传给调用者
public static void main(String[] args) throws ClassNotFoundException {
doSome();
}
public static void doSome() throws ClassNotFoundException{
System.out.println("doSome");
}
}
第二种处理方法:
public class Test6 {
//第二种处理方法:try...catch 行捕捉
//捕捉相当于把异常拦下来,意味着真正解决了异常
public static void main(String[] args){
try {
doSome();
} catch (ClassNotFoundException e) {
e.printStackTrace();
}
}
public static void doSome() throws ClassNotFoundException{
System.out.println("doSome!!!");
}
}
注:一般不建议用throws,因为这个异常如果真正的发生了,一定会抛给JVM,JVM只有终止程序,一般main方法中的异常建议使用try......catch语句进行异常的捕捉,main就不要继续上抛了.
8、只要异常没有捕捉,采用上报的方式,此方法的后续代码不会执行.
try语句块中的某一行出现异常,该行后面的代码不会执行,try......catch捕捉异常之后,后续代码可以执行.
9、try......catch的深入:
* catch后面的小括号中的类型可以是具体的异常类型,也可以是该类型的父类型。
* catch可以写多个,建议catch的时候,精确到一个一个处理,这样有利于程序的调试。
* catch写多个的时候,从上到下,必须遵守从小到大。