Java学习(异常、断言和日志)

第7章 异常、断言和日志

​ 之前写过异常的文章,部分内容不是很正确,而且整篇文章结构也有些不恰当,这里修改了文章,添加了一些内容。

错误的产生原因

​ 没有人能写出没有BUG的程序,除非这个程序太过于简单。BUG其实就是程序的一些错误,可能是代码的问题,也可能是输入的问题。Java中的异常机制其实也是为了解决这些问题,其他语言也有类似的机制。

异常的分类

​ Java中,异常都是基于Throwable,Throwable下面又有两个基类。Error和Exception。

​ Error代表Java运行时系统的内部错误和资源耗尽错误,其实就是Java虚拟机出错了。

​ Exception则又分为两类,RuntimeException和其他异常。RuntimeException就是运行时异常,一般都是程序代码有问题。例如:

错误的类型转换。

数组访问越界。

访问 null 指针。

其他异常则相反,不是程序代码的问题。所以也叫其他异常。一般有以下几种:

试图在文件尾部后面读取数据。

试图打开一个不存在的文件。

试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。

​ Java将其他异常称为受查异常,Error和RuntimeException统称为非受查异常。为什么这样分?因为受查异常是没法考虑周全的,所以编译器在编写代码时会检查所有的受查异常是否都有异常处理器(就是那个try块)。非受查异常一般可以通过代码来避免(RuntimeException),也有代码处理不了的(Error)。所以对于非受查异常来说代码其实能做的不多,所以你很少见到代码会throw一个非受查异常,非受查异常一般都是通过捕获来进行处理。

​ 总的来说,方法应该尽可能声明会抛出的受查异常,非受查异常要么不可控,要么不应该出现。如果方法没有声明或者捕获受查异常,编译器也会有一个警告。

异常的处理办法

​ 这里说的异常的处理方法其实就是指捕获,捕获的代码格式比较简单。如下:

        try {
          //可能发生异常的代码
        } catch (Exception e) {
          //捕获的异常和捕获后要做的事
        }finally {
					//最后要做的事
        }

​ 这种结构的代码大家估计看的很多了,这里提几个需要注意的点:

  • try语句后面可以只有finally语句,没有catch语句。也就是说必须要有其中一个。
  • finally语句的返回值会覆盖掉原始的返回值。
  • finally是在return执行之后,语句返回之前执行的。(可能比较绕,直接看下面代码)
public class Train {
    public static void main(String[] args) {
        System.err.println(test());
    }

    public static int test() {
        int a = 10;
        try {
            return a++;
        } catch (Exception e) {
            System.err.println("test");
            return 0;
        } finally {
            System.err.println("finally"+a);
            a++;
        }
    }
}

​ 输出结果是finally11\n10,也就是说返回的是10,但是在finally语句开始前,a已经变为11了。

​ 对于关闭资源来说,有可能关闭资源的方法也会出现错误,所以要写两个try块,其实也可以这样写。

try(PrintWriter out = new PrintWriter("test.txt")) {
    out.println("test");
}

这样的话,无论怎么退出,资源都会关闭。

​ 异常的结构和一些注意的点都说了,下面说一下异常机制的一些小技巧。

  • 异常处理不能代替简单的测试
  • 不要过分的细化异常
  • 利用异常层次结构
  • 不要压制异常
  • 在监测错误时,严格要比放任好
  • 不要害怕传递异常
处理错误的其他方法

​ 错误的产生最后形式可能不仅仅是异常,如何处理其他的错误呢?下面介绍两种,断言和日志。

断言

​ 断言我其实用的很少(几乎没有)。只有在源码中才会看到断言。断言机制其实是测试中间会用到的一种检查,测试时,断言能够对语句或者变量进行检查,代码发布后,这些语句将会自动移走以增加程序的运行速度。其实IDE的调试功能可能会好用一些。大家感兴趣也可以查查,这里了解的不多,也就不再叙述用法和详解了。

日志

​ 日志在开发中用的比较多,日志相对于直接打印优点比较多,这里不再累述了。日志框架也比较多,之前也做过分析和介绍。SpringBoot集成Log4j2日志框架。后续也会更新一下日志框架的相关博客。这里也是不再累述了。

总结

​ 总的来说,异常机制、断言、日志都是为了让我们代码调试过程中更加方便。下面再说一下调试的一些技巧。

  • 每个类可以放一个主函数方便调试,也可以通过写测试类来实现。
  • 多用日志。
  • 利用Throwable提供的printStackTrace可以打印堆栈信息,方便调试。
  • 也可以使用一些Java虚拟机调试工具来监控和管理Java程序。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值