首先,您应该知道的是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 做出不同的处理。
分享到:
相关推荐
本资源对Java语言程序设计基础篇的Chapter 17 Exceptions and Assertions进行了详细的解释和知识点总结,涵盖了Java异常类的继承结构、claiming exceptions、checked exception和unchecked exception、throw语句和...
Java中的异常可以是 checked exception 或 unchecked exception。 * checked exception:Java中的checked exception需要在编译时检查。 * unchecked exception:Java中的unchecked exception可以在运行时抛出。 ...
在Java中,异常分为检查异常(Checked Exception)和运行时异常(Unchecked Exception)两大类。 1. **运行时异常(Unchecked Exception)**: 这些异常是继承自`java.lang.RuntimeException`的异常。与检查异常...
异常链使得开发者能够将受检查异常(checked exception)转换为不受检查异常(unchecked exception),例如,通过在受检查异常内部抛出一个Runtime Exception。 接下来,我们转向英语面试的基本技巧。面试的开场白...
而`unchecked exception`(也称为`runtime exception`)则不需要在编译时捕获或声明,如`NullPointerException`等。 - **Error与Exception的区别**:`Error`类通常表示系统级的错误,这些错误是无法预见且无法恢复的...
Exception分为受检异常(`Checked Exception`)和非受检异常(`Unchecked Exception`)。 ### 5. final 关键字的用途 - **final**:用来声明变量、方法或类不可更改。 - 当修饰变量时,变量的值一旦初始化就不能...
与Checked异常不同,Runtime异常在编译时不强制要求处理,但强烈建议进行捕获和处理,以防止程序意外终止。 3. **常见异常类**: - **Runtime异常**:包括`NullPointerException`、`IndexOutOfBoundsException`、`...
Java将异常分为两大类:Checked Exception和UnChecked Exception。 1. **Checked Exception**(非Runtime Exception):这些异常在编译时就需要被处理,通常是程序设计中的逻辑错误或者是外部资源访问问题。例如,`...
Java中的异常可以分为两大类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 - **受检异常**:这是由Java编译器强制要求处理的异常。如果一个方法可能抛出受检异常,那么要么在这个方法内部...
而Exception是应用程序可以捕获并处理的异常,包括检查异常(Checked Exception)和运行时异常(Unchecked Exception)。 检查异常是编译器强制要求处理的异常,例如`FileNotFoundException`、`IOException`等。...
相比之下,Unchecked Exception,也称为Runtime Exception,如NullPointerException、IllegalArgumentException等,它们通常表示编程错误,表明代码中存在逻辑缺陷,应当在编译阶段或测试阶段解决。 当应用遇到未...
** Java异常分为Error和Exception,Exception又分为Checked Exception和Unchecked Exception。 - **try-catch-finally语句块的作用?** 用于捕获并处理异常,finally块确保代码始终执行。 7. **集合框架** - **...
10. **异常分类**: Java异常分为检查异常(Checked Exception)和运行时异常(Unchecked Exception)。检查异常在编译时需要处理,而运行时异常在程序运行时抛出,通常与编程错误相关。 综上所述,"Java开发的SHELL...
- **异常处理**:Java中的异常分为检查型异常(Checked Exception)和运行时异常(Unchecked Exception)。理解如何使用try-catch-finally语句块、throw和throws关键字,以及自定义异常是基本要求。 - **集合框架*...
Java将异常分为两大类:**检查型异常**(Checked Exceptions)和**非检查型异常**(Unchecked Exceptions)。 1. **检查型异常**:这些异常是编译器强制要求处理的异常,如果不进行捕获或声明抛出,则编译会失败。通常...
* Java的异常可以分为checked exception和unchecked exception两种。 * Java的异常处理机制可以通过`throws`关键字来声明可能抛出的异常。 Java多线程编程 * Java的多线程编程可以通过`Thread`类或`Runnable`接口...
Java将异常分为两类:受检异常(Checked Exception)和非受检异常(Unchecked Exception)。 受检异常在编译时就需要被处理,这意味着如果方法可能抛出受检异常,那么该方法必须用`throws`关键字声明,或者在方法...
异常分为检查型异常(checked exception)和非检查型异常(unchecked exception),检查型异常必须被处理,非检查型异常则不必。 5. Java的类和对象:类是面向对象编程中的核心概念,它是创建对象的模板。对象是类...
而Exception是指程序本身可以处理的异常情况,分为checked异常和unchecked异常。 Checked异常必须被显式地捕获处理,否则程序无法通过编译。它包括了IOException、ClassNotFoundException等。unchecked异常又称为...