Java里有个很重要的特色是Exception ,也就是说允许程序产生例外状况。而在学Java 的时候,我们也只知道Exception 的写法,却未必真能了解不同种类的Exception 的区别。
首先,您应该知道的是Java 提供了两种Exception 的模式,一种是执行的时候所产生的Exception (Runtime Exception),另外一种则是受控制的Exception (Checked Exception)。
所有的Checked Exception 均从java.lang.Exception 继承而来,而Runtime Exception 则继承java.lang.RuntimeException 或java.lang.Error (实际上java.lang.RuntimeException 的上一层也是java.lang.Exception)。
当我们撰写程序的时候,我们很可能会对选择某种形式的Exception 感到困扰,到底我应该选择Runtime Exception 还是Checked Exception ?
其实,在运作上,我们可以通过Class 的Method 如何产生某个Exception以及某个程序如何处理这个被产生来的Exception 来了解它们之间的差异。
首先我们先建立一个Exception
public class CException extends Exception
{
public CException() {}
public CException(String message)
{
super(message);
}
}
然后我们撰写一个可能产生 CException 的 Class
public class testException
{
public void method1() throws CException
{
throw new CException("Test Exception");
}
public void method2(String msg)
{
if(msg == null)
{
throw new NullPointerException("Message is null");
}
}
public void method3() throws CException
{
method1();
}
// 以下省略
// ...
}
在这三个method 中,我们看到了method1 和method2 的程序码内都会产生Exception,但method3 的程序码中(大括号内),并没产生Exception,但在method3 的定义中,暗示了这个method 可能产生CException。
呼叫method1() 的程序,必须将method1() 包含在try 与catch 中,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
try
{
te.method1();
}
catch(CException ce)
{
// ....
}
}
// ...
}
虽然包含在try 与catch 中,并不表示这段程序码一定会收到CException,但它的用意在于提醒呼叫者,执行这个method 可能产生的意外,而使用者也必须要能针对这个意外做出相对应的处理方式。
当使用者呼叫method2() 时,并不需要使用try 和catch 将程序码包起来,因为method2 的定义中,并没有throws 任何的Exception ,如:
public class runtest
{
// ....
public static void main(String argv[])
{
testException te = new testException();
// 不会产生 Exception
te.method2("Hello");
// 会产生 Exception
te.method2(null);
}
// ...
}
程序在执行的时候,也不见得会真的产生NullPointerException ,这种Exception 叫做runtime exception 也有人称为unchecked exception ,产生Runtime Exception 的method (在这个范例中是method2) 并不需要在宣告method 的时候定义它将会产生哪一种Exception 。
在testException 的method3() 中,我们看到了另外一种状况,也就是method3里呼叫了method1() ,但却没有将method1 包在try 和catch 之间。相反,在method3() 的定义中,它定义了CException,实际上就是如果method3 收到了CException ,它将不处理这个CException ,而将它往外丢。当然,由于method3 的定义中有throws CException ,因此呼叫method3 的程序码也需要有try catch 才行。
因此从程序的运作机制上看,Runtime Exception与Checked Exception 不一样,然而从逻辑上看,Runtime Exception 与Checked Exception 在使用的目的上也不一样。
一般而言,Checked Exception 表示这个Exception 必须要被处理,也就是说程序设计者应该已经知道可能会收到某个Exception(因为要try catch住) ,所以程序设计者应该能针对这些不同的Checked Exception 做出不同的处理。
而Runtime Exception 通常会暗示着程序上的错误,这种错误会导致程序设计者无法处理,而造成程序无法继续执行下去。
看看下面的例子:
String message[] = {"message1", "message2","message3"};
System.out.println(message[3]);
这段程序码在Compile 时并没问题,但在执行时则会出现ArrayIndexOutOfBoundException 的例外,在这种状况下,我们亦无法针对这个Runtime Exception 做出有意义的动作,这就像是我们呼叫了testException 中的method2 ,却引发了它的NullPointerException 一样,在这种状况下,我们必须对程序码进行修改,从而避免这个问题。
因此,实际上我们应该也必须要去抓取所有的Checked Exception,同时最好能在这些Checked Exception 发生的时候做出相对应的处理,好让程序能面对不同的状况。
然而对于Runtime Exception ,有些人建议将它catch 住,然后导向其它地方,让程序继续执行下去,这种作法并非不好,但它会让我们在某些测试工具下认为我们的程序码没有问题,因为我们将Runtime Exception "处理"掉了,事实却不然!譬如很多人的习惯是在程序的进入点后用个大大的try catch 包起来,如:
public class runtest1
{
public static void main(String argv[])
{
try
{
//...
}
catch(Exception e)
{
}
}
}
在这种情况下,我们很可能会不知道发生了什么Exception 或是从哪一行发出的,因此在面对不同的Checked Exception时,我们可已分别去try catch它。而在测试阶段时,如果碰到Runtime Exception ,我们可以让它就这样发生,接着再去修改我们的程序码,让它避免Runtime Exception,否则,我们就应该仔细追究每一个Exception ,直到我们可以确定它不会有Runtime Exception 为止!
对于Checked Exception 与Runtime Exception ,我想应该有不少人会有不同的观点,无论如何,程序先要能执行,这些Exception 才有机会产生。因此,我们可以把这些Exception 当成是Bug ,也可以当成是不同的状况(Checked Exception),或当成是帮助我们除错的工具(Runtime Exception),但前提是我们需要处理这些Exception ,如果不处理,那么问题或状况就会永远留在那里。
分享到:
相关推荐
Java 中 Checked Exception 与 Runtime Exception 的区别 Java 中的异常处理机制是 Java 语言的一个重要特色,它允许程序产生例外状况。在学习 Java 时,我们需要了解不同种类的异常的区别。Java 提供了两种异常...
能够区分checked exception和 runtime exception 会使用 try-catch-finally 处理异常 方法声明异常 抛出异常 自定义异常类 语法错误, 运行期错误, 逻辑错误 语法错误: 没有遵循语法规则导致的错误。 运行期错误: ...
另外,method3()本身并不会抛出exception,可是它却声明会抛出CheckedException。在向你解释之前,让我们先来看看这个类的main()方法: public static void main( String[] args ) { ...
Exception 又可以分为两种:Checked Exception 和 Runtime Exception。Checked Exception 是编译器检查的异常,例如 IOException、SQLException 等。Runtime Exception 是运行时异常,例如 NullPointerException、...
### Checked Exception与Runtime Exception的选择 在给定的文件中,通过买虾的例子形象地说明了两种异常的区别及其处理策略。`Checked Exception`类似于需要你直接面对并处理的情况,即如果你知道如何解决或者可以...
异常类可以分为两种:Checked Exception 和 Runtime Exception。 1. Checked Exception Checked Exception 是指编译器检查的异常。这种异常需要在方法的throws子句中声明,否则编译器将报错。例如,IOException ...
Exception 则是可以捕捉的,Java 提供了两类主要的异常:runtime exception 和 checked exception。checked 异常也就是我们经常遇到的 IO 异常,以及 SQL 异常都是这种异常。对于这种异常,JAVA 编译器强制要求我们...
异常分为两种类型:检查性异常(Checked Exceptions)和运行时异常(Runtime Exceptions)。检查性异常是那些在编译时就应当预见并处理的异常,如`IOException`、`SQLException`等。如果可能抛出检查性异常的方法...
本资源对Java语言程序设计基础篇的Chapter 17 Exceptions and Assertions进行了详细的解释和知识点总结,涵盖了Java异常类的继承结构、claiming exceptions、checked exception和unchecked exception、throw语句和...
Java 异常可以分为两大类:Checked Exception 和 Runtime Exception。 Checked Exception 是编译器在编译过程中检查的异常,这些异常必须在编译时被捕获和处理。常见的 Checked Exception 有 IOException、...
`Exception`类进一步分为两种主要类型:`Checked Exception`和`Runtime Exception`。`Checked Exception`是那些在编译时期就需要检查并处理的异常,它们通常是从`java.lang.Exception`直接或间接继承的,例如`...
异常类(`Exception`)是 `Throwable` 类的一个子类,它又分为两大类:检查性异常(`Checked Exception`)和运行时异常(`Runtime Exception`)。本篇将重点讨论运行时异常及其常见类型。 #### 运行时异常(`...
在Java编程语言中,"Runtime-Exception-Rams"可能指的是运行时异常(RuntimeException)和它在内存管理(尤其是RAM,即随机存取存储器)中的影响。运行时异常是程序执行过程中可能发生的一类异常,它们通常表示编程...
Exception是程序运行过程中可以预期的异常情况,分为Checked Exception(编译时需要处理)和Runtime Exception(运行时异常)。Checked Exception需要在编译期间显式处理,而Runtime Exception则不一定需要,但建议...
* checked exception:Java中的checked exception需要在编译时检查。 * unchecked exception:Java中的unchecked exception可以在运行时抛出。 Java中的垃圾回收 Java中的垃圾回收机制可以自动回收垃圾对象。 * ...
本篇将深入探讨“【独家高薪笔面试题库】与【实战配套练习演练】9.Exception异常1”中的相关知识点。 首先,我们来了解“检查异常”(Checked Exceptions)。这类异常通常是由外部条件引起,如文件不存在、网络连接...
Java 异常继承及运行时异常与一般异常的区别 Java 异常继承结构中, Throwable 是所有异常的根,下面有两个重要的子类:Error 和 Exception。Error 表示程序无法处理的错误,表示运行应用程序中较严重问题。...
此外,异常分为检查异常(checked exceptions)和运行时异常(runtime exceptions)。检查异常是在编译时强制要求处理的异常,而运行时异常则在运行时出现,不强制处理。 理解并正确处理这些异常对于编写健壮、可...
- **编译时异常** (`Checked Exception`):这些异常在编译时会被检查,如果方法中可能会抛出此类异常,则必须在方法签名中声明,或者在方法体内通过 try-catch 块处理。 - **运行时异常** (`Runtime Exception`):...