java异常机制详解

概述

java的基本概念是:结构不佳的代码不能运行。
发现错误的理想时机是在编译阶段,也就是在试图运行程序之前。然而编译器并不能找出所有的错误,余下的问题必须在运行期间解决。
异常情形是指阻止当前方法或者作用域继续执行的问题。在这里一定要明确一点:异常代码某种程度的错误,尽管Java有异常处理机制,但是我们不能以“正常”的眼光来看待异常,异常处理机制的原因就是告诉你:这里可能会或者已经产生了错误,您的程序出现了不正常的情况,可能会导致程序失败!

那么什么时候才会出现异常呢?只有在你当前的环境下程序无法正常运行下去,也就是说程序已经无法来正确解决问题了,这时它所就会从当前环境中跳出,并抛出异常。抛出异常后,它首先会做几件事。首先,它会使用new创建一个异常对象,然后在产生异常的位置终止程序,并且从当前环境中弹出对异常对象的引用,这时。异常处理机制就会接管程序,并开始寻找一个恰当的地方来继续执行程序,这个恰当的地方就是异常处理程序,它的任务就是将程序从错误状态恢复,以使程序要么换一种方法执行,要么继续执行下去。

总的来说异常处理机制就是当程序发生异常时,它强制终止程序运行,记录异常信息并将这些信息反馈给我们,由我们来确定是否处理异常
java异常体系的类图为:
在这里插入图片描述
捕获异常

在java里引入了监控区域的概念。它是一段可能产生异常的代码,并且后面跟着处理这些异常的代码。

try块

如果在一个方法内部抛出了异常,或者方法内部调用其他方法抛出了异常,这个方法将在抛出异常的过程中结束,如果不希望方法结束,可以在方法内设置一个特殊的块来捕获异常。这个块就是try块。跟在try关键字后的普通程序块,这个程序块可能产生异常。

try{
	...
}

异常处理程序

当然,try快抛出的异常必须在某处得到处理,这个地方就是异常处理程序。异常处理程序紧跟在try块之后,以关键字catch表示

try{
	//可能抛出异常的代码
}catch(Type1 id1){
	//异常类型Type1的处理
}catch(Type2 id2){
	//异常类型Type2的处理
}

终止与恢复

时间证明:应用更加广泛的异常处理模型是终止模型:即异常发生之后,程序不会回到异常发生的地方继续执行。

捕获所有异常

可以写一个异常处理程序来捕获所有类型的异常。通过捕获异常类型的基类Exception就可以做到这一点。

catch(Exception e){
 ...
}

最好把它放在其他的异常处理程序之后,以防止它抢在其他处理程序之前先把异常捕获了。

另外如果java本身提供的异常类型并不能预见所以的错误,因此不必拘泥于java中已有的异常类型,可以自己定义异常类型来表示程序中可能会遇到的特定问题。
要自己定义异常类,必须从已有的异常类型继承,最好是选择意思相近的异常类继承。

栈轨迹

stacktrace直译过来就是堆栈跟踪的意思。
printStackTrace方法所提供的信息可以通过getStackTrace方法来直接访问,这个方法将返回一个由栈轨迹中的元素构成的数组。其中每一个元素都表示栈中的一帧。数组中的最后一个元素和栈底是调用序列中的第一个方法调用。

public class WhoClalled {
    public static void main(String[] args) {
        f();
        System.out.println("................");
        g();
        System.out.println("................");
        h();
    }

    private static void f() {
        //生成一个异常来获取它的stack trace
        try {
            throw new Exception();
        } catch (Exception e) {
            for (StackTraceElement ste : e.getStackTrace()) {
                System.out.println(ste.getMethodName());
            }
        }
    }

    private static void g() {
        f();
    }

    private static void h() {
        g();
    }
}

上面代码的打印结果为:

f
main
................
f
g
main
................
f
g
h
main

这里只打印了方法名,但是实际上是可以打印整个的StackTraceElement。
问题:如何查看一个方法的调用栈?
答:可以通过异常的getStackTrace方法来获得

try catch finally
化繁为简,不用管太多,记住一句话即可:在实际项目中,finally常常是用来关闭流或者数据库资源的,并不额外做其他操作,它的作用是finally里面的代码总是会得到执行


转自:https://blog.csdn.net/topdeveloperr/article/details/82286297

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值