什么是异常?
异常指的是程序在执行过程中,出现的非正常的情况,最终会导致JVM的非正常停止!在Java等面向对象的编程语言中,异常本身就是一个类,产生异常就是创建异常对象并抛出一个异常类,Java处理异常的方式是中断处理。
可能这时候你就会问了,你在这巴拉巴拉半天说啥呢?
那我们就来看一个例子,平常我们输出数组的时候肯定会考虑到数组元素的个数,今天就反其道而行!
/**
* 异常的演示类
* 定义一个数组让其越界输出
*数组元素个数是10,输出11个
*最后我们再输入一句“这句在哪?”
*/
public class ExceptionTest {
public static void main(String[] args)
{
int[] nums=new int[10];
for(int i=0;i<11;i++)
{
System.out.println(nums[i]);
}
System.out.println("这句在哪?");
}
}
输出结果:
程序输出了十个0,同时也显示异常(Exception),ArrayIndexOutOfBoundsException(数组越界异常),并告诉我们数组中只有10个元素,在第13行。但是我们还有一句要输出的“这句在哪?”并没有输出,可想而知,当数组越界异常之后,程序就被自动终止了!
异常分类
这里给大家介绍一下:
1.Throwable类:Java语言中所有错误或者异常的父类
2.Error类:称为错误类,它表示Java运行时产生的系统内部错误或资源耗尽的错误,是比较严重的,仅靠修改程序本身是不能恢复执行的。
3.Exception类:称为异常类,它表示程序本身可以处理的错误,在开发Java程序中进行的异常处理,都是针对Exception类及其子类。
4.RuntimeException类:该类及其子类都用于表示运行时异常。
5.除了RuntimeException类以外,Exception类下所有其他的子类都用于表示编译时异常。
异常的处理(关键字)
Java异常机制用到的几个关键字:try、catch、finally、throw、throws,接下来一起看看吧!
throw、throws
throw作用:在指定的方法中抛出指定的异常
throws作用:声明抛出的异常
使用格式:
/**
* 修饰符 返回值类型 方法名(参数列表) throws AAAException,BBBException...{
* throw new AAAExcetion("产生原因");
* throw new BBBExcetion("产生原因");
* ...
* }
*/
注意事项:
1.throw关键字必须写在方法的内部,throws关键字必须写在方法声明处
2.throw后面new的对象和throws后面声明的异常必须是Exception或者Exception的子类对象
3.如果抛出的多个异常对象有子父类关系,那么直接声明父类异常即可
/**
* throw关键字的使用用例
* @author lenovo
*
*/
public class ExceptionTest {
public static void main(String[] args)
{
int[] arr = null;
int a = getElement(arr);
System.out.println(a);
}
public static int getElement(int[] arr){
/*
* 对传递过来的参数组数,进行合法校验
* 如果数组arr的值是null
* 则抛出空指针异常,告知放的调用者“传递的数组的值是null"
*/
if(arr == null){
throw new NullPointerException("传递的数组的值是null");
}
int i = 1;
int a1 = arr[i];
return a1;
}
}
输出结果是:
Exception in thread "main" java.lang.NullPointerException: 传递的数组的值是null
at ExceptionTest.getElement(ExceptionTest.java:16)
at ExceptionTest.main(ExceptionTest.java:11)
try…catch
刚才我们讲了的处理异常的方式是直接将异常抛出,然后进行中断处理,那么如果我们不希望它进行中断处理,并且检测和自己处理它就可以用try…catch。
接下来看具体代码:
/**
* 格式:
* try{
* 可能产生异常的代码
* }catch(定义一个异常的变量,用来接收try中抛出的异常对象){
* 处理!
* }
* ...
* catch(异常类名 变量名){
* 处理!
* }
* 注意:try检测并抛出几种异常对象就对应有几种catch处理
* 如果没有抛出,则不会执行catch;
*/
public class ExceptionTest {
public static void main(String[] args)
{
int[] arr = null;
int a = 0;
try{
a = getElement(arr);
}
catch(NullPointerException e){
System.out.println("传递的数组的值是null");
}
System.out.println(a);
}
public static int getElement(int[] arr){
int i = 1;
int a1 = arr[i];
return a1;
}
}
输出结果:
传递的数组的值是null
0
这时候我们可以看到输出结果检测和抛出了异常,并且在按照我们自己设定的方式进行了处理之后,继续执行了后续代码。
finally
finally语句块总是会被执行。它主要用于回收在try块里打开的物力资源(如数据库连接、网络连接和磁盘文件)。只有finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果finally中使用了return或者throw等终止方法的语句,则就不会跳回执行,直接停止。
/**
* 请注意:
* finally语句块必须和try...catch一起才能使用。
*格式:
* try{
* 可能产生异常的代码
* }catch(定义一个异常的变量,用来接收try中抛出的异常对象){
* 处理!
* }
* ...
* catch(异常类名 变量名){
* 处理!
* }finally{
* 无论是否出现异常都会执行
* }
*/
总结
其实异常这块内容我个人认为就是捕获异常–>抛出异常–>处理异常,就像是人得了一个小病,然后去医院诊治,医生告诉你就是个小感冒(捕获到了异常),去开点感冒药(抛出异常),最后吃点感冒药就好了(处理异常)。
批注:
之前也写过一次有关于C语言知识的博客(已删),总觉得写个博客嘛,随便写写就好了,但后来想了想,这不仅是对自己的不负责任,更是对每一位来看我博客的朋友们不负责任,就一直在想怎么能让大家看懂,真的是废了很长时间,当然以后也一定会努力改进,继续坚持,希望读者可以为我点赞,为我加油,这样我就更有动力!谢谢大家!