@
目录一、前言
作者是一位自学JAVA的小白,通过网上视频学习和自己对JAVA核心思想一书的理解,现将自己对异常的认知描述如下:(希望能与各位同行好友共同分享自己所学的java知识,同时,也热切期望各位同行前辈能够帮助作者指出不足,让小白的编程技术能更上一层楼,感谢各位同行大佬。
二、异常与错误的基本理解
2.1 异常与错误的定义
异常: 程序执行过程中发生了不正常的情况。
异常(exceptional condition)是指阻止当前方法或作用域继续执行的问题。-----JAVA核心思想
小白理解:在程序中可以避免或者解决的错误。
错误:运行不了的代码语句或规范。
所有的错误只要发生,Java就会终止程序的执行,退出JVM,错误不能运行。
2.2 异常分类
异常可以分为:编译时异常(Exception)和运行时异常(RunTimeException)
编译时异常:所有的Exception的直接子类,必须在编写程序的时候预先对这种异常进行处理,如不处理,编译器报错。
运行时异常:所有的RuntimeException及子类都属于运行时异常,运行时异常在编写程序阶段,可以不处理。
编译时异常大概率会发生(大部分是语法、逻辑、超出类型范围值等错误),运行时异常发生概率相对较小。
需要注意的是,编译时异常和运行时异常,都是发生在运行阶段,因为只有程序运行阶段才可以new对象,异常的发生就是new异常对象,编译时异常必须在编写阶段预先处理,如果不处理,编译器报错。
2.3 异常的别名
编译时异常又称为受控异常、受检异常
运行时异常又称为不受控异常、未受检异常
三、异常的处理
异常在Java中可以看做是一种类(JAVA宗旨:一切皆可对象,要啥new啥------JAVA核心思想)
3.1 异常处理的两种方式
1、使用throw,throws关键字(Java中自带的异常),抛给上一级。
2、使用try catch语句捕获异常
JAVA为了鼓励人们将可能会抛出的异常告知使用此方法的前端程序员,提供了一种异常声明的机制,它属于方法声明的一部分。
异常说明(throws)
//throws声明只能抛出发生JAVA自带的异常类
public static void main(String []args) throws
throw(抛出)
//用于程序员自己产生抛出新建的异常类
throw new //新建的异常类
3.1 异常方法
getMessage();
作用:输出简述异常信息
Exception e=new Exception("异常错误");
System.out.println(e.Message);
输出
异常错误
exception.printStackTrace();
作用:打印异常追踪的堆栈信息,类似debug
输出
//输出形式
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
需注意的是,Java后台打印异常堆栈追踪信息的时候,采用了异步线程的方法打印,从上往下一条条看。
3.3 异常的使用
自动抛出
小白理解:只有在main()方法throws Java自带的异常类或者在最初调用异常语句的方法上声明Java自带的异常类,才能向上自动抛出,在其余方法使用throws只能声明发生的异常,用于提醒客户端程序员。
//抛出声明
public static void main(String []agrs) throws NullPointException{ }
public static void dosome()throws ClassNotFoundException{}
用例:
public class ExceptionTest04 {
private static void m1()throws FileNotFoundException{
m2();
}
private static void m2()throws FileNotFoundException{
m3();
}
private static void m3()throws FileNotFoundException {
new FileInputStream("abcdsesf");
}
public static void main(String[] args) {
try {
m1();
/**
* 调用m1,m2,m3方法,在试图捕捉异常后,如果捕捉到了,就不再继续执行该方法后面的语句,转而执行catch和finally
*/
System.out.println("end");
}
catch (FileNotFoundException e) {
String ep=e.getMessage();//以字符串形式获取简述异常信息
//System.out.println(ep);//输出简单异常信息
e.printStackTrace();//该方法与debug相似的功能,输出较详细的异常语句路径
System.out.println("begin");
}
finally {
/**
* 在这里设置文件流的关闭---老猿经验
* finally内的代码一定会执行
*/
}
System.out.println("perfect");//try catch后继续执行
注意:
向上依次抛时,只能是抛向他的父类对象。
只要异常没有捕捉,采用上抛的方式,发生异常后,异常语句后面就没有执行。
反之,只要try catch捕捉,当JAVA执行到try中的异常语句时,如发生异常后,停止执
行异常后续代码,转而执行catch语句,try catch的下面代码就能继续执行。
异常处理机制的作用是增强程序的健壮性
结果:
java.io.FileNotFoundException: abcdsesf (系统找不到指定的文件。)
at java.io.FileInputStream.open0(Native Method)
at java.io.FileInputStream.open(FileInputStream.java:195)
at java.io.FileInputStream.<init>(FileInputStream.java:138)
at java.io.FileInputStream.<init>(FileInputStream.java:93)
at note.exception.ExceptionTest04.m3(ExceptionTest04.java:28)
at note.exception.ExceptionTest04.m2(ExceptionTest04.java:24)
at note.exception.ExceptionTest04.m1(ExceptionTest04.java:21)
at note.exception.ExceptionTest04.main(ExceptionTest04.java:34)
begin
perfect
手动抛出
throw 异常对象;
//throw new Exception;
注意:Java中异常发生后如果一直采用抛出的形式,最终抛给到main()方法,main()方法继续向上抛,最终可能导致JVM终止程序运行
捕获
try{
//可能发生异常的语句
}catch(Exception e){
//e是一个引用变量,指向堆中的Exception
}
finally{
}
注意:try中包含的是可能发生异常的语句,catch能有多个,但必须按照树状结构,由底向上,由具体的异常到父类异常捕获,当异常发生时,异常下面的语句不会执行,转而执行catch和finally语句(如果有的话)。
3.4 throws和throw的区别
1、作用不同
throw用于程序员自行产生并抛出异常, throws用于声明在该方法内抛出了异常
2、使用的位置不同
throw位于方法体内部,可以作为单独语句使用
throws必须跟在方法参数列表的后面,不能单独使用
3、内容不同
throw抛出一个异常对象,且只能是一个
throws后面跟异常类,而且可以有多个。
四、final finally finalize三者之间的区别
final:是一种关键字,被final修饰的类,方法,变量,类不可被继承,方法不能被重写,变量值不能被修改,final在修饰变量时通常与static连用。
finally:是一种关键字,出现在异常中,finally通常与try连用,在try内没有System.exit()语句的情况下,finally内的方法一定会被执行。
finalize:是一种标识符,是GC负责清理垃圾回收时的一种方法。