这是我参与8月更文挑战的第14天,活动详情查看:8月更文挑战
Java中异常分类
今天介绍Java中的异常,都是概念性的东西,代码涉及较少。
按照异常需要处理的时机分为编译时异常(也叫强制性异常)也叫CheckedException和运行时异常(也叫非强制性异常)也叫RuntimeException。只有java语言提供了Checked异常,Java认为Checked异常都是可以被处理的异常,所以Java程序必须显式处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误无法编译。这体现了Java的设计哲学:没有完善错误处理的代码根本没有机会被执行。对Checked异常处理方法有两种:
-
当前方法知道如何处理该异常,则用try...catch块来处理该异常。
-
当前方法不知道如何处理,则在定义该方法是声明抛出该异常。
try...catch
public class BufferedStreamLearn {
public static void main(String[] args) {
//创建字符缓冲输入流
BufferedReader br = null;
try {
br = new BufferedReader(new FileReader("File\ShixfBW.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
} catch (IOException e) {
e.printStackTrace();
} finally {
try {
br.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
方法抛出
public class BufferedStreamLearn {
public static void main(String[] args) throws IOException {
//创建字符缓冲输入流
BufferedReader br = new BufferedReader(new FileReader("File\ShixfBW.txt"));
String line;
while ((line=br.readLine())!=null) {
System.out.println(line);
}
br.close();
}
}
运行时异常只有当代码在运行时才发行的异常,编译时不需要try catch。Runtime如除数是0和数组下标越界等,其产生频繁,处理麻烦,若显示申明或者捕获将会对程序的可读性和运行效率影响很大。所以由系统自动检测并将它们交给缺省的异常处理程序。当然如果你有处理要求也可以显示捕获它们。
finally介绍
public class Client {
public static void main(String[] args) {
try {
int i = 1 / 0;
} catch (Exception e){
System.out.println("0不能做除数");
e.printStackTrace();
} finally {
System.out.println("finally 块执行");
}
}
}
finally无论是否抛出异常finally总是执行,一般用于释放资源的操作
error和exception的区别
Error类和Exception类的父类都是Throwable类,他们的区别如下。
-
Error类一般是指与虚拟机相关的问题,如系统崩溃,虚拟机错误,内存空间不足,方法调用栈溢出等。对于这类错误的导致的应用程序中断,仅靠程序本身无法恢复和和预防,遇到这样的错误,建议让程序终止。
-
Exception类表示程序可以处理的异常,可以捕获且可能恢复。遇到这类异常,应该尽可能处理异常,使程序恢复运行,而不应该随意终止异常。
-
Exception类又分为运行时异常(Runtime Exception)和受检查的异常(Checked Exception ),运行时异常;ArithmaticException,IllegalArgumentException,编译能通过,但是一运行就终止了,程序不会处理运行时异常,出现这类异常,程序会终止。而受检查的异常,要么用try。。。catch捕获,要么用throws字句声明抛出,交给它的父类处理,否则编译不会通过。
throw和throws的区别
throw:
- throw语句用在方法体内,表示抛出异常,由方法体内的语句处理。
- throw是具体向外抛出异常的动作,所以它抛出的是一个异常实例,执行throw一定是抛出了某种异常。
throws:
-
throws语句是用在方法声明后面,表示如果抛出异常,由该方法的调用者来进行异常的处理。
-
throws主要是声明这个方法会抛出某种类型的异常,让它的使用者要知道需要捕获的异常的类型。
-
throws表示出现异常的一种可能性,并不一定会发生这种异常
final、finally、finalize的区别
-
final:用于声明属性,方法和类,分别表示属性不可变,方法不可覆盖,被其修饰的类不可继承。
-
finally:异常处理语句结构的一部分,表示总是执行。
-
finalize:Object类的一个方法,在垃圾回收器执行的时候会调用被回收对象的此方法,可以覆盖此方法提供垃圾收集时的其他资源回收,例如关闭文件等。该方法更像是一个对象生命周期的临终方法,当该方法被系统调用则代表该对象即将“死亡”,但是需要注意的是,我们主动行为上去调用该方法并不会导致该对象“死亡”,这是一个被动的方法(其实就是回调方法),不需要我们调用.