Java的错误与异常
所有RuntimeException类及其子类的实例被称为Runtime异常,不是RuntimeException类及其子类的异常实例则被称为Checked异常。
只有java语言提供了Checked异常,其他语言都没有提供,java认为Checked异常都是可以被处理(修复)的异常,所以java程序无须显式的处理Checked异常。如果程序没有处理Checked异常,该程序在编译时就会发生错误,无法通过编译。
除数为0的算术异常、数组下标越界异常、空指针异常等。
int a[] = null;
a[0]= 1; //对空数组中的元素进行操作,产生空对象异常
Stringstr = null;
System.out.println(str.length()); //调用空对象的方法,产生空对象异常
Objectobj = new Object();
Stringstr = (String) obj;
int a[] = new int [-1]; //产生负数组长度异常
int a[] = new int[1];
a[1] = 1; //产生数组下标越界异常
int j = Integer.parseInt("abc"); //产生数值格式异常
try
{
语句1 //存在潜在异常的代码
}
catch(异常类 异常对象)
{
语句2 //捕获到异常并进行处理的代码
}
finally
{
语句3 //最后必须执行的代码,无论是否捕获到异常。异常机制总是保证finally块总是被执行。只有 //finally块,执行完成之后,才会回来执行try或者catch块中的return或者throw语句,如果 //finally中使用了return或者
}
使用finally回收资源
java的垃圾回收机制不会回收任何的物理资源,垃圾回收机制只回收堆内存中对象所占用的内存。
在哪里回收这些物理资源呢?
答:在finally块中,因为如果try块的某条语句引起一场,该语句后的其他语句通常不会被执行,那将导致位于该语句后的资源回收语句得不到执行;如果在catch块里进行资源回收,但catch块完全有可能得不到执行,这也将导致不能及时回收这些物理资源。所以我们不管try块中的代码是否出现异常,也不管哪个catch块会被执行,finally块总会被执行。
throw 异常对象
publicvoid set(int age)
{
if (age>0 && age<100)
this.age = age;
else
throw new Exception("IllegalAgeData"); //抛出异常
}
方法声明抛出异常的throws子句
[修饰符] 返回值类型 方法([参数列表]) [throws 异常类]
public static int parseInt(String s) throws NumberFormatException
异常对象包含的常用方法:
1.
2.
3.
4.
java的异常跟踪栈
异常对象的printStackTrace方法用于打印异常的跟踪栈信息,根据printStackTrace方法的输出结果,我们可以找到异常的源头,并跟踪到异常一路触发的过程.
虽然printStackTrace()方法可以很方便地追踪异常的发生状况,可以用它来调试,但是在最后发布的程序中,应该避免使用它。而应该对捕获的异常进行适当的处理,而不是简单的将信息打印出来。