异常的概念与体系结构
异常的概念
在Java中,将程序执行过程中发生的不正常行为称为异常。就是说在使用计算机语言开发的过程中,尽管代码写的很完美 但在运行中还是会遇到一些问题 比如说 网络异常 用户输入数据的格式 等等
在写代码时经常遇到的异常
1.算术异常
public class Text {
public static void main(String[] args) {
//算术异常
System.out.println(10/0);
}
}
运行结果:
2.数组越界异常
public class Text {
public static void main(String[] args) {
//算术异常
//System.out.println(10/0);
int[] array = {1,2,3,4};
System.out.println(array[5]);
}
}
3.空指针异常
int[] array = null;
System.out.println(array.length);
上面三种异常属于运行异常
异常也分为运行异常 和编译异常(受查异常)
下面来看看编译异常:
public class Text {
public class Person{
private String name;
private String gender;
int age;
//想要该类支持深拷贝,重写Object类的clone方法即可
public Person clone(){
return (Person)super.clone();
}
}
下面来看看异常分类 :
在图片中可以得知:
1.Error:Java虚拟机无法解决的严重问题。如:
JVM的内部错误、资源耗尽等严重情况。典型代表:StackOverflowError(栈溢出)和OutMemoryError, 这种异常一般用代码是解决不了了。
2.Throwable:是异常体系的顶层类,它派生的两个子类分别是:Error和Exception
3.Exception:异常产生后程序员可以进行处理,让程序恢复运行。一般的编程错误导致的一般性问题。
异常的处理
在异常发生之后 ,你会怎么办呢 肯定不会不管吧 在我们Java中,提供了很多优秀的处理方法:
异常处理机制
异常处理机制能让程序出现异常时,按照代码的预先设定的异常处理逻辑,针对性地处理异常
处理异常的主要5个关键字:throw、try、catch、finally、throws
异常的抛出
在编写程序中,如果程序中出现错误,此时就需要将错误的信息告诉调用者,就是告诉报异常的原因。
代码实现:
public static int getElement(int[] array,int index){
if (array==null){
throw new NullPointerException("传递的数组为null");
}
if (index<0||index>=array.length){
throw new ArrayIndexOutOfBoundsException("传递的数组下标越界");
}
return array[index];
}
public static void main(String[] args) {
int[] array = {1,2,3};
getElement(array,3);
}
注意事项:
1.throw必须写在方法体内部
2.抛出的对象必须是Exception或者Exception的子类对象
3.如果抛出的是RunTimeException或者它的子类,则可以不用处理,直接交给JVM处理。
4.如果抛出的是编译时异常,用户必须处理,否则无法通过编译
5.异常一旦抛出 后面的代码就不会执行。
异常的捕获
异常的捕获,也就是异常的具体处理方式,主要有两种:异常声明throws以及try-catch捕获处理。
语法格式:
修饰符 返回值类型 方法名(参数列表)throws异常类型1,异常类型2 ……{
}
注意事项:
1.throws必须跟在方法的参数列表之后
2.声明的异常必须是Exception 或者它的子类
3.方法内部如果抛出了多个异常类型,之后用逗号隔开,如果抛出的异常具有父子关系,直接声明父类即可。
4.调用声明抛出异常的方法时,调用者必须对该异常进行处理
try-catch捕获并处理
真正的异常处理就需要用到try-catch。
语法格式:
try{
//将可能出现异常的代码放在这里
}catch(要捕获的异常类型 e){
//如果try中的代码抛出异常了,此时catch捕获时异常类型与try中一致时,或者是try中抛出异常的基类时,就会被捕捉到
对异常就可以正常处理,处理完成后,就跳出try-catch结构,继续执行后续代码
}catch(}要捕获的异常类型 e){
//对异常进行处理
}finally{
//此处代码一定会被执行
}
throw是抛出异常 throws是声明异常
也可以自定义异常 但自定义异常一般要继承Exception或者RuntimeException