博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Java标准库定义的常用异常,自定义异常 2020-2-15
阅读量:3888 次
发布时间:2019-05-23

本文共 2691 字,大约阅读时间需要 8 分钟。

Java标准库定义的常用异常包括:

Exception│├─ RuntimeException│  ││  ├─ NullPointerException│  ││  ├─ IndexOutOfBoundsException│  ││  ├─ SecurityException│  ││  └─ IllegalArgumentException│     ││     └─ NumberFormatException│├─ IOException│  ││  ├─ UnsupportedCharsetException│  ││  ├─ FileNotFoundException│  ││  └─ SocketException│├─ ParseException│├─ GeneralSecurityException│├─ SQLException│└─ TimeoutException

当我们在代码中需要抛出异常时,尽量使用JDK已定义的异常类型。例如,参数检查不合法,应该抛出IllegalArgumentException

static void process1(int age) {    if (age <= 0) {        throw new IllegalArgumentException();    }}

在一个大型项目中,可以自定义新的异常类型,但是,保持一个合理的异常继承体系是非常重要的。

一个常见的做法是自定义一个BaseException作为“根异常”,然后,派生出各种业务类型的异常。

BaseException需要从一个适合的Exception派生,通常建议从RuntimeException派生

public class BaseException extends RuntimeException {}

其他业务类型的异常就可以从BaseException派生:

public class UserNotFoundException extends BaseException {}public class LoginFailedException extends BaseException {}...

自定义的BaseException应该提供多个构造方法:

public class BaseException extends RuntimeException {    public BaseException() {        super();    }    public BaseException(String message, Throwable cause) {        super(message, cause);    }    public BaseException(String message) {        super(message);    }    public BaseException(Throwable cause) {        super(cause);    }}

上述构造方法实际上都是原样照抄RuntimeException。这样,抛出异常的时候,就可以选择合适的构造方法。通过IDE可以根据父类快速生成子类的构造方法。

 

断言(Assertion)是一种调试程序的方式。在Java中,使用assert关键字来实现断言。

我们先看一个例子:

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

语句assert x >= 0;即为断言,断言条件x >= 0预期为true。如果计算结果为false,则断言失败,抛出AssertionError

使用assert语句时,还可以添加一个可选的断言消息:

assert x >= 0 : "x must >= 0";

这样,断言失败的时候,AssertionError会带上消息x must >= 0,更加便于调试。

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

对于可恢复的程序错误,不应该使用断言。例如:

void sort(int[] arr) {    assert arr != null;}

应该抛出异常并在上层捕获:

void sort(int[] arr) {    if (x == null) {        throw new IllegalArgumentException("array cannot be null");    }}

当我们在程序中使用assert时,例如,一个简单的断言:

// assert

 Run

断言x必须大于0,实际上x-1,断言肯定失败。执行上述代码,发现程序并未抛出AssertionError,而是正常打印了x的值。

这是怎么肥四?为什么assert语句不起作用?

这是因为JVM默认关闭断言指令,即遇到assert语句就自动忽略了,不执行。

要执行assert语句,必须给Java虚拟机传递-enableassertions(可简写为-ea)参数启用断言。所以,上述程序必须在命令行下运行才有效果:

$ java -ea Main.javaException in thread "main" java.lang.AssertionError	at Main.main(Main.java:5)

还可以有选择地对特定地类启用断言,命令行参数是:-ea:com.itranswarp.sample.Main,表示只对com.itranswarp.sample.Main这个类启用断言。

或者对特定地包启用断言,命令行参数是:-ea:com.itranswarp.sample...(注意结尾有3个.),表示对com.itranswarp.sample这个包启动断言。

实际开发中,很少使用断言。更好的方法是编写单元测试,后续我们会讲解JUnit的使用。

小结

断言是一种调试方式,断言失败会抛出AssertionError,只能在开发和测试阶段启用断言;

对可恢复的错误不能使用断言,而应该抛出异常;

断言很少被使用,更好的方法是编写单元测试。

转载地址:http://lsvhn.baihongyu.com/

你可能感兴趣的文章
ubuntu server搭建python+selenium
查看>>
easy_sql
查看>>
班委考评怎么玩?
查看>>
震惊!PC端QQ也能防撤回?
查看>>
cmake入门那些坑
查看>>
git常用
查看>>
基础算法第4天_skiplist_跳表介绍
查看>>
重学C++之路_#1_概述_总体介绍
查看>>
重学C++之路_#1_基础用法
查看>>
重学C++之路_#1_异常处理
查看>>
C/C++指针回顾
查看>>
算法之排序--插入排序O(n**2)
查看>>
算法之排序--希尔排序
查看>>
转:C++ NULL二义性问题,C++11引入nullptr原因
查看>>
C神奇国度--Branchless code--Bit Twiddling Hacks
查看>>
linux那些锁、无锁操作
查看>>
javascript深入浅出图解作用域链和闭包
查看>>
this指向以及apply,call,bind三者的区别
查看>>
javascript深入理解-从作用域链理解闭包
查看>>
captcha.js一个生成验证码的插件,使用js和canvas生成
查看>>