java重拾-try
java重拾-try
异常
代码被不正确地执行, 函数被不正确地调用, 数据被不正确地处理, 都是程序的异常, 他们都会中断程序的正常执行流程
异常处理机制就是为了保证程序不会在遇到异常时就直接退出, 而是告知用户信息, 留下记录后安全地跳过异常部分, 不会影响整个服务
比如说:
- 程序在试图打开一个不存在的文件;
- 程序遇到了网络连接问题;
- 用户输入了糟糕的数据;
- 程序在处理算术问题时没有考虑除数为 0 的情况;
Exception & Exception
从单词的释义上来看,error 为错误,exception 为异常,错误的等级明显比异常要高一些。
从程序的角度来看,也的确如此。
Error 的出现,意味着程序出现了严重的问题,而这些问题不应该再交给 Java 的异常处理机制来处理,程序应该直接崩溃掉,比如说 OutOfMemoryError,内存溢出了,这就意味着程序在运行时申请的内存大于系统能够提供的内存,导致出现的错误,这种错误的出现,对于程序来说是致命的。
Exception 的出现,意味着程序出现了一些在可控范围内的问题,我们应当采取措施进行挽救。
checked & unchecked
checked 异常(检查型异常)在源代码里必须显式地捕获或者抛出,否则编译器会提示你进行相应的操作
unchecked 异常(非检查型异常)就是所谓的运行时异常,通常是可以通过编码进行规避的,并不需要显式地捕获或者抛出
throw & throws
throw属于一种操作, 用于显式地 主动地 抛出异常
throw new exception_class("error message");
throws属于一种标签, 在方法签名上声明可能会抛出的异常,然后在调用该方法的地方使用 try-catch 进行处理
public static void myMethod1() throws ArithmeticException, NullPointerException{
// 方法签名上声明异常
}
try-catch-finally
try {
// 可能发生异常的代码
}catch (A | B e) {
// 异常处理 1
}catch (C e) {
// 异常处理 2
}finally {
// 必须执行的代码
}
finally 块常用来关闭一些连接资源,比如说 socket、数据库链接、IO 输入输出流等
即便是 try 块中执行了 return、break、continue 这些跳转语句,finally 块也会被执行。
不执行 finally 的情况
- 遇到了死循环。
- 执行了
System. exit()
这行代码。
try-with-resources
需要实现autocloseable接口
class MyResource implements AutoCloseable {
@Override
public void close() throws Exception {
System.out.println("关闭自定义资源");
}
}
即可
try (MyResource resource = new MyResource();) {
//sth.
} catch (Exception e) {
e.printStackTrace();
}
而不需要在finally手动关闭资源
同时也解决了finally块中的异常抑制try的异常的情况
public class TrywithresourcesCustomOut {
public static void main(String[] args) {
try (MyResourceOut resource = new MyResourceOut();) {
resource.out();
} catch (Exception e) {
e.printStackTrace();
}
}
}
反编译结果是
public class TrywithresourcesCustomOut {
public TrywithresourcesCustomOut() {
}
public static void main(String[] args) {
try {
MyResourceOut resource = new MyResourceOut();
try {
resource.out();
} catch (Throwable var5) {
try {
resource.close();
} catch (Throwable var4) {
var5.addSuppressed(var4);
}
throw var5;
}
resource.close();
} catch (Exception var6) {
var6.printStackTrace();
}
}
}
通过 var5.addSuppressed(var4);
实现将var4的异常信息加入var5中
控制台输出
java.lang.Exception: out()
at com.cmower.dzone.trycatchfinally.MyResourceOutThrow.out(TrywithresourcesCustomOutThrow.java:20)
at com.cmower.dzone.trycatchfinally.TrywithresourcesCustomOutThrow.main(TrywithresourcesCustomOutThrow.java:6)
Suppressed: java.lang.Exception: close()
at com.cmower.dzone.trycatchfinally.MyResourceOutThrow.close(TrywithresourcesCustomOutThrow.java:16)
at com.cmower.dzone.trycatchfinally.TrywithresourcesCustomOutThrow.main(TrywithresourcesCustomOutThrow.java:5)