一、异常的概述
程序中的异常
两数相除,除数为0,会报算数异常;
应用类型没有距离的实例,会报空指针异常
public class ExceptionTest1{
public static void mai(String[] args){
int i = 10;
//java.lang.ArithmeticException
System.out.println(i/10);
String str = 1;
//java.lang.nullPointerException
System.out.println(str.length());
}
}
异常的定义:异常指在程序的运行中发生不正常的事件,就是程序出现了不正常问题。异常的本身就是Java当中对可能出现的问题进行描述的一种对象体现
常见的异常:
除数不能为零:ArithmeticException
空指针异常:NullPointerException
数组下标越界:ArrayIndexOutOfBoundsExcption
类型转换异常ClassCastException
异常的分离
编译异常 Exception:异常在编译过程中发生的异常(受检异常)
运行时异常 RuntimeException:异常在运行十发生的异常(非受检异常)
错误 Error:由java虚拟机生成并派出的异常,程序对其不做处理
Throwable类十Java语言中所有错误或异常的超类。只有当对象是此类或其子类之一的实例时,才能通过Java虚拟机或者Java throw语句抛出,类似的,只有此类或此类的子类之一才可以时catch子句中的参数类型
public class ExceptionTest2{
public static void mai(String[] args){
int i;/
System.out.println(i);//编译时异常
Syste.out.println(10/0);//运行时异常
//Error 错误 java。浪。StackOverflowError
show();
}
public static void show(){
System.out.println("show");
String[] s = new String[1024*1024];
show();
}
二、异常的处理
自己处理
通过try catch语句来处理
pubic static void main(String[] args){
System.out.println("第一段代码");
int i = 10;
System.out.println(i/0);//System.exit();
System.out.println("第二段代码块");
}
}
(1)单个异常
public static void main(String[] args){
System.out.println("第一段代码");
try{
int i = 10;
}catch(ArithmeticException e){
System.out.println("除数为零");
}
System.out.println("第二段代码块");
}
catch中声明的异常类型应该和实际抛出的异常类型要么相同要么有继承关系才能捕获到
(2)多个异常
try中有多行代码,都有可能出现异常信息,程序的执行的时候时从上往下执行的,当碰到异常的情况就会体哦啊出try块,从而try块中剩余的代码就不会执行了
public static void main(String[] args){
System.out.println("第一段代码");
int i = 10;
String str = null;
int[] arr = new int[3];
try{
System.out.println(str.length());
System.out.prrintln(1-0);
arr[10] = 100;
}catch(NullPointerException e){
System.out.pringln("空指针异常");
}catch(ArrayIndexOutOfBoundsException e){
System.out.pringln("数组下标越界");
}catch(Exception e){
e.printStackTrace();
}
System.out.println("第一段代码");
}
}
将异常抛出
通过throws关键字将异常交给调用者来处理
throws作用:在定义一个方法的时候可使用throws关键字声明,使用throws关键字声明的方法表示此方法不处理异常,而交给方法的调用者进行
注意:
如果一个方法声明的时编译时异常,则在调用这个方法之处必须处置这个异常(谁调用谁处理)
重写一个方法的时候,它所声明的异常范围不能被扩大
三、异常的相关关键字介绍
throw throws 和 throwable的区别
throws用在方法名后面,跟的是异常类名,throw是用在方法体中,跟的异常对象
throws可以跟多个异常类名,用逗号隔开,throw只能抛出一个异常
throws表示抛出异常,由该方法的调用者来处理,throw表示抛出异常,由该方法体的语句来处理
throws表示出现异常的一种可能,并不一定发生这些异常,throw则是抛出了具体的异常,真实地产生了一个Exception对象
Throwable,它的直接子类为Error和Exception。
四、自定义异常实现
finally:修饰代码一定会执行,除非执行到finally之前程序异常退出或者调用了系统的退出方法
final fianlly finalize三者的区别
●final修饰的类能被继承 修饰的方法不能被重写 修饰的变量变常量
●fianlly是try catch语句中的一部分,表示要最终执行的代码,常用做资源的释放
●finalize是Object中的方法,在垃圾回收的时候会用到的方法
Java中的异常都是Throwable或者Exception或者RuntimeException的子类,那么我们要创建一个自定义的异常,其实就是创建其对应的子类