Java提供异常类来表示程序运行中发生的异常,其中throwable
为基类,其下分为Error
和Exception
两类
Error
类
Exception
类
(RuntimeException)
编译器不要求强制处置的异常,虽然你有可能出现错误,但是不会在编译的时候检查
空引用异常 NullPointerException
Student stu = null;//stu没有进行初始哈,编译错误
if(null != stu)
stu.setName("张三");//可通过判断是否为空跳过
算术异常 ArithmeticException
int a = 10, b = 0;
int c = a / b;//除数不可为0
数组下标越界异常 ArrayIndexOutOfBoundsException
int[] nums = {1, 2, 3};
System.out.println(nums[3]);//访问无效数组下标
字符串下标越界异常 StringIndexOutOfBoundsException
String str = "abc";
System.out.println(str.charAt(3));//访问无效字符串位置下标
类型转换异常 ClassCastException
Object obj = "abc";//向上转型,基类类型的引用不能直接调用
String str1 = (String)obj;
System.out.println(str1.charAt(0));
//判断能否进行转型
if(obj instanceof Student){
Student stu1 = (Student)obj;
}
检查异常也叫受检异常,程序在编译阶段,编译器要求必须去处理的
RuntimeException
与其子类,以及错误Error
,其他的都是检查异常若当前方法有能力处理异常,就捕获并处理它
应用try—catch—finally
语句块
try{
Class.forName("net.Student");//主动加载一个类
}catch (ClassNotFoundException e){//捕获的异常类型(空格)标识符(类似方法的形参)
//处理异常的代码
System.out.println("发生了异常");
e.printStackTrace();//打印异常的堆栈信息
}finally{//不论是否发生异常,均会执行
System.out.println("finallly语句块");
//资源的回收操作
}
捕获的异常和真实发生的异常类型匹配执行(异常类型的基类也可)
捕获是基类类型,真实发生的是子类类型,也可以匹配执行
子类类型放在上边,基类类型放在下边
catch
与 finally
不能同时省略,无 catch
时 finally
必须紧跟 try
调用异常的方法来处理这些异常,叫抛出异常
声明异常使用throws
关键字,表示该方法可能要抛出异常
public static int getLength(int[] nums)throws NullPointerException{
if(null == nums){
NullPointerException e = new NullPointerException();
throw e;//抛出异常的动作,当前语句执行时表示真的放生了异常
}else{
return nums.length;
}
}