avatar

目录
JAVA核心技术卷I(异常、断言和日志)

JAVA核心技术卷I(异常、断言和日志)

一、异常

Throwable

  • Error
  • Exception
    • IOException
    • RuntimeException

1.1 创建异常

派生于Exception的类,或者派生于Exception的子类。

包含两个构造器,一个无参的,一个带String参数的。

获得Throwable的详细信息 String getMessage()

1.2 异常捕获

捕获你知道如何处理的异常,而继续抛出你不知道怎么处理的异常。

1.3 再次抛出异常

包装一个异常:

java
try {
// ...
} catch (Exception e) {
throw new MyException("...");
}

设置原始异常:

java
try {
// ...
} catch (Exception e) {
throw new MyException("...").initCause(e); // 设置原始异常
}

// 捕获这个异常的时候可以查看原始异常
Throwable original = caughtException.getCause();

只是添加一个记录:

java
try {
// ...
} catch (Exception e) {
logger.log(level, message, e);
throw e;
}

1.4 try-with-Resources

假设资源实现了一个AutoCloseable接口。

java
try(Resource res = ... [; ...]) {
// ...
}

try退出时候,会自动调用res.close()

1.5 堆栈轨迹

可以调用 e.printStackTrace

还有一种方法 JDK9

java
var walker = StackWalker.getInstance();
wlker.forEach(System.out::println);

1.6 使用异常的技巧

  1. 异常处理不能代替简单的测试

    java
    if (!s.empty()) s.pop();	
    // 646毫秒
    -----------------------------------------
    try {
    s.pop();
    } catch(Exception e) {}
    // 21739 毫秒

    花费时间大,因此只在异常情况下使用异常。

  2. 不要过分地细化异常

    即每个语句都来一个try,可以合到一个try,然后多个catch

  3. 充分利用异常层次结构

    不要只抛出RuntimeException异常。应该寻找一个合适的子类或创建自己的异常类。

  4. 不要压制异常

  5. 再检测所错误的时候,”苛刻“总比放任好。

  6. 不要羞于传递异常

二、断言

断言是一种测试调试阶段使用的战术性工具!

Java中给出了三种处理系统错误的机制:

  • 抛出一个异常
  • 日志
  • 使用断言

什么时候使用呢?

  • 断言失败是致命的、不可恢复的错误
  • 断言检查只是再开发和测试阶段打开

三、日志

打印日志信息主要有2步(这里以log4J为例):

  1. 配置日志属性

    properties
    ### set log levels ###
    log4j.rootLogger = INFO,Console,File

    ### 输出到控制台 ###
    log4j.appender.Console=org.apache.log4j.ConsoleAppender
    log4j.appender.Console.Target=System.out
    log4j.appender.Console.layout=org.apache.log4j.PatternLayout
    log4j.appender.Console.layout.ConversionPattern=%d{yyyy-MM-dd HH:mm:ss,SSS}] [%t] [%c] [%p] - %m%n
  2. 编写Java代码

    java
    public class LoggerGenerator {

    // 创建日志对象
    private static Logger logger = Logger.getLogger(LoggerGenerator.class.getName());

    public static void main(String[] args) throws InterruptedException {
    int index = 0;
    while (true) {
    Thread.sleep(1000);
    // 指定日志等级输出内容
    logger.info("current value is : " + index++);
    }
    }
    }
文章作者: IT小王
文章链接: https://wangbowen.cn/2020/05/18/JAVA%E6%A0%B8%E5%BF%83%E6%8A%80%E6%9C%AF%E5%8D%B7I%EF%BC%88%E5%BC%82%E5%B8%B8%E3%80%81%E6%96%AD%E8%A8%80%E5%92%8C%E6%97%A5%E5%BF%97%EF%BC%89/
版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 IT小王

评论