Java高级系列——异常(Exception)
在解释Java中的异常时,首先我们来看一张图
上图是我们Java中,异常类的一个继承关系图,从图中我们可以看到Java标准库内构建的这些通用的异常,他们都是以Throwable为顶层父类。
Throwable又派生出Error类和Exception类。
错误:Error类以及他的子类的实例,代表了JVM本身的错误。错误不能被程序员通过代码处理,Error很少出现。因此,程序员应该关注Exception为父类的分支下的各种异常类。
异常:Exception以及他的子类,代表程序运行时发送的各种不期望发生的事件。可以被Java异常处理机制使用,是异常处理的核心。
总体上我们根据Javac对异常的处理要求,将异常类分为两类,一类是checked exception,一类是unckecked exception。
unckecked exception
Error 和 RuntimeException 以及他们的子类。javac在编译时,不会提示和发现这样的异常,不要求在程序处理这些异常。所以如果愿意,我们可以编写代码处理(使用try…catch…finally)这样的异常,也可以不处理。对于这些异常,我们应该修正代码,而不是去通过异常处理器处理 。这样的异常发生的原因多半是代码写的有问题。如除0错误ArithmeticException,错误的强制类型转换错误ClassCastException,数组索引越界ArrayIndexOutOfBoundsException,使用了空对象NullPointerException等等。
我们来看一个具体实例
public class UncheckExceptionDemo {
public static void main(String[] args) {
A object = new A("Ron");
object = null;
System.out.println(object.getName());
}
public static class A{
private String name;
public A(String name){
this.name = name;
}
public String getName() {
return name;
}
}
}
执行上面的的代码,系统就会抛出一个java.lang.NullPointerException异常,这属于unckecked异常,因为我们程序在编写,编译的过程中,javac都不会强制要求我们做任何处理,同时这种异常只有在程序的运行时过程中才会发现并抛出,所以NullPointerException属于运行时异常(RuntimeException )。
checked exception
除了Error 和 RuntimeException的其它异常。javac强制要求程序员为这样的异常做预备处理工作(使用try…catch…finally或者throws)。在方法中要么用try-catch语句捕获它并处理,要么用throws子句声明抛出它,否则编译不会通过。这样的异常一般是由程序的运行环境导致的。因为程序可能被运行在各种未知的环境下,而程序员无法干预用户如何使用他编写的程序,于是程序员就应该为这样的异常时刻准备着。如SQLException , IOException,ClassNotFoundException 等。
我们来看一个具体实例
public class CheckedExceptionDemo {
public static void main(String[] args) throws IOException {
File file = new File("D://hello.txt");
if(!file.exists()) {
file.createNewFile();
}
PrintWriter writer = new PrintWriter(file);
writer.write("您好");
writer.close();
}
}
看上面的代码,当我们在对文件进行处理时,比如我们声明File,并判断指定路径下文件是否存在,不存在则创建文件时,编译器就会要求我们在方法中,要么抛出IOException异常,要么使用try…catch…finally语句捕捉异常信息。
推荐阅读
-
Java异常 Exception类及其子类(实例讲解)
-
浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别
-
夯实Java基础系列10:深入理解Java中的异常体系
-
浅谈Java异常的Exception e中的egetMessage()和toString()方法的区别
-
夯实Java基础系列10:深入理解Java中的异常体系
-
java打印异常Exception的栈信息
-
归并排序栈溢出异常Exception in thread "main" java.lang.*Error
-
JAVA 异常 throwable exception error throws throw
-
【JVM系列1】深入分析Java虚拟机堆和栈及OutOfMemory异常产生原因
-
Java自学-异常处理 Exception