异常
Throwable类的继承体系,有两个直接子类Error
、Exceptioin
,如图
- Error(错误类),Java运行时的系统内部错误或资源耗尽错误,修改程序本身不能恢复。
- Exception(异常类),表示程序本身可以处理的错误。Java开发中进行的异常处理都是针对Exception及其子类。
Tips:除了RuntimeException类及其子类表示运行时异常,Exception类下所有其他子类都用于表示编译时异常。
异常的类型
编译时异常(checked异常)
除了RuntimeException类及其子类表示运行时异常,Exception类下所有其他子类都用于表示编译时异常。
- try…catch 异常捕捉
- throws抛出异常
运行时异常(unchecked异常)
RuntimeException类及其子类都是运行时异常。Java虚拟机会自动进行捕获,程序能编译通过,运行过程中报错。
try…catch和finally
try {
// 可能发生异常的语句
} catch(Exception 类或子类e) {
// 对捕获的异常进行相应处理
}
finally {
print("finally语句块,不论程序是否异常都会执行");
}
throws关键字
有时,我们并不明确或急于处理异常,Java允许将这种异常从当前方法中抛出。
...
public static int divide(int x, int y) throws Exception, xxxException {
...}
...
throw关键字
throw
是用于方法体内,并且抛出一个异常类对象throws
用在方法声明处,用来指明方法可能抛出的多个异常。
public class Exam27 {
private static void printAge(int age) throws Exception{
if (age <=0)
throw new Exception("年龄小于0?");
else
System.out.println("age: "+age);
}
public static void main(String[] args) {
int age = -1;
try {
printAge(age);
} catch (Exception e) {
System.out.println(e.getMessage());
}
}
}
自定义异常
“特殊情况,特殊处理”,Java允许自定义异常,但其必须继承Exception类或其子类。
自定义一个异常类:
public class DivideByMinusException extends Exception {
public DivideByMinusException() {
super(); // 调用Exception无参构造方法
}
public DivideByMinusException(String mes) {
super(mes);
}
}
自定义异常类的使用:
public class Example29 {
public static void main(String[] args) {
try {
int ret = divide(4, 0);
System.out.println(ret);
} catch (DivideException e) {
System.out.println("捕获异常:"+e.getMessage());
}
}
private static int divide(int x, int y) throws DivideException{
if (y == 0) throw new DivideException("除数为0!");
int ret = x / y;
return ret;
}
}
垃圾回收机制(GC)
JVM会自动回收垃圾对象所占用的内存空间。
一个对象在堆内存中运行的三种状态:
- 可用状态:该对象有一个以上的引用变量在引用它。
- 可恢复状态:该对象失去了所有引用变量,在系统调用所有的finalize()方法进行资源清理前,重新使一个对象被一个引用变量引用,则再次变为可用状态。
- 不可用状态:对象失去了所有引用变量,且调用finalize后依然没有变成可用状态。
强制系统进行垃圾回收
- 调用
System.gc()
Tips:一个对象在彻底失去引用成为垃圾后不会立即被回收,而是暂时地保留在内存中,垃圾堆积到一定程度时,垃圾回收器就自动启动,强制回收也是如此。
小结
-
了解了异常类的继承体系,为编写代码时养成好习惯。
-
Java中的垃圾回收机制。