Java异常(Exception)概述
在使用计算机语言进行项目开发的过程中,即使程序员把代码写得尽善尽美,在系统的运行过程中仍然会遇到一些问题,因为很多问题不是靠代码能够避免的,比如:客户输入数
据的格式,读取文件是否存在,网络是否始终保持通畅等等。
出现异常后会导致JVM(Java虚拟机)停止运行,后续程序无法执行
int a = 10;
int b = 0;
System.out.println(a/b);
//运行时会报错,除数不能为0
注意:代码或语法错误不是异常,语法错误的时候不会生成
异常抛出机制
Java中默认的异常处理机制:将出现的异常,按不同的类型分类为每一种异常封装了一个类来表示,当出现某种类型的异常情况时,会抛出此类的对象,然后终止虚拟机的运行
如果没有捕获到这个异常对象将导致程序终止
使用异常管理机制,对程序运行过程中出现的异常情况进行捕捉并处理
java异常体系结构
Throwable可分为两类,Error和Exception
Error:错误,是java虚拟机无法解决的严重问题,如JVM系统内部错误,资源耗尽等严重情况,一般不编写针对性的代码进行处理
例如:StackOverflowError(栈内存溢出),OutOfMemoryError(堆内存溢出)
Exception:其他因编程原因错误或偶然的外在因素导致的一般性问题,需要使用针对性的代码进行处理,使程序继续运行。否则一旦发生异常,程序也会挂掉。
常见的异常
ArithmeticException算术异常(比如除数为0)
ArrayIndexOutOfBoundsException数组索引越界
StringIndexOutOfBoundsExcepiton字符串索引越界
ClassCastException类转换异常,Integer不能转换成String
NumberFormatException数字格式化异常
NullPointerException调用null对象实例方法/属性异常(一般称为空指针异常)
异常处理
throws
定义一个方法的时候可以使用throws关键字声明,表示此方法
不处理异常,而交给方法调用处进行处理
●任何方法都可以使用throws关键字声明异常类型,包括抽象方法。
● 调用使用了throws的方法时必须处理声明的异常,要么使用try-catch,要么
继续使用throws声明。
● 如果抛出的是运行期异常,则不会有任何提示,需要查看所调用的方法结构
在编码时,就可能出现问题的代码(经验问题)预先编写一些处理机制
程序运行
出现异常执行处理机制,继续运行后续的程序
try{
编写可能出现异常的代码
}catch(异常类型){
处理机制
}catch(Exception e){
//可在最后catch Exception用于捕获所有类型的异常
}finally{
finally代码块中的内容一定会执行
一:当catch没有捕获成功时后面的代码无法执行,但是finally可以执行
二:确保在出现异常的情况下依然最终把流对象关闭
if(in!=null){ in.close();}
三:无论是try中还是catch中进行return操作,都必须在retrun之前先执行finally代码块
}
运行期异常和编译期异常
两者区别在于有没有继承RunTimeEcxeption
编译期异常(检查期异常)
在代码编译阶段,编译器就能明确警示当前代码可能发生(不是一定发生)XX异常,并明确督促程序员提前编写处理它的代码。如果程序员没有编写对应的异常处理代码,则编译器就会直接判定编译失败,从而不能生成字节码文件。通常,这类异常的发生不是由程序员的代码引起的,例如:FileNotFoundException(文件找不到异常)
编码不支持,文件找不到等…都属于检查期异常
RunTimeException(运行期异常)
(即runtime异常、unchecked异常、非受检异常):在代码编译阶段,编译器完全不做任何检查,无论该异常是否会发生,编译器都不给出任何提示。只有等代码运行起来并确实发生了XX异常,它才能被发现。通常,这类异常是由程序员的代码编写不当引起的,只要稍加判断,或者细心检查就可以避免.
数组越界,算术异常,类型转换等…都属于运行时异常
throws和throw的区别
throws
用在方法声明部分,表示此方法中可能出现的某种类型的异常,此方法不处理异常,谁调用谁处理
throw
在方法体中,抛出一个具体的异常对象,该方法终止运行,在异常对象中的构造方法中自定义异常原因
自定义异常
自己定义的异常类,用API中的标准异常类的间接或直接到子类
作用:用自定义异常标记业务逻辑的异常,避免与标准异常混淆
基本语法
public class 异常类名 extends Exception/RuntimeException{
public 异常类名(String msg){
super(msg);
}
}
自定义异常类中往往不写其他方法,只重载需要使用的构造方法
继承Exception,在方法中使用throw抛出后,必须在方法中try-catch或者throws抛出