异常的定义和分类
定义:顾名思义,异常就是不正常,你的程序没有达到你预期的结果,你想让程序输出hello world,它直接没跑通或者啥也没输出,这就是产生异常了,我们其实已经见过好多异常了(下面会有具体例子)
分类
人犯错都有个严重程度,同样的计算机也有,先看一下这张异常体系图。
JAVA在异常这方面有个老祖宗是Throwable类,两个儿子就是Exception和Error。Error是那个不争气的儿子,一出现说明直接就没救了,属于非受查异常,(可能因为再检查也没救了吧)Exception的儿子比较多,RuntimException是程序在运行时出现的异常,属于受查异常,其他三个是非运行时的异常,属于受查异常,这些在使用时要先处理异常,使用throws或try catch捕获。
几种常见的异常
java几种常见的异常:
运行时异常:
1,java.lang.ArrayIndexOutOfBoundsException 数组索引越界异常。当对数组的索引值为负数或大于等于数组大小时抛出。
2,ArithmeticException 算术错误情形,如以零作除数,算术条件异常。
3 java.lang.SecurityException 安全性异常
4,IllegalArgumentException 方法接收到非法参数,非法参数异常!
5,java.lang.ArrayStoreException 数组中包含不兼容的值抛出的异常
6,java.lang.NegativeArraySizeException 数组长度为负异常
7 java.lang.ClassNotFoundException 找不到类异常。当应用试图根据字符串形式的类名构造类,而在遍历CLASSPAH之后找不到对应名称的class文件时,抛出该异常。
8 java.lang.NullPointerException 空指针异常。当应用试图在要求使用对象的地方使用了null时,抛出该异常。譬如:调用null对象的实例方法、访问null对象的属性、计算null对象的长度、使用throw语句抛出null等等。
9,java.lang.NumberFormatException(数字格式转换异常)
10,java.lang.ClassCastException(强制类型转换异常)
IOException
1, IOException 操作输入流和输出流时可能出现的异常
2, EOFException 文件已结束异常
3, FileNotFoundException 文件未找到异常
异常的捕获
捕获基本语法
tr{
有可能出现异常的语句 ;
}[catch (异常类型 异常对象) {
}] [finally { 异常的出口 }
]
解释
①、try 代码块中放的是可能出现异常的代码.
②、catch 代码块中放的是出现异常后的处理行为.
③、finally 代码块中的代码用于处理善后工作, 会在最后执行.,其中 catch 和 finally 都可以根据情况选择加或者不加.
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
try {System.out.println("before");
System.out.println(arr[100]);//明显这里一定会出错
System.out.println("after");
}
catch (ArrayIndexOutOfBoundsException e)
{ // 打印出现异常的调用栈
e.printStackTrace();
}
System.out.println("after try catch");
}
}
运行结果显示
try中出现异常后,try代码块就不会再执行了,而是跳到catch中,catch执行完后会继续往下执行。
catch只能捕获对应种类的异常,
public class Example {
public static void main(String[] args) {
int[] arr = {1, 2, 3};
try {System.out.println("before");
arr=null;
System.out.println(arr[100]);//明显这里一定会出错
System.out.println("after");
}
catch (ArrayIndexOutOfBoundsException e)
{ // 打印出现异常的调用栈
e.printStackTrace();
}
System.out.println("after try catch");
}
}
运行结果:
catch的种类是数据越界,而错误是空指针,所以没法捕获。要想捕获就在加一个catch,即catch可以有多个或者用一个catch,把它的类型定义为Exception.
异常的处理流程:经常在选择里面会用
1、try中没有抛出异常,则catch语句不执行,如果有finally语句,则接着执行finally语句,继而执行finally之后的语句
2、try中抛出异常,有匹配的catch语句,则catch语句捕获,如果catch中有return语句,则要在finally执行后再执行。
3、finally不管有没有异常都会执行。
手动抛出异常
除了 Java 内置的类会抛出一些异常之外, 程序猿也可以手动抛出某个异常. 使用 throw 关键字完成这个操作.
public class Example {
public static void main(String[] args) {
System.out.println(div(10,0));
}
public static int div(int x,int y){
if(y==0){
throw new ArithmeticException("抛出除0异常");
}
return x/y;
}
}
在这个代码中, 我们可以根据实际情况来抛出需要的异常. 在构造异常对象同时可以指定一些描述性信息.
自定义异常
当java内置类的异常不能明确说明异常情况时,
1、自定义异常通常会继承自 Exception 或者 RuntimeException
继承自 Exception 的异常默认是受查异常
继承自 RuntimeException 的异常默认是非受查异常.