java中的异常

Java中的异常

异常:直观的理解就是不正常,不完全正确,可能存在某些问题。在实际编写程序的过程中,往往可能出于疏忽而导致程序出现bug。典型的有数组越界,除0等,在c语言中由于考虑到程序实际的效率而未考虑数组下标越界引起的程序错误,如果在编写程序涉及到数组的边界问题而未考虑,几乎100%会发生如下的bug。合理的处理异常,会使得程序的健壮性,可读性以及可维护性得到大大的提高。

在java中,提供了优秀的异常机制,当程序出现在运行时期的异常和编译阶段的异常,提供解决错误的方法。

错误:是指系统出现错误或运行环境出现的错误,此类错误非常严重。即使捕捉到也不能够有效的处理,由java虚拟机生成并抛出,通常这类型的错误是由系统错误引起的。
运行时期异常:是在运行时期可以被捕获的异常并能够做有效的处理,如果程序当中没有对这些可能存在的异常做处理,这些异常的处理通常由默认的异常处理程序进行处理。
非运行时期异常:通常是一些语法、语义错误,此类错误通常在编写代码时,由集成开发环境(IDE)提示错误。

下图是java中异常的层次结构:

在这里插入图片描述
在程序中显式的进行异常的处理

1.捕获可能存在的异常。通过try{}catch(形式参数){}代码块,其中catch(形式参数){}代码块可以有多个,但是try{}代码块只有一个。也就是说一个try代码块可以搭配多个catch代码块,因为在可能存在异常的代码块中,可能存在各种不同类型的异常,但是每个catch代码块只能够捕捉到特定类型的异常,所以为了去处理每种类型的异常,就需要增加相应的catch块。注意:catch代码块的参数列表需要写对应类型的异常。当我们忘记可能发生异常的具体类型时间,可以使用Exception基类,因为在java中所有肯能出现的异常都继承Exception类,当然基类的引用是可以指向子类的方法的。(向上造型),注意:在实际的编程中,并不推荐使用Exception的对象作为catch的实参,当有多个catch块时,只能有一个catch块可以使用Exception,否则若所有的catch块都使用Exception,当程序中有多个异常时,根本找不多异常到底是哪一个,正如前边所说的,一个catch块只处理对应的异常。如果所有的catch都想用Exception,那岂不是所有的问题都可以由一个catch来处理了,这显然是矛盾的。

try{
	//书写可能出些异常的代码块
}
catch(某种类型的异常){
	//当出现异常时,对异常进行处理的代码块
}
catch(另外一种类型的异常){
}
finally{}

在catch代码块中,异常对象可以使用的两个比较有用的方法。
(1)getMassage()方法,是Throwable类提供的一个方法,通过该方法的调用,可以得到有关异常的信息。
在这里插入图片描述
(2)printStackTrace()方法,也是由Throwable提供的一个重载的方法,用于输跟踪异常事件发生时堆栈的内容。
在这里插入图片描述
由于异常类都是直接或间接的继承Throwable类,因此子类中都是可以调用这两个方法的。
值得一提的是finally代码块也是非常重要,尤其是在finally代码块中释放资源。finally代码块中的内容,无论之前的·catch·块是否对一场进行了处理,它都一定会执行。如对数据库的连接,若将数据库关闭的操作写在catch块中,但是并没有出现catch所能处理的异常。此时,数据库的连接并没有关闭,而数据库的连接是由上限的,当到达一定数量时,就不允许创建新的连接了。此时,如果将关闭数据库的代码在finally代码块中,就可以解决上边存在的问题。
2.声明异常
(1)throws关键字,将方法执行时可能会出现的异常写在方法的头部,throws关键字后边声明多个异常,它们之间使用逗号隔开,这样调用该方法时就知道应该写什么样的代码来处理这些可能存在的异常,如果调用了声明的异常的方法,却并没有相应的catch块,这样的代码是不能编译通过的。一旦在编写代码的过程中调用了声明异常的方法,调用方就必须做相应的处理,否则编译是不能通过的。

class Test{
	void fun() throws Exception{
	}
}

public class Main{
	public static void main(String[] args){
		Test t = new Test();
		t.fun();//不能编译通过
	}
}

(2)并不是所有可能出现的异常的方法对所有的异常进行异常的声明,如运行时异常RuntimeException异常,它和它的子类不需要进行异常声明。在处理的异常的过程中,如果当前调用方不对异常进行处理,那么由它的上一级调用者处理,沿着调用的层次向上传递。

使用自定义的异常
有时候,系统的提高的异常并不能完全够实际的开发使用,由于java的继承机制,可以很好的提高代码复用。可以通过继承基类Exception,编译自己的异常,以处理这些实际开发中可能存在的异常。

class MyException extends Exception{
	MyException(String str){
		System.out.println(str);
	}
}

class Salary{
	void fun(int n) throws MyException{
		if(n > 100000){
			  throw new MyException("工资大于10000!")
			  //MyException e = new MyException("工资大于10000!");
			  //throw e;
			  //以上的两种写法是等价的
		 }		
	}
}

public class Main{
	public static void main(String[] args){
		Salary  s = new Salary;
		try{
			s.fun(10010);
		}
		catch(MyException e){
			e.printStackTrace;
		}
	}
}

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值