3Java异常处理——2断言和日志——1使用断言(廖雪峰)

1.Assertion

断言(Assertion)是一种程序调试方式

  • 使用assert关键字
  • 断言条件预期为true
  • 如果断言失败,为false,抛出AssertionError
static double abs(double d){
    return d >= 0 ? d : -d;
}

public static void main(String[] args){
    double x = abs(-123.45);
    assert x >= 0;
    assert x >= 0: "x must >= 0";
    System.out.println(x);
}

断言的特点:

  • 断言失败时会抛出AssertionError,导致程序结束退出
  • 不能用于可恢复的程序错误
  • 只应该用于开发和测试阶段

什么是可恢复的程序错误?

void sort(int[] arr){
    assert arr != null;
}
//不能用assert来判断变量是否为空,因为这个错误可以恢复
void sort(int[] arr){
    if (x == null){
        throw new IllegalArgumentException("array cannot be null");
    }
}

对于可恢复的程序错误:

  • 不应该使用断言
  • 应该抛出异常并在上层捕获

2.启用断言

JVM默认关闭断言指令(即忽略所有的assert)

  • 给Java虚拟机传递-ea参数启用断言
  • 可以指定特定的类启用断言-ea:com.xiaoxiatianxi.sample.Main(类的全名)
  • 可以指定特定的包启用断言-ea:com.xiaoxiatianxi...(包的全名)

选中class文件——单击右键——Run As ——Run Configurations....——Arguments

——在VM arguments中添加-ea:com.xiaoxiatianxi.sample.Main(类的全名)——Apply

——run

package com.xiaoxiatianxi.sample;

public class Main {
	
    public static void main(String[] args){
        double x = abs(-123.45);
	assert x >= 0: "x must >= 0 but x =" + x;
	System.out.println(x);
    }
    static double abs(double d){
        return d < 0 ? d : -d;
    }
}

对程序进行修改,将 return d < 0 ? d : -d; 改为return d > 0 ? d : -d; 则运行结果为:

3.总结

  • 断言是一种调试方式,断言失败会抛出AssertionError
  • 只能在开发和测试阶段启用断言
  • 对可恢复的错误不能使用断言,而应该抛出异常
  • 断言很少被使用,更好的方法是编写单元测试

猜你喜欢

转载自blog.csdn.net/qq_24573381/article/details/107728294