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
*/
浙公网安备 33010602011771号