这里打算用一个Java读取文件内容的例子来测试,文件存在,不抛异常,文件不存在,则抛出FileNotFoundException;

Java读取文件代码如下:

/**
* 根据路径和文件名获取内容
* @param filePath
* @param fileName
* @return
*/
public Object findFileContentByName(String filePath, String fileName) {
InputStream in = null;
Scanner scanner = null;
try {
in = new FileInputStream(filePath + "/" + fileName);
scanner = new Scanner(in);
StringBuffer stringBuffer = new StringBuffer();
if(scanner.hasNext()){
String s = scanner.nextLine();
stringBuffer.append(s).append("\n");
} log.info("stringBuffer.toString()");
return stringBuffer.toString(); }catch (FileNotFoundException e){
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
log.info("Close stream!");
try {
if(scanner != null){
scanner.close();
} if(in != null){
in.close();
}
}catch (IOException e){
e.printStackTrace();
} } log.info("Preparing return null");
return null;
}

代码很简单,就是传入文件的路径和文件名(包括文件后缀名),来获取文件内容;

当我们传入一个在该路径下存在的文件时,不会抛异常,日志如下图:

当我们传入一个不存在该路径下的文件时,会抛出异常,日志如下图(堆栈信息太长只截取了部分):

当我们在catch语句块中加入了return,这时我们传入一个不存在该路径下的文件时,会抛出异常,执行完finally(不要在finally代码会中写return)会立即执行catch中的return,则该函数终止:

public Object findFileContentByName(String filePath, String fileName) {
InputStream in = null;
Scanner scanner = null;
try {
in = new FileInputStream(filePath + "/" + fileName);
scanner = new Scanner(in);
StringBuffer stringBuffer = new StringBuffer();
if (scanner.hasNext()){
String s = scanner.nextLine();
stringBuffer.append(s).append("\n");
} log.info("stringBuffer.toString()");
return stringBuffer.toString(); }catch (FileNotFoundException e){
log.info("catch FileNotFoundException e");
e.printStackTrace();
return "catch FileNotFoundException e";
} catch (IOException e) {
e.printStackTrace();
} finally {
log.info("Close stream!");
try {
if(scanner != null){
scanner.close();
} if(in != null){
in.close();
}
}catch (IOException e){
e.printStackTrace();
} // 不要在finally块中使用return,finally块中的return返回后方法结束执行,不会再执行try块中的return语句。
} log.info("Preparing return null");
return null;
}

总结

在try-catch-finally代码块中,有多个return时:

如果代码没有抛出异常,以第一个return返回(本例中的return在try中),并且finally代码块还会被执行;

如果代码块抛出异常,应该也是以第一个return返回,并且finally代码块还会被执行;

finally代码块的执行不一定是最后执行的,比如本例子中,由于抛出异常后,无return,接着执行finally,finally代码块执行完后,函数还有代码,打印了日志,然后return null。

总的来说,不管代码有没有抛出异常,代码块执行的顺序是:

如果代码执行到第一个return时,未执行finally代码块,则执行完第一个return,紧接着执行finally代码块,执行完finally后,不再执行该函数任何代码;

如果代码执行到第一个return时,已经执行完finally代码块,则紧接着执行第一个return后,不再执行该函数任何代码;

如果finally函数代码块后面没代码,则执行finally代码块后,不再执行该函数任何代码;

注意:第一个return不是函数代码的顺序,而是代码执行过程中遇到的第一个return!

不要在finally块中使用return,finally块中的return返回后,方法结束执行,不会再执行try块中的return语句。

当try-catch-finally代码块遇上return,代码执行流程是怎样的更多相关文章

  1. final、static、代码块、静态代码块、内部类、代码执行顺序

    final final域使得确保初始化安全性(initialization safety)成为可能,初始化安全性让不可变形对象不需要同步就能自由地被访问和共享 作用在类上               ...

  2. 关于java构造函数,静态代码块,构造代码块,和普通代码块相关总结(一)

    构造函数.构造代码块和静态代码块容易混淆,它们的执行条件和执行顺序也常常容易犯迷.这里就针对这些问题说一下我个人的一些理解,顺便对这部分内容做个小结. 一.构造函数 格式:类名(参数1,参数2,-){ ...

  3. java中静态代码块,构造代码块,以及构造方法的执行顺序

    写了许久的代码,却把一些基础的东西都给忘了,今天无聊就顺手写了个,然后测试下,发现跟我记忆中的竟然有些出入,作为一个两年的开发,我感觉自己很失败啊. 父类pojo: public class Pojo ...

  4. java 代码块,静态代码块,构造器等的执行顺序

    写了一段测试代码,如下: public class ExecutionSequence extends fatherClass{    static{        System.out.printl ...

  5. java中普通代码块,构造代码块,静态代码块的区别及代码示例

    本文转自:http://www.cnblogs.com/sophine/p/3531282.html 执行顺序:(优先级从高到低)静态代码块>main方法>构造代码块>构造方法. 其 ...

  6. 构造代码块、构造函数、this执行顺序

    一.构造函数 对象一建立就会调用与之对应的构造函数. 构造函数的作用:可以用于给对象进行初始化. 构造函数的小细节:当一个类中没有定义构造函数时,系统会默认给该类加一个空参数的构造函数:当在类中自定义 ...

  7. JAVA程序执行顺序(静态代码块》非静态代码块》静态方法》构造函数)

    总结:静态代码块总是最先执行. 非静态代码块跟非静态方法一样,跟对象有关.只不过非静态代码块在构造函数之前执行. 父类非静态代码块.构造函数执行完毕后(相当于父类对象初始化完成), 才开始执行子类的非 ...

  8. java中静态代码块,非静态代码块,构造函数

    关于静态代码块 静态代码块的写法: static { System.out.println("我是静态代码块"); } 静态代码块的特点: 1.执行优先级高于非静态的初始化块,它会 ...

  9. try、catch、finally--try块里有return,finally还执行吗?

    finally块的作用是,保证无论出现什么情况,finally块里的代码一定会被执行. 由于程序执行return就意味着结束对当前函数的调用并跳出这个函数体,所以任何语句要执行都只能在return之前 ...

随机推荐

  1. Django之三种文件上传

    方式一: 通过form表单提交到后台 前端: <!DOCTYPE html> <html lang="en"> <head> <meta ...

  2. kotlin的安装(一)

    1.下载Kotlin Compiler Kotlin 命令行环境主要依赖就是Kotlin Compiler,目前最新版本是 1.1.2-2.其下载链接是:https://github.com/JetB ...

  3. 模拟select控件,css模拟下拉

    <!DOCTYPE html > <head>     <meta http-equiv="Content-Type" content="t ...

  4. Linux 虚拟机VMware安装失败,提示没有选择磁盘

    提示安装位置:没有选择磁盘 磁盘类型问题. 在新建虚拟机向导时会推荐选项 重新安装就有磁盘了

  5. 【Eclipse】eclipse中格式化代码配置方法

    1.找到"Source",点击,在弹出的下拉框内,找到"Format",然后点击,或者快捷键ctrl+shift+F, 如果对单单一行的行首进行自动对齐,将鼠标 ...

  6. android开发 静态碎片布局实现

    实现思维: 1.需要写2个或者多个子布局 2.写一个Java的class去实现将子布局与父类布局铺满.(一个子布局对应一个class) 3.在父类布局中导入fragment布局,并且添加android ...

  7. spring初始化相关

    获取applicationContext implements ApplicationContextAware @Override public void setApplicationContext( ...

  8. CMD命令搜索有某文本文件的内容

    FIND "字符串" <文件名>其中文件名部分可包含驱动器号和目录名部分,也可使用*,?通配符.另外有几个参数可用,  /V         显示所有未包含指定字符串的 ...

  9. mysql安装卸载-windows

     安装:(注意点) 官网download安装包 choose setup type --> custom 安装路径 detailed configuration developer machin ...

  10. pc