Java核心技术-异常

Day9

异常

再Java中异常对象都是派生于Throwable类的一个实例。

Throwable有两个分支

  • error Java运行时系统内部错误
  • Exception

Exciption又有两个分支

  • RuntimeException 编程错误导致的异常
  • IOException 其他错误导致的异常

Java中所有派生于Error和RuntimeException的异常称为非检查型异常,其他异常为检查型异常。

如果在一个方法中发生了一个检查型异常,而这个方法不允许抛出检查类型的异常,那么就可以捕获这个检查型异常,将他包装成一个运行时异常。

finally子句

不管抛不抛出异常,finally子句的内容都会执行。

如果再catch中抛出了异常,那么catch抛出异常之后的语句将不会执行。

finally子句主要是用于清理资源,不要把改变控制流t的语句放在finally中。

Try-with-resources

package cn.gyk;

import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.PrintWriter;
import java.nio.charset.StandardCharsets;
import java.util.Locale;
import java.util.Scanner;


/**
 * try-with-resource 将自动给关闭打开的资源,无需手动关闭,简化的finally操作
 
 * @author xg
 * @version V1.0
 * @date 2022/6/1 13:57
 */
public class Try_With_Resource {
    public static void main(String[] args) {
        try (var in = new Scanner(new FileInputStream("src/main/resources/demo.txt"), StandardCharsets.UTF_8);
             var out = new PrintWriter("src/main/resources/demo2.txt", StandardCharsets.UTF_8))
        {
            while(in.hasNext())
            {
                out.println(in.next().toLowerCase());
            }
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}
//ABCDEFG -> abcdefg

堆栈轨迹 stack trace

package cn.gyk;

import java.util.Scanner;

/**
 * @author xg
 * @version V1.0
 * @date 2022/6/1 14:27
 */
public class StackTraceTest {
    public static int factorial(int n){
        System.out.println("factorial("+n+"):");
        var walker = StackWalker.getInstance();
        walker.forEach(System.out::println);//方法引用lambda表达式
        int r;
        if(n<=1) r=1;
        else r = n*factorial(n-1);
        System.out.println("return"+r);
        return r;
    }

    public static void main(String[] args) {
        try(var in = new Scanner(System.in)){//利用try-with-resources 自动关闭资源
            System.out.println("Enter n: ");
            int n = in.nextInt();
            factorial(n);
        }
    }
}
/*
Enter n: 
3
factorial(3):
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:14)
cn.gyk.StackTraceTest.main(StackTraceTest.java:26)
factorial(2):
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:14)
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:17)
cn.gyk.StackTraceTest.main(StackTraceTest.java:26)
factorial(1):
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:14)
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:17)
cn.gyk.StackTraceTest.factorial(StackTraceTest.java:17)
cn.gyk.StackTraceTest.main(StackTraceTest.java:26)
return1
return2
return6

*/
posted @ 2022-06-01 14:33  破忒头头  阅读(55)  评论(0)    收藏  举报