#top 写在最前面
水滴石穿,稳固基础,基础永远是最需要注重的
文章仅作为JAVA编程复习使用
文章参考博主:<遇见狂神说>、<生命是有光的>
8、异常
定义:程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常。
8-1、异常的分类和产生原因
- JAVA常把异常当做对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
- 在JAVA API中已经定义了很多异常类,总的分成两大类
- 错误 Error :无法预见,指的是JVM错误,这时的程序并没有执行,无法处理。
- 异常 Exception :可以预见,指的是程序运行中产生的异常,用户可以使用处理格式处理。
产生异常的原因:
- 用户输入了非法数据。
- 要打开的文件不存在。
- 网络通信时连接中断,或者JVM内存溢出。
这些异常有的是因为用户错误引起,有的是程序错误引起的,还有其它一些是因为物理错误引起的。
异常的执行流程
8-2、Exception异常
8-2-1、分类
-
编译时异常:继承自
Exception
的异常或者其子类,编译阶段就会报错 -
运行时异常:继承自
RuntimeException
的异常或者其子类,编译阶段不报错,但是运行阶段报错
8-2-2、常见的运行时异常(面试常问)
-
数组索引越界异常:
ArrayIndexOutOfBoundsException
-
空指针异常:
NullPointerExceptio
- 直接输出没有问题,但是调用空指针的变量的功能就会报错!
-
类型转换异常:
ClassCastException
-
迭代器遍历没有此元素异常:
NoSuchElementException
-
数学操作异常:
ArithmeticException
-
数学转换异常:
NumberFormatException
public class ExceptionDemo {
public static void main(String[] args) {
System.out.println("程序开始。。。。。。");
/** 1.数组索引越界异常: ArrayIndexOutOfBoundsException。*/
int[] arrs = {10 ,20 ,30};
System.out.println(arrs[2]);
// System.out.println(arrs[3]); // 此处出现了数组索引越界异常。代码在此处直接执行死亡!
/** 2.空指针异常 : NullPointerException。直接输出没有问题。但是调用空指针的变量的功能就会报错!! */
String name = null ;
System.out.println(name); // 直接输出没有问题
// System.out.println(name.length()); // 此处出现了空指针异常。代码在此处直接执行死亡!
/** 3.类型转换异常:ClassCastException。 */
Object o = "齐天大圣";
//Integer s = (Integer) o; // 此处出现了类型转换异常。代码在此处直接执行死亡!
/** 5.数学操作异常:ArithmeticException。 */
// int c = 10 / 0 ; // 此处出现了数学操作异常。代码在此处直接执行死亡!
/** 6.数字转换异常: NumberFormatException。 */
String num = "23aa";
Integer it = Integer.valueOf(num); // 此处出现了数字转换异常。代码在此处直接执行死亡!
System.out.println(it+1);
System.out.println("程序结束。。。。。。");
}
}
8-3、异常关键字
Java异常机制用到的几个关键字:try、catch、finally、throw、throws。
- try – 用于监听。将要被监听的代码(可能抛出异常的代码)放在try语句块之内,当try语句块内发生异常时,异常就被抛出。
- catch – 用于捕获异常。catch用来捕获try语句块中发生的异常。
- finally – finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
- throw – 用于抛出异常。
- throws – 用在方法签名中,用于声明该方法可能抛出的异常。**主方法上也可以使用throws抛出。**如果在主方法上使用了throws抛出,就表示在主方法里面可以不用强制性进行异常处理,如果出现了异常,就交给JVM进行默认处理,则此时会导致程序中断执行。
编译时异常的处理方式:
- 方式一:抛出异常
方法 throws Exception{
}
//在出现编译时异常的地方层层把异常抛出去给调用者,调用者最终抛出给JVM虚拟机,JVM虚拟机输出异常信息,直接干掉程序,这种方式与默认方式是一样的。虽然可以解决代码编译时的错误,但是一旦运行时真的出现异常,程序还是会立即死亡,这种方式并不好
-
方式二:捕获处理:在出现异常的地方自己处理,谁出现谁处理
try{ // 监视可能出现异常的代码 }catch{异常类型1 变量}{ // 处理异常 }catch{异常类型2 变量}{ // 处理异常 } //第二种方式,可以处理异常,并且出现异常后代码也不会死亡 //但是从理论上来说,这种方式不是最好的,上层调用者不能直接知道底层的执行情况!
-
方式三:在出现异常的地方把异常一层一层的抛出给最外层调用者,最外层调用者集中捕获处理
try{
// 可能出现异常的代码
}catch(Exception e){
e.printStackTrae(); //直接打印异常栈信息
}
//这种方案最外层调用者可以知道底层执行的情况,同时程序在出现异常后也不会立即死亡,这是理论上最好的方案。
8-4、finally关键字
- 用在捕获处理的异常格式中,放在最后面
- finally的作用:可以在代码执行完毕后进行资源的释放操作
try{
//可能出现异常的代码!
}catch{Exception e}{
e.printStackTrace();
}finally{
// 无论代码是出现异常还是正常执行,最终一定要执行这里的代码!!
}
- 资源都是实现了
Closeable
接口的,都自带close()
关闭方法 - try : 出现1次
- catch:出现0 - N 次(如果有finally那么 catch 可以没有)
- finally:出现0 - 1 次