1.异常的定义
一个系统中定义异常应遵循如下几个原则:
a. 系统中如果某个模块功能比较单一,建议将所有异常放在一个package内;如果某个模块有很多子模块,建议将异常放各个对应子模块内;
b. 异常名称必须是自定义的;
c. 自定义异常都继承之Exception(不要继承RuntimeException);
d. 所有异常含有含有两个构造器:一个缺省构造器,一个用于构建异常链的构造器。
示例如下:
public class MyException1 extends Exception{
public MyException1() {
}
public MyException1(Throwable cause) {
super(cause);
}
}
2.异常的处理
在异常处理程序中遵循如下原则:
a. 本方法能处理的异常,异常处理程序中就处理掉,不向外层传递;
b. 本方法不能处理的异常,必须使用异常链,封装为本模块的异常向上传递。
示例如下:
public class test {
public static void f() throws MyException1{
throw new MyException1();
}
public static void main(String[] args) throws MyException2{
try {
f();
} catch(MyException1 e) {
throw new MyException2(e);
}
}
}
【注】:Bruce Eckel指出建议使用runtimeException封装异常。本人认为,在系统设计中不应该这么做,因为在开发实际系统是,各个模块开发人员不一样,如果开发人员用runtimeException封装了异常,其他使用该模块的开发人员很难知道模块中抛出了异常
在java的异常类体系中,Error和RuntimeException是非检查型异常,其他的都是检查型异常。
java语法中所有方法都可以在不声明throws的情况下抛出RuntimeException及其子类 ,但不可以在不声明的情况下抛出非RuntimeException,简单的说,非RuntimeException要自己写catch块处理掉。
比如
假设自己定义了个非RuntimeException: MyException
public String getFirstTwo(String src){
//if(src == null) throw new MyException( "String is null ");
return src.substring(0, 2);
}
注释的语句不放开,不会出错
如果别的地方调用了getFirstTwo(null),在getFirstTwo方法中,null.substring(0,2)方法是会抛出运行时异常NullPointerException的,虽然getFirstTwo方法并没有申明会throws NullPointerException,但是实际运行中这个异常还是会从getFirstTwo方法抛出给调用这个方法的地方。
而如果把注释语句放开,则无法通过编译,MyException是一个非运行时异常,如果方法中的语句可能抛出这个异常必须将方法声明为public String getFirstTwo(String src) throws MyException才可以理解!!!
常见的RuntimeException:
ClassCastException
NullPointerException
ArrayIndexOutOfBoundsException
IllegalArgumentException
NumberFormatException
也就是说,你如果不对运行时异常进行处理,那么出现运行时异常之后,要么是线程中止,要么是主程序终止。如果程序的退出刚好是你期望的结果,那就万事OK了。
下面内容来自网上:
但最近我在项目却遇的问题,恰恰是这因为没有对运行时异常进行处理,而导致程序在运行一小段时间后就当了。事情是这样的,由于写程序时我对多线程的并发处理不太会,也就把一个模块写成了单线程的,由它来循环处理一个数据队列。但没想到队列里面的数据有一些与预期的格式不一样,处理这样的数据时,程序就抛出了运行时异常。由于没有对异常进行处理,这个异常也就抛到了Thread.run()。最后这个处理线程肯定是被终止了,队列里面的数据也就不会再有程序去处理了。
这个结果显然不是我想要的,队列里面出现异常数据了,正常的处理应该是把异常数据舍弃,然后记录日志。不应该由于异常数据而,影响下面对正常数据的处理啊。
所以最后我在程序的循环处理模块,里面加了一个catch处理,来扑捉所有的异常,决不让这个处理线程退出,要知道我的所有数据还要依靠他来处理。在这个场景这样处理可能是一个比较好的应用,但并不代表在所有的场景你都应该如此。如果在其它场景,遇到了一些错误,如果退出程序比较好,这时你就可以不太理会运行时异常,或者是通过对异常的处理显式的控制程序退出。
知道了虚拟机怎么处理运行时异常,也更进一步理解了Sping对Hibernate的封装了。由于Hibernate是和数据库打交道,所以总是要抛出一些乱七八糟的checked异常,平时我们根本不想catch这些异常。
因为这些异常总是把代码弄的乱乱的,搞的到处都是try{} catch(){}块,并且常常加了catch块,也并不能把程序从异常中恢复过来(异常处理的目标之一就是为了把程序从异常中恢复出来)。为了通过编译器的检查,程序员被迫加上了catch块,往往这些catch并没有发挥他应有的作用,反而带来了很大的不便。所以Spring对Hibernate封装时就把Hibernate的异常进行了封装,全部封装成RuntimeException了。也就是说由Spring来扑捉Hibernate抛出的异常,然后Spring把异常转换成Spring自己定义的运行时异常再抛出。这样我们在编码时使用Spring来调用Hibernate时,可以不用catch块来处理一些不必要的异常。当然你确实要是想处理,也可以通过添加cathc块去处理异常。不过这个时候,你的Catch就要扑捉RuntimeException了,而不是一般的checked异常了。
分享到:
相关推荐
### 异常类:自定义异常类 #### 知识点概述 在程序设计中,异常处理是一项重要的机制,用于管理程序运行时可能发生的错误或意外情况。Java 提供了一套完整的异常处理机制,其中包括标准异常类以及允许开发人员...
Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...
### 异常类的使用详解 #### 实验背景与目的 在本次实验中,主要目的是让学生理解并掌握Java中的异常处理机制以及如何自定义异常类。通过比较学生对象和工人对象,若尝试对两者进行比较,则会触发异常,以此来学习...
Java提供了丰富的异常类来表示不同类型的错误,其中就包括与时间相关的异常。本文将深入探讨Java中的时间异常类及其在处理时间问题时的重要性。 在Java中,时间处理主要涉及到`java.util.Date`、`java.time`包...
1. **运行时异常**:这类异常在程序执行期间发生,通常由非法操作引起,如除以零、数组越界、空指针引用等。运行时异常需要立即处理,因为它们可能导致程序崩溃。 2. **逻辑错误**:逻辑错误是程序员在设计算法或...
实验报告8++内部类与异常类
在描述中提到的`bad_exception`是C++标准异常类的一个特殊成员,它在特定情况下被用来表示程序中出现了未预期的异常。 `exception`类是所有标准异常的基类,位于 `<exception>` 头文件中。这个类提供了几个关键的...
在深入探讨如何实现一个自定义异常类`IntegerException`之前,我们先理解一下在Java编程语言中异常处理的重要性。异常处理是程序设计中一个至关重要的部分,它允许程序员捕获和响应程序运行时可能发生的错误情况,...
java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类java 文件名大小限制异常类...
Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE程序 自定义异常类Java SE...
本篇将深入探讨C++中的异常类,以及如何抛出和捕获异常,以实现稳健的代码。 首先,C++的异常处理基于三个关键字:`try`、`catch` 和 `throw`。`try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些...
Java面向对象程序设计第6章_内部类与异常类
Exception 类是可以被捕捉并且可能恢复的异常类,可以继承 Exception 类生成自己的异常类。Error 类一般被认为是不可恢复和不可捕捉的异常类。 Java 异常处理可以分为以下几个步骤: 1. 抛出异常:在 Java 中,...
【Java异常处理-自定义异常类及课后练习】 在Java编程中,异常处理是程序健壮性的重要组成部分。Java提供了丰富的预定义异常类,但有时这些预定义的异常类并不能满足特定业务需求,这时就需要自定义异常类。自定义...
### Java的异常类详解 #### 一、概述 在Java编程中,异常处理是一项非常重要的技术,它能够帮助开发者有效地管理程序运行时可能出现的各种错误情况。Java中的异常类主要分为两大类:`Error`和`Exception`。前者...
1. **自定义异常类**: `NotEnoughBalanceException`是继承自`Exception`类的,用于表示尝试从`SavingsAccount`类中取出的金额超过了账户余额。当`withdraw`方法检测到这种情况时,会抛出这个异常,并附带当前余额...
本文将基于给定的文件信息,深入解析“自定义异常类步骤”这一主题,涵盖异常处理的基本概念、自定义异常类的设计与实现,以及如何在实际代码中应用这些自定义异常。 ### 异常处理概述 异常处理是一种编程机制,...
内部类与异常类 在 Java 编程语言中,内部类和异常类是两个重要的概念。内部类是指在一个类的内部定义的类,而异常类是指用于处理异常情况的类。在本节中,我们将详细介绍内部类和异常类的概念、特点和使用方法。 ...
Python的异常处理机制不仅包括内置的异常类,还允许开发者定义自己的异常类,以更好地表达程序中可能出现的错误情况。本文将详细介绍如何在Python中定义自定义异常类,并提供丰富的代码示例和最佳实践。 自定义异常...
Python提供了一个内置的异常层次结构,但开发者也可以定义自己的异常类,以满足特定的错误处理需求。本文将详细介绍如何在Python中定义和使用自定义异常类,包括代码示例和最佳实践。 自定义异常类是Python异常处理...