Java异常(违例)与捕获
异常的分类
-
几乎所有的代码都会出现异常,为了保证程序在出现异常之后可以正常执行完毕,就需要异常处理。
-
在java程序设计语言中,异常对象都是派生于Throwable类的一个实例
-
下图是java异常层次结构的一个简化示意图
-
所有的异常都是有Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception
-
Error(栈溢出异常):Error类描述Java运行时内部错误与资源耗尽错误。应用程序不抛出此类异常,这种内部错误一旦出现,除了告知用户并使程序安全终止之外,别无他法
-
Exception层次结构又分解为两个分支;RuntimeException(运行时异常) :由于程序错误导致的异常
IOException:程序本身没有问题,但由于出现I/O问题导致的异常(例如:打开一个并不存在的文件) -
java语言规范将继承于Error与RuntimeException类的所有异常子类称为非受查异常(不强制用户进行异常处理);所有其他的异常称为受查异常
异常的处理格式
- 为了保证程序出现异常后也能正常执行下去,需要进行异常处理
- 在遇到一个异常之后,java便把异常抛了出来,可是抛出来后没有程序代码区捕获它,所以程序就会结束,不会接着执行;如果加上捕获异常的程序代码,则可针对不同的异常做不同的处理,这种处理的方式称为异常处理
- 异常处理是由
try,catch,finally
3个关键字所组成的程序块,语法如下:
try{
// 要检查的语句(有可能出现异常的语句)
}[catch(异常类 对象名称] {
//出现异常后的解决方案
}[finally{
//异常出口,无论是否产生异常,均会执行finally代码块
} ]
1.首先,我们把所有可能出现异常的语句都放在一个try之后的{ }所形成的区块中;
程序通过try{ }区块准备捕获异常,try区块要是有异常发生,程序的运行便中断,并抛出“异常类所产生的对象”
2.抛出的对象如果属于catch()括号内想要捕获的异常类,catch则会捕获此异常,然后进入catch的块里继续运行
3.无论是否产生异常,最终一定会执行finally块里的程序代码
//即便try,catch中存在return语句,也会在return之前执行finally代码块
//如果finally里面没有return,则代码正常返回
finally块是可以省略的,可以有以下组合:
try..catch
try..finally
try...catch...fianlly..
- 当异常发生时,通常可以用两种方法来处理,一种交由java默认的异常处理机制做处理,但这种处理方式,java通常只能输出异常信息,接着便终止程序的运行;另一种处理方式是用自行编写的try–catch–finally块来捕获异常,可以灵活的操控程序的流程,做出最适当的处理
throws关键字
- 用throws关键字声明的方法表示此方法不处理异常,而由系统自动将捕获的异常信息抛给上级调用方法
访问权限 返回值类型 方法名称 (参数列表) throws 异常类
{
//方法体;
}
若有异常,则将该异常提交给直接使用这个方法的方法
- throws用在方法上
public class Test{
public static void main(String[] args) {
try{
System.out.println(caculate(10,0));
}catch(Exception e){
e.printStackTrace();
}
}
public static int caculate(int x,int y)throws Exception{
return x/y;
}
}
- 主方法抛出异常,这个时候产生的异常就会交给JVM处理
public class Test{
public static void main(String[] args)throws Exception {
System.out.println(calculate(10,0));
}
public static int calculate(int x,int y)throws Exception{
return x/y;
}
}
throw关键字
- 所有异常类对象都是由JVM自动化实例的,但有时用户希望能亲自进行异常类对象的实例化操作,自己手工抛出异常,那么此时就需要依靠throw关键字来完成
public class Test{
public static void main(String[] args) {
try{
throw new Exception("抛个异常");
}catch(Exception e){
e.printStackTrace();
}
}
}
throws和throw区别
- 1. throws用于方法内部,主要表示手工异常抛出
- 2.throws主要在方法声明上使用,明确告诉用户本方法可能产生的异常,同时该方法可能不处理异常
Exception与RuntimeException的区别
- 使用Exception是RuntimeException的父类,使用Exception定义的异常都要求必须使用异常处理,而使用的RuntimeException定义的异常可以由用户选择性的来进行异常处理
java中几个常见的异常
算术异常:ArithmeticException
空指针异常:NullPointerException
文件未找到异常:FileNotFoundException
数组下标越界异常:ArrayIndexOutOfBoundsException
内存不足异常:OutOfMemoryException