Java异常处理机制

1.什么是异常?

异常是指程序运行过程中出现的异常事件,比如使用空的引用、数组下标越界、内存溢出等,这些异常事件干扰了程序的正常运行,如果置之不理,程序就会终止或直接导致系统崩溃,因此,Java提供了一套异常处理机制来专门处理这些异常,更好的提升程序的健壮性。

在Java中,异常被当作对象来处理,所有的异常都是Throwable子类的实例,它们描述了出现在一段编码中的错误条件。当条件生成时,错误将引发异常。

Java异常类结构层次图:
在这里插入图片描述
在Java中,所有的异常都是由Throwable类继承而来,它有两个重要的子类:Exception类和 Error类

Error: 程序无法处理的错误,比如栈溢出、堆溢出,一般发生这种异常,JVM会选择终止程序。
因此我们编写程序时不需要关心这类异常。

Exception:程序本身可以处理的异常,也就是我们经常见到的一些异常情况,它有两个子类,分别为RuntimeException和IOException,由于程序错误导致的异常属于RuntimeException;而如果程序本身没有问题,但由于像I/O错误这类问题导致的异常属于IOException。

RuntimeException:运行时异常,由java虚拟机自动抛出并自动捕获(就算我们没写异常捕获语句运行时也会抛出错误!!)主要包括以下几种异常:空指针异常、数组下标越界异常、类型转换异常、算术异常,此类异常的出现绝大数情况是代码本身有问题应该从逻辑上去解决并改进代码。

Exception与RuntimeException的区别

Exception是RuntimeException的父类,使用Exception定义的异常都要求必须使用异常处理,而
使用RuntimeException定义的异常可以由用户选择性的来进行异常处理

通常,Java的异常分为受查异常和非可查异常

非受查异常:Error、RuntimeException及其子类,不强制用户进行异常处理,Java编译器不会检查它,也就是说,当程序中可能出现这类异常,即使没有用try-catch语句捕获它,也没有用throws子句声明抛出它,也会编译通过。

受查异常:除了非受查异常的异常类都是受查异常,强制用户进行异常处理,如果不处理,程序就不能编译通过。如IOException、SQLException等以及用户自定义的Exception异常

2.如何处理异常?

在 Java 中,异常处理机制为:捕捉异常,抛出异常

一个方法所能捕捉的异常,一定是Java代码在某处所抛出的异常。简单地说,异常总是先被抛出,后被捕捉的。

总体来说,Java规定:对于可查异常必须捕捉、或者声明抛出。允许忽略不可查RuntimeException和Error。

捕捉异常

1)try-catch语句

public class Test {
public static void main(String[] args) {
try {
int x = Integer.parseInt(args[0]) ;
int y = Integer.parseInt(args[1]) ;
System.out.println(x/y);
}
catch (ArithmeticException e) {
e.printStackTrace();
}
catch (NumberFormatException e) {
e.printStackTrace();
}
catch (ArrayIndexOutOfBoundsException e) {
e.printStackTrace();
}
finally {
System.out.println("[Finally]不管是否产生异常,都执行此语句");
}
}
}

需要注意的是,一旦某个catch捕获到匹配的异常类型,将进入异常处理代码。一经处理结束,就意味着整个try-catch语句结束。其他的catch子句不再有匹配和捕获异常类型的机会。

2)try-catch-finally语句

public class Test {
public static void main(String[] args) {
try {
System.out.println(10/0);
} 
catch (ArithmeticException e) {
e.printStackTrace();
}
finally {
System.out.println("[Finally]不管是否产生异常,都执行此语句");
}
}
}

总结:
try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。

抛出异常

如果一个方法可能会出现异常,但没有能力处理这种异常,可以在方法声明处使用throws来声明抛出异常,用throws关键字将异常抛给调用者后,如果调用者不想处理该异常,可以继续向上抛出,但最终要有能够处理该异常的调用者。

Java中的异常抛出通常使用throw和throws关键字来实现。

1)throws:用在方法声明上,明确表示该方法可能会产生异常,当异常产生时,将异常对象扔回给调用者

public class Test {
public static void main(String[] args) {
try {
System.out.println(calculate(10, 0));
} catch (Exception e) {
e.printStackTrace();
}
}
public static int calculate(int x,int y) throws Exception { //throws用在方法申明上
return x/y ;
}
}

如果现在调用了throws声明的方法,那么在调用时必须明确的使用try…catch…进行捕获,因为该方法有可能产生异常,所以必须按照异常的方式来进行处理

2)throw:直接编写在语句之中,表示人为进行异常的抛出。如果现在异常类对象实例化不希望由JVM产生而由用户产生,就可以使用throw来完成

public static void main(String[] args){
try {
throw new Exception("抛个异常玩玩") ;
} catch (Exception e) {
e.printStackTrace();
}
}

3)throw 和throws的区别

1.throw用于方法内部,主要表示手工异常抛出。
2.throws主要在方法声明上使用,明确告诉用户本方法可能产生的异常,同时该方法可能不处理此异常

自定义异常

自定义异常类可以继承两种父类:Exception、RuntimeException

class AddException extends Exception {//自定义AddException异常类
public AddException(String msg) {
super(msg) ;
}
}
public class Test {
public static void main(String[] args) throws Exception{//声明该方法有可能产生此异常
int num1 = 20 ;
int num2 = 30 ;
if (num1+num2==50) {
throw new AddException("错误的相加操作") ;//表示一个抛出AddException异常的动作
}
}
}

参考博客:https://blog.csdn.net/hguisu/article/details/6155636

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值