异常
-
程序执行发生的不正常情况称为“异常”,但注意,开发过程中的逻辑错误和语法错误不是异常
-
异常体系结构:java.lang.Throwable
-
JAVA程序执行过程中发生的异常可分为两类:Error与Exception
-
Error: Java虚拟机无法解决的问题,JVM系统内部错误,资源耗尽,出现这些情况,一般不能通过编写针对性代码解决
public static void main(String args[]){
//StackOverflowError,栈溢出
main(args);
//OutofMemoryError,堆溢出
Integer[] a=new Integer[128736172386712368712];//
} -
Exception(狭义上的异常):又可分为编译时异常,运行时异常
checked:
1. IOexception
2. FileNotFoundException
runtime/unchecked:
1. NullPointerException
2. ArrarIndexOutOfBoundsException -
常见异常有哪些,并举例说明
NullPointerException:空指针异常,对象为null,调用方法时int[] a= null; System.out.println(a[3]); ArrayIndexOutOfBoundsException:数组角标越界 int[] a= new int[3]; System.out.println(a[3]); ClassCastExeption:类型转换异常 //这不算异常。编译时就不能通过 String s=new Date(); Object obj= new Date(); String s=(String) obj;
异常处理的方式
- 异常处理:抓抛模型
- 过程1:“抛”——程序在正常执行的过程中,一旦出现异常,就会在异常代码处生成一个异常类的对象,并将此对象抛出;而一旦抛出对象后,其后的代码就不会再执行
- 过程2:“抓”——可以理解为异常的处理方式:
1. try-catch-finally
2. throws
try-catch-finally
try{
//可能出现异常的代码
}
catch(异常类型1 变量名1){
}catch(异常类型2 变量名2){
}
finally{
//无论是否出现异常,一定会执行的代码
//但finally是可选的,也就是说可以没有finally。但如果有,就必须执行
}
-
在无finally时,一旦try中的异常对象匹配到某一个catch时,就进入catch中进行异常的处理,一旦处理完成,就跳出当前的try-catch,不会再继续匹配其他的catch,就算能成功匹配也不会执行。因此需要注意,如果catch中的异常类型如果无子父类关系,顺序不重要,但如果有子父类关系,则必须将子类异常放在上方,否则会报错(与if else的条件判断不同——同样是unreachable,if else中不会报错)
-
catch{}方法体中常见的输出用法
//1. Spring getMessage();
System.out.println(e.getMessage);
//2.
e.printStackTrace -
try{}中定义的结构,在外面不能继续使用,但是可以继续嵌套try catch
-
finally中声明一定会被执行的代码,即使catch中又出现异常了,try中有return语句,catch中有return语句等情况(也就是说,当方法有返回值时,如果finally中无return,则会输出对应的catch中的值,但如果finally中也有return,那么就只会返回finally中的值)
-
什么时候使用finally,或者说fianlly当中放什么语句,
数据库连接,输入输出流,网络编程Socket等资源,JVM是不能自动回收的,需要手动释放 -
在实际开发过程中,对编译时异常采用try catch方式可以帮助程序正常编译(虽然只是推迟到运行时出现),但对运行时异常采用try catch操作虽然会输出异常,但是并没有解决问题(用了等于没用)——比方说FileNotFoundException,如果文件存在,就能成功的调用各类方法处理文件,但如果不存在,编译器就会报错,并提示你,添加抛出声明,或者用try catch包围
throws + 异常类型
- “throws + 异常类型”写在方法声明处,指明此方法执行时,可能会抛出的异常类型,一旦当方法体执行时,出现异常,仍会在异常代码处生成一个异常类的对象,若此对象匹配throws后面的异常类型,则异常语句之的代码将不再被执行
- throws 与 try catch的区别
1. try catch的结构就说明了,它不只是会抓取异常,而且还会做出相应的处理
2. 而throws则完全不会处理 - 那么什时候选用try catch,什么时候用throws
手动抛出异常
- 异常对象的产生不只是系统自动生成,还可以手动生成一个异常对象,并抛出——throw
自定义异常
- 继承于现有的异常类:RuntimeException,Exception
- 输入提供全局常量:serialVersionUID(序列号)
- 提供重载的构造器
throw与throws的区别
- throw:手动抛出异常对象,它用来生成一个异常
- throws: 声明异常,它是异常处理的一种方式——声明方法可能要抛出的各种异常类
从程序执行看编译与运行时异常
java源程序-------------------→字节码文件-------------------→在内存中加载,运行类
javac.exe java.exe
编译时异常:执行javac.exe命令时,可能出现的异常
运行时异常:执行java.exe命令时,出现的异常
3.