Java异常(Exception)

什么是异常?

异常指的是程序在执行过程中,出现的非正常的情况,最终会导致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语言知识的博客(已删),总觉得写个博客嘛,随便写写就好了,但后来想了想,这不仅是对自己的不负责任,更是对每一位来看我博客的朋友们不负责任,就一直在想怎么能让大家看懂,真的是废了很长时间,当然以后也一定会努力改进,继续坚持,希望读者可以为我点赞,为我加油,这样我就更有动力!谢谢大家

发布了3 篇原创文章 · 获赞 18 · 访问量 2913

猜你喜欢

转载自blog.csdn.net/zSoaring/article/details/105292839