1.程序的异常
- 在使用计算机语言进行项目开发过程中,即使程序员把代码写到尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码来避免的,(比如客户输入的格式问题,读取的文件是否存在).
- 异常 : 指程序在执行过程中,出现了非正常的情况,如果不处理将导致JVM的非正常停止.
- 异常并不是指的是语法错误或逻辑错误.语法错了,编译不通过,不会产生字节码文件,根本不会运行.代码逻辑错误,只是得不到自己想要的结果.
2.异常抛出机制
- java中把不同的异常用不同的类表示,一旦发生某种异常,就会创建该异常的对象,并且throw.程序员可以catch这个异常,并处理;如果没有catch异常,则可能导致程序异常终止.
3.对待异常
- 遇到错误终止程序运行.
- 程序员在编写代码时,充分考虑到各种可能发生的异常或错误,极力预防和避免.实在无法避免的,要编写相应的代码进行异常检测,以及异常处理,保持代码的健壮性.
4.异常体系
(1). Throwable
java.lang.Throwable类是程序执行过程中涉及到的异常的根父类.该类继承与java.lang.Object.
Throwable中的常用方法 :
- public void printStackTrace()打印异常的详细信息.包含了异常的类型,原因,出现的位置,在开发和调试阶段都得使用该方法.
- public String getMessage()获取异常发生的原因.
Throwable可分为Error和Exception两类,分别对应java.lang.Error和java.lang.Exception.
(2). Error : java虚拟机无法解决的严重问题.如JVM系统内部错误,资源耗尽的严重情况.一般不编写针对性的代码进行捕获.(考虑修改源代码)例如 : StackOverflowError和OutOfMemoryError.
(3). Exception : 其他因编程错误或偶然的外在因素导致的一般性问题,需要编写针对性代码进行捕获,使程序得以正常运行.例如 : 空指针异常,试图读取不存在的文件.
5.编译时期异常与运行时期异常
javac.exe java.exe
java源程序---------------->字节码文件-------------->在内存中加载类,运行类
(1). 编译时期异常(checked异常,受检异常) : 在代码编译阶段,编译器就能明确警示(代码下有红线)当前代码可能发生的异常(不非要是一定发生),并明确督促程序员提前编写处理他们的代码.如果程序员没有编写异常处理代码,则编译器判定编译失败.从而不能生成字节码文件.通常,这些异常不是由程序员的代码引起的,或者说不是靠简单判断就可以避免的.(如FileNotFoundException).
(2). 运行时期异常 (runtime异常,unchecked异常) : 在代码编译阶段,编译器完全不做任何检查.无论该异常是否会发生,都不会提醒报错.只有当代码真正运行跑起来以后确实发生了异常,他才会被发现.通常,这类异常是程序员的代码编写不当引起.
java.lang.RuntimeException类及其子类都是运行时异常.比如ArrayIndexOutOfBoundsException(角标越界一场).
//ArrayIndexOutOfBoundsException public void test1() { int[] a = new int[10]; //编译阶段未报错,但运行时会报错 System.out.println(a[10]); } //NullPointerException public void test2() { String str = null; str.toString(); } //ClassCastException public void test3() { Object obj = new String(); Date date = (Date) obj; } //NumberFormatException public void test4() { String str = "abc"; int i = Integer.parseInt(str); } //InputMismatchException public void test5() { Scanner scan = new Scanner(System.in); int num = scan.nextInt(); //假如输入了"abc"; }