Throwable这个JAVA类被用来表示任何可以作为异常抛出的类。它分为两种类型:
1.Error:表示编译时和系统错误,除特殊情况外,我们不需要理会此异常。
2.Exception:可以被抛出的异常,在JAVA类库、用户方法及运行时故障中都可能抛出的异常,我们通常关心此异常。
异常的基本概念是用名称代表发生的问题,异常的名称应该做到望文知义,异常也并非都是在java.lang包中定义的,有些异常来自于util、net和io这样的包。
if(t == null)
throw new NullPointerException();
如果必须对传递给方法的每个引用都检查是否为Null,那么可以想象工作量将会异常的多。在JAVA中,这种异常属于JAVA的标准运行时检测的一部分。如果对null引用进行调用,JAVA会自动抛出NullPointerException异常,所以上述代码是多余的。
属于运行时异常的类型有很多,它们会自动被JAVA虚拟机抛出,所以不必在异常说明中罗列出来,这些异常都继承自RuntimeException类,使用起来很方便。它们构成了一组具有相同特征和行为的异常类型,也不需要在异常说明中声明方法抛出的异常,它们也被称为“不受检查异常”,这种异常属于错误,将被自动捕获,但是尽管不需要捕获RuntimeException异常,但仍然可以在代码中抛出这种类型的异常。看下面一段代码:
package access;
public class NeverCaught {
static void f(){
throw new RuntimeException("From f()");
}
static void g(){
f();
}
public static void main(String[] args) {
// TODO Auto-generated method stub
g();
}
}
此程序的输出结果为:
编译器不需要异常说明,其输出报告给了System.err。如果RuntimeException没有被捕获而直达main函数,那么程序退出前将调用异常的printStackTrace方法。
只能在代码中忽略RuntimeException及其子类型的异常,其它类型的异常的处理都是由编译器强制执行的,RuntimeException代表的是编程错误:
1.无法预料的错误,比如从控制范围外传递来的null引用。
2.应该在代码中检查的错误,在一个地方发生的异常,常常会在另一个地方发生错误。
不应该把异常处理机制当做是单一的用途的工具,它被设计用来处理一些烦人的运行时错误,这些错误往往是由代码控制范围外的不确定因素导致的,但是它对于发现某些编译器无法检测到的编程错误也是很有帮助的。