文章

java重拾-try

java重拾-try

异常

代码被不正确地执行, 函数被不正确地调用, 数据被不正确地处理, 都是程序的异常, 他们都会中断程序的正常执行流程

异常处理机制就是为了保证程序不会在遇到异常时就直接退出, 而是告知用户信息, 留下记录后安全地跳过异常部分, 不会影响整个服务

比如说:

  • 程序在试图打开一个不存在的文件;
  • 程序遇到了网络连接问题;
  • 用户输入了糟糕的数据;
  • 程序在处理算术问题时没有考虑除数为 0 的情况;

Exception & Exception

从单词的释义上来看,error 为错误,exception 为异常,错误的等级明显比异常要高一些。

从程序的角度来看,也的确如此。

Error 的出现,意味着程序出现了严重的问题,而这些问题不应该再交给 Java 的异常处理机制来处理,程序应该直接崩溃掉,比如说 OutOfMemoryError,内存溢出了,这就意味着程序在运行时申请的内存大于系统能够提供的内存,导致出现的错误,这种错误的出现,对于程序来说是致命的。

Exception 的出现,意味着程序出现了一些在可控范围内的问题,我们应当采取措施进行挽救。

checked & unchecked

checked 异常(检查型异常)在源代码里必须显式地捕获或者抛出,否则编译器会提示你进行相应的操作

unchecked 异常(非检查型异常)就是所谓的运行时异常,通常是可以通过编码进行规避的,并不需要显式地捕获或者抛出

img

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)

Example

Java异常处理的20个最佳实践,别再踩坑了! | 二哥的Java进阶之路

License:  CC BY 4.0