1.异常的处理方式有两种分别为:try{}catch{}finally{}和throws下面简单说一下这两者的区别和联系。

2.出现异常之后如果没有进行捕获处理系统就会直接将这个异常栈的跟踪信息直接打印出来之后就结束这个程序的执行。

下面我们看一下异常处理:

public class Test{

   public static void main(String[] args){

       Test2 test2 = new Test2();

       try{

          System.out.println("invoke the method begin!");

          test2.method();

          System.out.println("invoke the method end!");

       }catch(Exception e){

          System.out.println("catch Exception!");

       }

   }

}

class Test2{

   public void method() throws Exception{

       System.out.println("method begin!");

       int a = 10;

       int b = 0;

       int c = a/b;

       System.out.println("method end!");

   }

}

很明显,答案出来了:

invoke the method begin!

method begin!

catch Exception! 
  • 对于try{}catch{}finally{}而言,用户可能确定知道代码会出现相关的异常,把有可能出现问题的地方放到try中去执行,如果一旦出现异常,立刻终止当前代码的继续
  • 执行,转而去执行catch{}里面的内容。对于这类异常用户已经处理了,不会在向上抛出。
  • 对于throws而言,一般使用在方法名的后面,使用throws关键字的时候,一般是开发者不确定出现什么异常或者出现异常的情况可能有多种。这时开发者在方法后面加   throws关键字抛出相关的异常。对于调用该方法的其它开发者者必须捕获这个异常或者继续throws这个异常,把这个异常传递下去,交给其对应的父类去处理。
  • 需要注意throw关键字和throws关键字是有区别的。throw一般用于方法中,抛出用户自定义的异常如 throw new MyException("用户自定义异常")。
  • 而throws是用在方法名的后面,通知使用该方法的人,当前方法有可能抛出异常。
  • 如果简单的理解可以这样看:对于throws可以理解为抛出,抛出给别人,自己不处理。而try{}catch{}finally{}则可以理解为截断,开发者自己处理这个异常。

3.异常处理的执行顺序(针对try{}catch{}finally{}而言)

对于try{}catch{}finally{}而言,,它们的执行顺序很简单,如果在try{}中捕获相应的异常,中断当前代码的执行,转而去执行catch{}中的内容,最后去执行

finally{}中方法,一般来说finally中的方法都是会被执行的,其中finally中很大程度上用于资源的释放。

下面讲解一些我们java程序员需要注意的地方。

a、finally中的代码总是会执行吗?

答:no,如果一个方法内在执行try{}语句之前就已经return了,那么finally语句指定不会执行了。因为它根本没有进入try语句中

如果在一个try语句中调用System.exit(0);方法,那么就会退出当前java虚拟机,那么finally也就没有执行的机会了。

b、finally在return之前执行还是在return之后执行?

答:很多人可能会说在return执行之前执行。我的答案是在return中间执行,是不是很特别,请按下面的例子:

package com.yonyou.test;
class Test{
public static void main(String[] args) {
System.out.println(method());
}
public static int method(){
int x=1;
try{
return x;
}catch(Exception e)
{
return 0;
}finally{
++x;
}
}
}

请问输出的结果是多少呢?

正确答案是:1

下面我来讲解一下这个程序的执行过程,

首先程序在执行到try{}语句中的return方法后,就会先返回相应的值,并把相应的值存储在一个临时栈中去保存这个结果。这时临时栈中存储的值为1。

但是程序不会立刻返回,转而回去执行finally中的方法,++x,在finally执行完后,方法全部执行完,这时会再次调用return方法,注意这时

不在是返回值,而是告诉主调程序,被调程序已经执行完了,你可以接着去执行你主程序的其它方法了。但是请注意,此时返回的值还是原来保存在临时

栈中的值1。

为了更好的理解这个问题,我们看下面的程序:

package com.yonyou.test;
class Test{
public static void main(String[] args) {
System.out.println(method());
}
public static int method(){
try{
return 1;
}catch(Exception e)
{
return 0;
}finally{
return 2;
}
}
}

这时的正确答案又是多少呢?

没错是2,这里仅仅需要注意的是在try{}语句中执行到return 1 会在临时栈中存储值为1的变量。接着回去执行finally里面的内容,这时执行finally中的return 2;方法,这时

临时栈中的值就是变为 2,会覆盖原来临时栈中的值1.所以它的返回值为2。

c、finally方法是必须的吗?

不是,开发者可以根据自身的情况去决定是否使用finally关键字。

总结:在try中没有异常的情况下try、catch、finally的执行顺序 try --- finally
如果try中有异常,执行顺序是try --- catch --- finally
如果try中没有异常并且try中有return这时候正常执行顺序是try ---- finally --- return
如果try中有异常并且try中有return这时候正常执行顺序是try ---- catch  ---- finally --- return
如果在try和catch中没有执行System.exit();那么 finally 永远执行!

异常处理过程和异常处理的执行顺序(针对try{}catch{}finally{}而言)的更多相关文章

  1. java中异常处理finally和return的执行顺序

    根据个人亲自测试,得出如下结果: 1.try,catch中有没有return,finnally都会执行,而且是先执行try,catch后,最后执行finnally语句: 2.如果finnally中有r ...

  2. 深入了解类加载过程及Java程序执行顺序

    前言 在Java中,静态 Static关键字使用十分常见 本文全面 & 详细解析静态 Static关键字,希望你们会喜欢 目录 1. 定义 一种 表示静态属性的 关键字 / 修饰符 2. 作用 ...

  3. JS的预编译和执行顺序 详析(及全局与局部变量)

    最近在复习javascript的事件处理时发现了一个问题,于是总结一下:javascript的预编译和执行顺序的问题:   <html> <head> <title> ...

  4. Java 中 try、catch、finally 语句块的执行顺序

    假设代码顺序书写如下:try → catch → finally → 其他代码 则: 1.正常执行顺序:try → catch → finally → 其他代码 2.try,catch和finally ...

  5. 【转】C# 异常处理 throw和throw ex的区别 try catch finally的执行顺序(return)

    [转]throw和throw ex的区别 之前,在使用异常捕获语句try...catch...throw语句时,一直没太留意几种用法的区别,前几天调试程序时无意中了解到几种使用方法是有区别的,网上一查 ...

  6. 异常处理 try...catch...finally 执行顺序, 以及对返回值得影响

    异常处理 try...catch...finally 执行顺序, 以及对返回值得影响 结论:1.不管有没有出现异常,finally块中代码都会执行:2.当try和catch中有return时,fina ...

  7. Java异常处理机制以及try-catch-finally-return执行顺序

    一,简单描述: 当出现程序无法控制的外部环境问题(用户提供的文件不存在,文件内容损坏,网络不可用...)时,JAVA就会用异常对象来描述. 二,JAVA中用2种方法处理异常: 1.在发生异常的地方直接 ...

  8. ARM 异常处理过程,指令[ swi ]

    1.  发生异常: 程序正常执行,突然被一个不正常的事件打断正在执行的程序,执行相应的异常事件对应的程序 2.  5 种异常模式对应着 7 种异常源:   异常工作模式      异常源 FIR   ...

  9. Asp.Net WebAPI中Filter过滤器的使用以及执行顺序

    转发自:http://www.cnblogs.com/UliiAn/p/5402146.html 在WEB Api中,引入了面向切面编程(AOP)的思想,在某些特定的位置可以插入特定的Filter进行 ...

随机推荐

  1. 简化Kubernetes应用部署工具-Helm

    [编者的话]微服务和容器化给复杂应用部署与管理带来了极大的挑战.Helm是目前Kubernetes服务编排领域的唯一开源子项目,做为Kubernetes应用的一个包管理工具,可理解为Kubernete ...

  2. [PostgreSql]PostgreSql创建函数及函数的执行

    1.准备好创建函数的脚本 -- FUNCTION: public.dynamic_placelist_select(integer, timestamp without time zone) -- D ...

  3. UVALive-3713 Astronauts (2-SAT)

    题目大意:有三个任务A.B.C,n个已知年龄的人.A任务只能被年龄不小于平均年龄的人做,B任务只能被平均年龄以下的人做,C任务不限,相互讨厌的两个人不能做同一件任务,现在已知厌恶关系,求一种任务分配方 ...

  4. Java导出Excel(有数据库导出代码)

    /** * 导出 * @param request * @param response * @throws Exception */ @SuppressWarnings("unchecked ...

  5. 【河南省第十一届ACM程序设计大赛-A】计划日

    已知李明在YYYY年MM月DD日星期W订了学习计划,现在想看看李明N天后的完成情况和个人总结,你能告诉我那天的日期和星期几吗? 输入 第一行: T        表示以下有T组测试数据         ...

  6. Prism 4 文档 ---第4章 模块化应用程序开发

    模块化应用程序是指将一个应用程序拆分成一系列的可以组合的功能单元.一个客户端模块封装了应用程序的一部分,并且通常是一系列相关的关注点.它可以包含一个相关的组件的集合,就像用户界面,应用程序功能,和一些 ...

  7. CF911D

    题解: 简单的奇偶判断 代码: #include<bits/stdc++.h> using namespace std; ; int n,a[N],ans,m,p,q; int main( ...

  8. 使用Unity创建塔防游戏(Part3)—— 项目总结

    之前我们完成了使用Unity创建塔防游戏这个小项目,在这篇文章里,我们对项目中学习到的知识进行一次总结. Part1的地址:http://www.cnblogs.com/lcxBlog/p/60759 ...

  9. 二进制包形式安装mysql5.7.17

    mysql5.7与mysql5.5的安装方式有些区别,如果按照5.5的方式来安装5.7就会有很多报错信息,下面介绍mysql5.7.17的二进制安装方式. 首先安装依赖包: yum -y instal ...

  10. APUE学习笔记——7main()函数启动与退出

    程序的启动与退出过程 先上图,了解进程运行的机制.     内核首先调用exec,运行C启动进程,C启动进程会调用main()函数.     其他所有函数都是由main函数直接或间接调用的.     ...