java中Throwable是所有异常Exception和错误Error的超类;
根据官方文档介绍,Error类型不应该被应用程序捕获,他是属于JVM需要处理的问题,从继承结构上查看,大部分都会以Error作为此类错误结尾,比如VirtualMachineError,IOError等;Exception类型主要包含RuntimeException和非RuntimeException,分别对应非受检和受检类型;
非RuntimeException属于受检异常,我们可以查看相关JDK的代码可以发现,他们被定义方法声明处,同时方法体中有明确的throw语句,通过throws从方法声明处抛出此类型受检异常,比如FileOutStream(String name)构造方法:
public FileOutputStream(File file, boolean append)
throws FileNotFoundException
{
...
if (file.isInvalid()) {
throw new FileNotFoundException("Invalid file path");
}
...
}
它的一个好处是我们在使用时必须需要手动捕获或者继续抛出,同时也是告诉使用者当这种异常发生时不是使用不当造成的,而是外界条件引发的,比如设置的路径确实没有文件存在;
RuntimeException属于非受检异常,查看继承结构比如常见的NullPointerException,IllegalStateException等,这类异常是由于我们自身原因造成的,是本来可以避免的情况,我们可以选择捕获添加自己的处理或者不捕获直接抛出即程序终止运行;
我们有时会自定义一些异常,比如不是正整数异常NotPositiveIntegerException,一般派生自Exception类,这样使用处调用声明有这个异常的方法时,就必须手动捕获或者继续抛出,明确告知调用者应该注意的问题;
自定义异常:
public class NotPositiveIntegerException extends Exception { public NotPositiveIntegerException(String s) { super(s); } }
使用自定义异常定义方法:
public void test(int number) throws NotPositiveIntegerException {
if (number <= 0) {
throw new NotPositiveIntegerException("输入数字不是正整数");
}
//...
}
客户使用(需要手动捕获或者继续抛出):
public void test2( ) {
try {
test(-1);
} catch (NotPositiveIntegerException e) {
Log.d("exception", e.toString());
}
}
打印结果:
Exception: com.fake.applicationtest.javaBase.NotPositiveIntegerException: 输入数字不是正整数