MOMO173
人可能在奔溃的边缘
MOMO
java中的try和catch

最近学习安卓的文件写入,碰了壁,里面有一个try、catch和finally这些东西

        FileOutputStream out = null;
        BufferedWriter writer = null;

        try{
            out = openFileOutput("date", Context.MODE_PRIVATE);
            writer = new BufferedWriter(new OutputStreamWriter(out));
            writer.write(inputText);
        }catch(IOException e){
            e.printStackTrace();
        }finally{

            try{
                if(writer != null){
                    writer.close();
                }
            }catch(IOException e){
                e.printStackTrace();
            }

        }

作为一个直接去摸android的,只学了点皮毛java的人,看到这里这真的很痛苦,就疯狂寻找这三个关键字的资料
这三个关键字是java用于try..catch..finally块,进行异常捕获的

百度的例子是:

try {
    语句块1
} catch (<? extends Throwable> e) {
    语句块2.1
} catch (<? extends Throwable> e) {
    语句块2.2
} catch (<? extends Throwable> e) {
    语句块2.3
...
} finally {
    语句块3
}

try是try..catch..finally块中用来引导第一部分的关键字,用于声明需要捕获指定语句块的异常

catch可以出现0次、1次或多次,finally可以出现0次或1次,但是catch和finally不能同时不出现。
catch用法:
当语句块1中抛出异常时,立即离开语句块1,之后会在所有catch中依次进行类名比对。如果抛出异常和catch声明的异常类名一致,或抛出异常是catch声明的异常的子类,则会进入该catch的语句块(成为异常的捕获),在catch的语句块中可以将异常输出到命令行或引导用户进行问题反馈。如果任何一个catch都不匹配,会像上层调用抛出这一异常(在此之前会进入finally语句块,详情参考下面的finally用法)。

finally用法:
在语句块1、语句块2中,任何试图离开try..catch..finally块的语句都会导致语句块3被执行,如return throw break continue。在finally的语句块中可以进行内存回收等工作。
需要注意的是,如果导致离开的不是语句造成的,而是断电、内存不足等计算机故障,finally语句块不会被执行。

其实我个人理解就是,如果try执行的过程了,抛出了异常,就会去寻找相应的catch,如果没有并执行完try之后就会去到finally,不过要切记,如果有reture,
网上有很多人探讨Java中异常捕获机制try…catch…finally块中的finally语句是不是一定会被执行?经过别人的试验,至少有两种情况下finally语句是不会被执行的:
(1)try语句没有被执行到,如在try语句之前就返回了,这样finally语句就不会执行,这也说明了finally语句被执行的必要而非充分条件是:相应的try语句一定被执行到。
(2)在try块中有System.exit(0);这样的语句,System.exit(0);是终止Java虚拟机JVM的,连JVM都停止了,所有都结束了,当然finally语句也不会被执行到。
举个具体实例:

public class test{
     public static void main(String[] args) {
        System.out.println(momo());
    }

    public static int momo(){
        int i = 10;
        try{
            System.out.println("try");
            return i += 50;
        }catch (Exception e) {
         System.out.println("catch");
        }finally{
            System.out.println("finally");
            if(i>50){
                System.out.println("i>50, i = " + i);
            }
        }
        return i;
    }
}

输出的结果是:
try
finally
i>50, i = 60
60

也就是说try是先执行的那个,然后再去执行finally,但是数据并没有直接返回,而是等finally语句执行完了再返回结果。

https://secure.gravatar.com/avatar/5967493088983a79f7ef15e91c8e0598?s=256&d=mm&r=g

momo

文章作者

MOMO

java中的try和catch
最近学习安卓的文件写入,碰了壁,里面有一个try、catch和finally这些东西 FileOutputStream out = null; BufferedWriter writer = null; try{ ou…
扫描二维码继续阅读
2019-05-17
功能
关注我