什么是异常:在程序运行的过程中发生了不被期望的事件,组织了程序按照预期正常执行。
我们要知道,一个程序不会一点错误都没有,在出现异常时,我们要进行异常处理,使程序从异常中恢复。
Java异常类型:
1、Error及其子类:错误,一般为虚拟机的错误,是由Java虚拟机生成并抛出,程序不能进行处理,例如OutOfMemoryError(内存溢出),StackOverFlowError(调出栈溢出)
2、RuntimeException及其子类:运行时异常,也称为非受检型异常,是由于编程时的bug所导致,一般不进行处理,直接中断报错。
例如:
ArithmeticException算数异常
public static void main(String[] args) {
int k=0;
System.out.println(1/k);
}
异常:Exception in thread "main" java.lang.ArithmeticException: / by zero
解决方法:判断分母是否为0
public static void main(String[] args) {
int k=0;
if(k==0) {
System.out.println("除数不正确");
}else {
System.out.println(1/k);
}
}
StringIndexOutOfBoundsException下标越界
public static void main(String[] args) {
String ss="dsadasfwa";
char cc=ss.charAt(ss.length());
System.out.println(cc);
}
异常:Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 9
解决方法:进行下标的合法性验证
public static void main(String[] args) {
String ss="dsadasfwa";
Scanner sc=new Scanner(System.in);
int pos=sc.nextInt();
if(pos>-1&&pos<ss.length()) {
char cc=ss.charAt(pos);
System.out.println(cc);
}else {
System.out.println("没有对应下标的字符");
}
sc.close();
}
ClassCastException类型转换异常
public static void main(String[] args) {
Object obj=new Date();
System.out.println(obj);
Integer kk=(Integer)obj;
System.out.println(kk);
}
处理方法:在进行窄化操作之前先进行对象类型判定
public static void main(String[] args) {
Object obj=new Date();
System.out.println(obj);
if(obj!=null&&obj instanceof Integer) {
Integer kk=(Integer)obj;
System.out.println(kk);
}else {
System.out.println("...");
}
}
3、Exception及其子类中除了RuntimeException及其子类之外的其它异常:
受检型异常:明知道这种异常的存在,但是没有办法杜绝,必须进行代码异常处理
非受检型异常:这种异常不需要进行处理,发现的越早越好
异常的捕获和处理:
try{
try中包含可能产生异常的代码,在执行过程中如果出现了异常,则异常之后的语句不会执行,而是执行catch部分的代码。
}catch(xxException e){
当异常发生时,程序会终止当前的流程,根据获取异常的类型去执行相应的代码
}finally{
无论是否发生异常,此代码都会执行
}
try{}后面必须跟一个finally或者catch
try:用于监听,将要被监听的代码放在try语句块之内,当try语句块内发生异常时,异常就被抛出在执行过程中,该段代码可能会产生并抛出一种或几种类型的异常对象,它后面的catch语句要分别对这些异常做响应的处理。如果没有异常产生,所有的catch代码段都能略过不执行
catch:用于捕获try语句块中发生的异常,在catch语句块中是对异常进行处理的代码,每个try语句块可以伴随一个或多个catch语句,用于处理可能产生的不同类型的异常对象,同时允许异常的继续抛出
finally:finally语句总是会被执行
throw:人为编程抛出异常
throws:用在方法签名中,用于声明该方法可能抛出的异常。