【java】异常中的方法和finally用法

本文详细讲解了Java异常中的getMessage()方法用于获取简单描述信息,以及printStackTrace()方法用于打印详细的堆栈跟踪。通过实例演示了如何捕获并处理编译时异常和运行时异常,以及finally块的作用和常见应用场景。
摘要由CSDN通过智能技术生成

getMessage()和printStackTrace():

import java.io.FileInputStream;
import java.io.FileNotFoundException;

/**
 * 异常对象中两个重要方法:
 *      获取异常简单的描述信息:
 *          String msg = exception.getMessage();//这个信息实际上就是构造方法上的String参数
 *      打印异常追踪的堆栈信息:
 *          exception.printStackTrace();
 */
public class ExceptionTest02 {
    public static void main(String[] args) {
        try{
            m1();
        }catch(FileNotFoundException e){
            String msg = e.getMessage();
            System.out.println(msg); //输出 c:\dsadasdasdasd (No such file or directory)

            e.printStackTrace();
            /*
            这里打印出异常堆栈信息,若这里没有e.printStackTrace();这条语句,将不会打印出以下信息。
            at java.base/java.io.FileInputStream.open0(Native Method)
	        at java.base/java.io.FileInputStream.open(FileInputStream.java:216)
	        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:157)
	        at java.base/java.io.FileInputStream.<init>(FileInputStream.java:111)
	        at 异常.ExceptionTest02.m2(ExceptionTest02.java:30)
	        at 异常.ExceptionTest02.m1(ExceptionTest02.java:26)
	        at 异常.ExceptionTest02.main(ExceptionTest02.java:16)
	        "以上信息中,前四条是sun公司写的异常信息,不用看
	           这里只需要看第五条信息at 异常.ExceptionTest02.m2(ExceptionTest02.java:30)
	           表示第30行代码出错,后面信息表示因为第30行代码出错而带动26、16行语句出错
             */
        }

    }

    private static void m1() throws FileNotFoundException{
        m2();
    }

    private static void m2() throws FileNotFoundException {
        new FileInputStream("c:\\dsadasdasdasd");//这里随便输入的文件路径
    }
}

/**
 *   异常可分为 编译时异常和运行时异常。
 *   1、编译时异常:又称受检异常/受控异常(发生概率较高)
 *            编译时异常时表示必须在编写程序的时候预先对这种异常进行处理,若不处理,编译器报错。
 *   2、运行时异常:又称未受检异常/非受控异常(发生概率较低)
 *            运行时异常在编写程序阶段,可选择处理,也可选择不处理。
 */

finally:

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;

/**
 * 关于try...catch中的finally子句:
 *      1、finally子句中的代码是最后执行的,且是一定会执行,即使try语句块中出现异常。
 *          1.1、finally子句必须和try一起出现,不可单独编写。
 *          1.2、try和finall联合使用,可以没有catch。
 *      2、finally使用情况:
 *          通常在finally语句块中完成资源的释放/关闭。
 *          因为finally中的代码比较又保障,即使try语句块中代码出现异常,finally中代码也会执行。
 */
public class ExceptionTest03 {
    public static void main(String[] args) {
        FileInputStream fis = null; //声明位置放到try外面,这样在finally中才能使用;若声明在try里,finall中无法使用fis。
        try{
            //创建输入流对象
            fis = new FileInputStream("c:\\123123");//这里文件路径乱写的(演示),一定会出现异常

            /*
            流是占用资源的,使用完后需要关闭。
            所以以上程序出现异常,流也需要关闭。
            若fis.close();放在try这里可能会关闭不了。
            因为上面的代码若出现异常,那么try中异常语句下面的代码是无法执行的!
            如这里的hello代码无法执行到.
             */
            System.out.println("hello!");
        }catch (FileNotFoundException e){
            e.printStackTrace();
        }catch (IOException e){
            e.printStackTrace();
        }finally{
            if(fis != null){  //这里if避免空指针异常,因为前面声明fis为null
                try{
                    //close()方法又异常,采用捕捉方式
                    fis.close();
                }catch (IOException e){
                    e.printStackTrace();
                }
            }
            System.out.println("finally中语句一定执行!");
        }

//------------------------------------------------------------

        try{
            System.out.println("try....");
            return; //终止方法
        }finally {
            System.out.println("finally....");
            /*
            这里输出try...和finall....
            执行顺序:先执行try,再执行finally,最后执行return;
            所以finally中的代码块一定会执行的。
             */
        }


    }
}
public class ExceptionTest04 {
    public static void main(String[] args) {
        try{
            System.out.println("try....");
            //退出JVM
            System.exit(0); //退出JVM后,finally语句中的代码就不执行了!!!这里只输出try....
        }finally {
            System.out.println("finally....");

        }
    }
}

finally面试题:

/*
    finally经典面试题
 */
public class Exceptiontest05 {
    public static void main(String[] args) {
        System.out.println(m());//输出100
    }
    /*
        java语法规则:
                1、方法体中的代码必须遵循自上而下顺序依次逐行执行
                2、return语句一旦执行,整个方法必须结束
     */
    public static int m(){
        int i = 100;
        try{
            //这行代码出现在int i=100;的下面,所以最终结果必须是返回100
            //return语句必须保证最后执行,return执行,整个方法结束。
            return i;
        }finally {
            i++;
        }


    }
}


/*
    m()反编译:
        public static int m(){
        int i = 100;
        int j = i;
        i++;
        return j;
        }
 */

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值