java异常处理

java异常概述

当程序运行过程中jvm可能会检测到一些不可能执行操作,正常情况下,程序会直接终止并显示异常信息,抛出的信息的类就是异常类,而有些时候,我们并不希望程序就此终止,想让程序输出信息然后跳过这部分代码,这就是异常处理。

异常分类

java中所有的异常类都是java.lang.Throwable的子类,分为
System error(java.lang.error下的子类) runtimeException(java.lang.Exception.RuntimeException的子类)
其它异常(java.lang.Exception下除了RuntimeException的子类)
前两者为免检异常,后者为必检异常

System error

由java虚拟机抛出,描述的是内部系统错误(比如内存溢出,类依赖出错),这种错误用户几乎没有处理办法,一般只能彻底重写代码。

runtimeException

运行时异常,一般表现为程序中一些输入或数据请求不符合要求(比如数组越界ArrayIndexOutOfBoundException,参数不合法),从根本上说是程序设计的不够严谨,未对某些可能的非法数据或操作进行处理,而程序的基本逻辑没有问题。

检查异常

检查异常是指用户执行某些操作时很容易出现的异常,比如通过文件建立输入流时很有可能找不到文件,编译器要求用户必须处理异常(try…catch或throw)

异常信息

在这里插入图片描述
这是一个标准的异常处理信息,在catch语句中e.printStackTrace()输出,左上角是异常所属的类,然后是异常栈信息,最上层是发生异常的最底层代码位置,然后依次是对上一行代码的高层调用,通常我们处理(这里指修改代码的处理)只需要看前两行找到出错代码位置即可。
在这里插入图片描述
这是是个非检查异常的输出,注意到在第一行多了发生异常的线程以及异常的描述信息,当然你也可以自己输出异常描述信息,比如这样:

	public static  int handle1(int a,int b ) {
		if(b==0) 
			throw new IllegalArgumentException("除数不能等于0!");
		int re=a/b;
		return re;         
	}

在这里插入图片描述
需要注意的是,这样抛出异常的话程序会终止执行,所以很少有这么处理异常的。

异常处理

遇到异常我们通常有三种处理方法:

1.try catch finally语句捕获异常

		try {
			is=new FileInputStream(file) ;
		} catch (Exception e) {
			e.printStackTrace();
		}finally {
					try {
						if(is!=null)
						is.close();
					} catch (IOException e) {
						e.printStackTrace();
					}

		}

这是最基本的异常处理方法,当你调用了一些抛出了异常的方法时,编译器会报错要求你处理这些异常(或者你也可以直接抛出),然后你就必须把这段代码写到try语句块中然后在catch语句中对它进行处理。

按我个人的理解,将这称为异常处理并不准确,事实上我们大多数时候处理方式都只是输出异常信息,捕获异常最大的意义在于它强制要求你把有可能出错的代码放在一个语句块中与外界独立起来,使其中声明的变量成为局部变量不能为外界所调用,这样就避免二次出现相同异常的可能,使程序的继续运行成为可能(否则的话只是强制继续运行没有任何意义),没错,异常处理的最大意义就是使程序能够继续运行
当然catch语句块还是有意义的,至少它能让你在程序结束后知道怎么修改代码。

另外finally语句是可选部分,它的特点是只要程序进入try语句块(注意这一点!)不管发生什么都会执行(即使try语句块中return了,这是在finally语句块中写而不在catch后写的主要原因),通常用作一些收尾处理。

2.throws 继续抛出

在这里插入图片描述
当你不知道怎么处理异常时(比如刚刚的除法方法,输入0是调用这个方法的事,我并不知道你会输入什么,所以我无法处理,虽然这是一个运行时异常,但原理是一样的),我可以在方法头抛出这个异常。
需要注意的是,当你能够处理异常时,应尽量使用try catch语句将异常处理了,因为检查异常始终都是要处理的,如果一直抛出,最高层代码面临几个抽象模块在完全不了解你底层逻辑的情况下是不好处理异常的。

3.不处理

通常用于运行时异常(非检查异常),因为这类异常会出现在程序的每一个角落,而且你很难判断某段代码会出什么样的运行时异常,处理的开销太大,所以编译器不强制要求你处理,运行时出异常了直接终止程序抛出异常信息,当然你也可以用trycatch语句处理,这样的话出异常程序就可以继续执行。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值