Java-try-catch-finally
try-catch语句还可以包括第三部分,就是finally子句。它表示无论是否出现异常,都应当执行的内容。try-catch-finally语句的一般语法形式为:
 try {
    // 可能会发生异常的程序代码
} catch (Type1 id1) {
    // 捕获并处理try抛出的异常类型Type1
} catch (Type2 id2) {
    // 捕获并处理try抛出的异常类型Type2
} finally {
    // 无论是否发生异常,都将执行的语句块
}  
带finally子句的异常处理程序。
public class TestException {
    public static void main(String args[]) {
        int i = 0;
        String greetings[] = { " Hello world !", " Hello World !! ",
                " HELLO WORLD !!!" };
        while (i < 4) {
            try {
                // 特别注意循环控制变量i的设计,避免造成无限循环
                System.out.println(greetings[i++]);
            } catch (ArrayIndexOutOfBoundsException e) {
                System.out.println("数组下标越界异常");
            } finally {
                System.out.println("--------------------------");
            }
        }
    }
}  
运行结果:
Hello world !
--------------------------
Hello World !!
--------------------------
HELLO WORLD !!!
--------------------------
数组下标越界异常
--------------------------
在例5中,请特别注意try子句中语句块的设计,如果设计为如下,将会出现死循环。如果设计为:
try {
      System.out.println (greetings[i]); i++;
}  
try 块:用于捕获异常。其后可接零个或多个catch块,如果没有catch块,则必须跟一个finally块。
catch 块:用于处理try捕获到的异常。
finally 块:无论是否捕获或处理异常,finally块里的语句都会被执行。当在try块或catch块中遇到return语句时,finally语句块将在方法返回之前被执行。在以下4种特殊情况下,finally块不会被执行:
1)在finally语句块中发生了异常。
2)在前面的代码中用了System.exit()退出程序。
3)程序所在的线程死亡。
4)关闭CPU。
try-catch-finally 规则(异常处理语句的语法规则):
1)  必须在 try 之后添加 catch 或 finally 块。try 块后可同时接 catch 和 finally 块,但至少有一个块。
2) 必须遵循块顺序:若代码同时使用 catch 和 finally 块,则必须将 catch 块放在 try 块之后。
3) catch 块与相应的异常类的类型相关。
4) 一个 try 块可能有多个 catch 块。若如此,则执行第一个匹配块。即Java虚拟机会把实际抛出的异常对象依次和各个catch代码块声明的异常类型匹配,如果异常对象为某个异常类型或其子类的实例,就执行这个catch代码块,不会再执行其他的 catch代码块
5) 可嵌套 try-catch-finally 结构。
6) 在 try-catch-finally 结构中,可重新抛出异常。
7) 除了下列情况,总将执行 finally 做为结束:JVM 过早终止(调用 System.exit(int));在 finally 块中抛出一个未处理的异常;计算机断电、失火、或遭遇病毒攻击。
try、catch、finally语句块的执行顺序:
1)当try没有捕获到异常时:try语句块中的语句逐一被执行,程序将跳过catch语句块,执行finally语句块和其后的语句;
2)当try捕获到异常,catch语句块里没有处理此异常的情况:当try语句块里的某条语句出现异常时,而没有处理此异常的catch语句块时,此异常将会抛给JVM处理,finally语句块里的语句还是会被执行,但finally语句块后的语句不会被执行;
3)当try捕获到异常,catch语句块里有处理此异常的情况:在try语句块中是按照顺序来执行的,当执行到某一条语句出现异常时,程序将跳到catch语句块,并与catch语句块逐一匹配,找到与之对应的处理程序,其他的catch语句块将不会被执行,而try语句块中,出现异常之后的语句也不会被执行,catch语句块执行完后,执行finally语句块里的语句,最后执行finally语句块后的语句;

测试finally执行影响情况
不影响返回结果,主要还是try中返回了,在后面只会执行一下finally,即使name改变也不会影响返回结果
    public static void main(String[] args) {
        System.out.println(get(""));
    }
    public static String get(String name) {
        try {
            System.out.println("try x"+name);
            name = name.toLowerCase()+"123456";
            System.out.println("try y"+name);
            return name;
        } catch (Exception e) {
            System.out.println("exception"+name);
        }finally {
            name = "----";
        }
        System.out.println("return"+name);
        return "```";
    }
结果
try x
try y123456
123456
会影响返回值的情况(本列测试,也正好测试了return返回的如果是对象的引用不是基本数据类型的数据的话,则finally中如果将对象中的内容改变,return中的内容也将会改变,也即是对象在内存中所指向的字符)
    public static void main(String[] args) {
        System.out.println(get(new StringBuilder()).toString());
    }
    public static StringBuilder get(StringBuilder name) {
        try {
            System.out.println("try x"+name);
            name.append("123456");
            System.out.println("try y"+name);
            return name;
        } catch (Exception e) {
            System.out.println("exception"+name);
        }finally {
            name .append("-----");
        }
        System.out.println("return"+name);
        return name;
    }
结果
try x
try y123456
123456-----
会影响返回值的情况(主要为finally中执行了return所以被迫影响到了try中的return)
    public static void main(String[] args) {
        System.out.println(get(""));
    }
    public static String get(String name) {
        try {
            System.out.println("try x"+name);
            name = name.toLowerCase()+"123456";
            System.out.println("try y"+name);
            return name;
        } catch (Exception e) {
            System.out.println("exception"+name);
        }finally {
            name = "----";
            System.out.println("finally"+name);
            return "这列";
        }
        //System.out.println("return"+name);
        //return "```";
    }
输出(从结果看很明显将原版返回123456的结果被finally的return返回了)
try x
try y123456
finally----
这列
Java-try-catch-finally的更多相关文章
- java try(){}catch(){}自动资源释放
		从 Java 7 build 105 版本开始,Java 7 的编译器和运行环境支持新的 try-with-resources 语句,称为 ARM 块(Automatic Resource Manag ... 
- Java 多重catch语句的具体使用介绍
		某些情况,由单个代码段可能引起多个异常.处理这种情况,你可以定义两个或更多的catch子句,每个子句捕获一种类型的异常.当异常被引发时,每一个catch子句被依次检查,第一个匹配异常类型的子句执行.当 ... 
- java try catch finally return执行
		public static int testBasic(){ int i = 1; try{ i++; System.out.println("try block, i = "+i ... 
- java try catch 与 throws 使用场景以及怎么合理使用?
		对于如下场景,给出不同的看法: 其实我更多的疑问在于,自定义的方法里面java api抛出了异常,这个时候,我是需要捕获呢?还是我也继续往上抛. 比如,我这里定义了一个日期处理的方法,有两种对异常的处 ... 
- java try catch 异常后还会继续执行吗
		catch 中如果你没有再抛出异常 , 那么catch之后的代码是可以继续执行的 , 但是try中 , 报错的那一行代码之后 一直到try结束为止的这一段代码 , 是不会再执行的. ========= ... 
- Java try catch
		/* 异常处理的捕捉形式: 这是可以对异常进行针对性处理的方式. 具体格式是: try { //需要被检测异常的代码. } catch(异常类 变量)//该变量用于接收发生的异常对象 { // ... 
- java     try·····catch·····异常处理学习
		异常处理(又称为错误处理)功能 用于处理软件或信息系统中出现的异常状况(即超出程序正常执行流程的某些特殊条件). try....catch....只是异常处理的一种常用方法 try{ //可能导致异常 ... 
- java - try catch finally 用法
		try { //执行的代码,其中可能有异常.一旦发现异常,则立即跳到catch执行.否则不会执行catch里面的内容 } catch { //除非try里面执行代码发生了异常,否则这里的代码不会执行 ... 
- Java try catch语句块中try()的括号中代码作用
		了解过Mybatis,都知道DefacltSqlSession是线程不安全的.每次执行查询都需要新建一个sqlSession.因此官方给的建议写法如下: Mybatis3 从 SqlSessionFa ... 
- Java如何使用catch来处理异常?
		在Java编程中,如何使用catch块来处理异常? 此示例显示如何使用catch来处理异常. package com.yiibai; public class UseOfCatch { public ... 
随机推荐
- Chrome浏览器与常用插件推荐
			Chrome浏览器与常用插件推荐 官方chrome下载:http://www.google.cn/chrome/ 提示:需要FQ才能安装. 1,AdBlock 谷歌屏蔽广告: https://chro ... 
- C#委托与C语言函数指针及函数指针数组
			C#委托与C语言函数指针及函数指针数组 在使用C#时总会为委托而感到疑惑,但现在总新温习了一遍C语言后,才真正理解的委托. 其实委托就类似于C/C++里的函数指针,在函数传参时传递的是函数指针,在调用 ... 
- AC日记——逃跑的拉尔夫 codevs 1026 (搜索)
			1026 逃跑的拉尔夫 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 题目描述 Description 年轻的拉尔夫开玩笑地从一 ... 
- Jenkins学习一:Jenkins是什么?
			文章转载:http://www.cnblogs.com/zz0412/tag/jenkins/default.html?page=1 第一章 Jenkins是什么? Jenkins 是一个可扩展的持续 ... 
- python案例-用户登录
			要求: •输入用户名密码 •认证成功后显示欢迎信息 •输错三次后锁定 1 #!/usr/bin/env python 2 # -*- coding:utf-8 -*- 3 4 "" ... 
- JavaScript基于时间的动画算法
			转自:https://segmentfault.com/a/1190000002416071 前言 前段时间无聊或有聊地做了几个移动端的HTML5游戏.放在不同的移动端平台上进行测试后有了诡异的发现, ... 
- typicalapp.js
			/** * 1.找出数字数组中最大的元素(使用Math.max函数) 2.转化一个数字数组为function数组(每个function都弹出相应的数字) 3.给object数组进行排序(排序条件是每个 ... 
- Web知识总结
			一)window.location.href和window.location.replace的区别 1.window.location.href=“url”:改变url地址: 2.window.loc ... 
- js 中常用的方法
			1..call() 将.call()点之前的属性或方法,继承给括号中的对象. 2.(function(){xxx})() 解释:包围函数(function(){})的第一对括号向脚本返回未命名的函数, ... 
- 如何拿到半数面试公司Offer——我的Python求职之路(转)
			原文出处:http://www.cnblogs.com/Lands-ljk/p/5836492.html 从八月底开始找工作,短短的一星期多一些,面试了9家公司,拿到5份Offer,可能是因为我所面试 ... 
