目录
1、异常的概述
Java程序在执行过程中发生的不正常情况,而导致JVM非正常终止的情况,就叫做“异常”
注:异常并非指是语法错误和逻辑错误,而是语法错了,编译无法通过,程序无法运行,无法产生相应的节码文件。
2、异常的作用
Java异常机制可以使程序中“异常代码”和“正常代码”分离,保证程序代码更加优雅,提高程序的健壮性(java将该异常信息打印输出在控制台,供程序员参考,程序员看到异常信息之后,可以对 程序进行更改,从而使程序更加健壮)
3、异常的体系结构
3.1、java异常体系
Java把异常当作对象来处理,并定义一个基类java.lang.Throwable作为所有异常的超类。
(1)、在Throeable类中定义了两个直接子类:Error(错误)和Exception(异常)
(2)、异常类Exception又分为运行期异常和编译期异常
- 编译期异常:(即checked异常、受检异常):在代码编译阶段,编译器就能明
确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,例如:FileNotFoundException(文件找不到异常)、日期格式化
- 运行时期异常:(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免。如:IndexOutOfBoundsException(数组越界异常)、ClassCastException(类型转换异常)、NumberFormatException(数字格式化异常)、NullPointerException(空指针异常)、ArithmeticException(算术异常)等
- 注:java.lang.RuntimeException类及它的子类都是运行时异常。比如:
ArrayIndexOutOfBoundsException数组下标越界异常,ClassCastException类型转换异常。
3.2、Error与Erxception
(1)、Error错误:这种错误无法处理,是属于Java运行时系统的内部错误和资源耗尽或者Java虚拟机无法解决的严重问题,如系统崩溃,虚拟机出错误等,一般不编写针对性的代码进行处理。因为捕获了也解决不了,这个不是由程序产出的,而是底层出现问题,如果出现这样的内部错误,除了尽力使程序安全地终止之外,再也无能为力了。(如:如堆溢出(OutOfMemoryError)、线程死亡(ThreadDeath)、栈溢出(StackOverflowError等)
(2)、Exception:因编程错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。
3.3、异常处理方式
Java的异常处理是通过5个关键字来实现的:try、catch、 finally、throw、throws
- try
检测不安全的代码块(发现异常)try块中任何一条语句发生了异常,下面的代码将不会被执行,程序将跳转到异常处理代码块中,即catch块。因此,不要随意将不相关的代码放到try块中,因为随时可能会中断执行。 catch把抓到的类型匹配的异常捕获,保证程序能继续运行下去catch语句必须紧跟着try语句之后,称为捕获异常,也就是异常处理函数,一个try后面可以写多个catch,分别捕获不同类型的异常,要从子类往父类的顺序写,否则有编译错误。捕获异常的有关信息:getMessage() :获取异常消息信息,返回字符串printStackTrace(): 获取异常类名和异常信息,以及异常出现在程序中的位置,返回值void。 finallyfinally该内容总是会执行的,只能有一个finally语句。 throws定义一个方法的时候可以使用throws关键字声明,表示此方法不处理异常,而交给方法调用处进行处理。 throw关键字用于显式抛出异常,抛出的时候是抛出的是一个异常类的实例化对象。
4、throws和throw的区别
throws:在方法声明后使用,后面跟的是异常类名
throw:在方法声明体内使用,后面跟的是异常类对象
public void exam () throws Exception { // 用在方法声明后,后跟 异常类名 int x = 5; int y = 0; if(y == 0){ throw new MyException(); // 用在方法体内,后跟 异常类对象名 }else { System.out.println(x / y); } }
区别2:
throws: 可以跟多个异常类名,用逗号隔开
throw: 只能抛出一个异常对象名
public static void main(String[] args) throws ArithmeticException, Exception { // 后面可以有多个异常类名 int x = 5; int y = 0; if(y == 0){ throw new MyException(); // 只能有一个异常类对象名 }else { System.out.println(x / y); }
区别3:
throws:表示抛出异常,由该方法的调用者来处理
throw:表示抛出异常,由该方法体内的语句来处理
public static void main(String[] args) { try{ print(); // 由该方法的调用者来处理 }catch (ArithmeticException e){ e.printStackTrace(); } } public static void print() throws ArithmeticException{ int x = 5; int y = 0; if(y == 0){ throw new ArithmeticException(); //由该方法体内的语句来处理 }else { System.out.println(x / y); } }
区别4:
throws:表示有出现异常的可能性,并不一定出现这些异常
throw:表示抛出了异常,执行throw则一定出现了某种异常
public static void main(String[] args) { try{ print(); // 由该方法的调用者来处理 }catch (ArithmeticException e){ e.printStackTrace(); } } public static void print() throws ArithmeticException{ int x = 5; int y = 0; if(y == 0){ throw new ArithmeticException(); //由该方法体内的语句来处理 }else { System.out.println(x / y); } }
总结:
throws:用来声明一个方法可能产生的所有异常,不做任何处理,而是将异常上传,谁点,将 异常抛给调用者
用在方法声明的后面,跟的是异常类名
可以跟多个异常类名,用逗号隔开
表示抛出异常,又该方法调用者处理
throws表示出现异常是一种可能性,不一定会发生异常
throw:用来抛出一个具体的异常类型
用在方法体内,跟的是异常对象名
只能抛出一个异常对象名
表示抛出异常,有方法体内的语句处理
throw抛出异常,执行throw则是一定发生可某种异常
5、final和finally的区别
final:是一个修饰符,表示最终的,通常用来修饰类、方法、变量,修饰变量通常与static关键字连用,表示一个常量(final修饰局部变量时,可以在定义时指定默认值,也可以不指定默认值)
final修饰的类不能被继承;
final修饰的方法不能被重写,但是却可以重载;
final修饰的变量不能被修改,只能赋值一次
例:
finally:是一个关键字,可以在try后使用,也可以与try - catch语句一起连用。在异常中无论程序是否发生异常,finally代码块是一定执行的,通常用来释放或者关闭一些必须执行的程序(如:磁盘文件、网络连接等),进行资源的清除工作,删除临时文件等。
6、java中常见的异常
注:只列出Java中常见的十九种异常
java.lang.NullPointerException | 空指针异常 |
java.lang.ClassNotFoundException | 类指定异常 |
java.lang.NumberFormatException | 字符串转换为数字异常 |
java.lang.IndexOutOfBoundsException | 数组下标越界异常 |
java.lang.IllegalArgumentException | 方法参数错误异常 |
java.lang.IllegalAccessException | 访问权限异常 |
java.lang.ArithmeticException | 数学算数异常 |
java.lang.ClassCastException | 类型转换异常 |
java.lang.FileNotFoundException | 文件未找到异常 |
java.lang.ArrayStoreException | 数组存储异常 |
java.lang.NoSuchMethodException | 方法不存在异常 |
java.lang.NoSuchFiledException | 文件访问异常 |
java.lang.EOFException | 文件结束异常 |
java.lang.InstantiationException | 对象实例化异常 |
java.lang.InterruptedException | 被中止异常(大多数在线程中遇到) |
java.lang.CloneNotSupportedException | 克隆不支持异常 |
java.lang.OutOfMemoryException | 内存溢出异常(内存不足异常) |
java.lang.NoClassDefFoundException | 未发现类异常 |
java.lang.NumberFormatException | 数字格式化异常 |