`
qu_xiangjun805
  • 浏览: 20295 次
  • 性别: Icon_minigender_1
  • 来自: 上海
最近访客 更多访客>>
社区版块
存档分类
最新评论
阅读更多
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基础第七章内部类与异常类.doc

    Java 基础第七章内部类与异常类 Java 语言支持在一个类中定义另一个类,这样的类称做内部类。内部类和外嵌类之间存在着紧密的关系:内部类可以访问外嵌类的成员变量和方法,而外嵌类也可以使用内部类声明的对象作为...

    异常类的使用

    ### 异常类的使用详解 #### 实验背景与目的 在本次实验中,主要目的是让学生理解并掌握Java中的异常处理机制以及如何自定义异常类。通过比较学生对象和工人对象,若尝试对两者进行比较,则会触发异常,以此来学习...

    java语言时间异常类

    Java提供了丰富的异常类来表示不同类型的错误,其中就包括与时间相关的异常。本文将深入探讨Java中的时间异常类及其在处理时间问题时的重要性。 在Java中,时间处理主要涉及到`java.util.Date`、`java.time`包...

    QJ 3026-1998 软件异常分类

    1. **运行时异常**:这类异常在程序执行期间发生,通常由非法操作引起,如除以零、数组越界、空指针引用等。运行时异常需要立即处理,因为它们可能导致程序崩溃。 2. **逻辑错误**:逻辑错误是程序员在设计算法或...

    实验报告8++内部类与异常类.zip

    实验报告8++内部类与异常类

    c++标准异常类1

    在描述中提到的`bad_exception`是C++标准异常类的一个特殊成员,它在特定情况下被用来表示程序中出现了未预期的异常。 `exception`类是所有标准异常的基类,位于 `<exception>` 头文件中。这个类提供了几个关键的...

    实现一个自定义异常类IntegerException

    在深入探讨如何实现一个自定义异常类`IntegerException`之前,我们先理解一下在Java编程语言中异常处理的重要性。异常处理是程序设计中一个至关重要的部分,它允许程序员捕获和响应程序运行时可能发生的错误情况,...

    java 文件名大小限制异常类java 文件名大小限制异常类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程序 自定义异常类Java SE...

    C++ 异常类 抛出与捕获异常

    本篇将深入探讨C++中的异常类,以及如何抛出和捕获异常,以实现稳健的代码。 首先,C++的异常处理基于三个关键字:`try`、`catch` 和 `throw`。`try` 块用来包含可能抛出异常的代码,`catch` 块用于捕获并处理这些...

    Java面向对象程序设计第6章_内部类与异常类

    Java面向对象程序设计第6章_内部类与异常类

    java 异常详解,java异常分类,创建自己的异常

    Exception 类是可以被捕捉并且可能恢复的异常类,可以继承 Exception 类生成自己的异常类。Error 类一般被认为是不可恢复和不可捕捉的异常类。 Java 异常处理可以分为以下几个步骤: 1. 抛出异常:在 Java 中,...

    Java异常处理-自定义异常类及课后练习

    【Java异常处理-自定义异常类及课后练习】 在Java编程中,异常处理是程序健壮性的重要组成部分。Java提供了丰富的预定义异常类,但有时这些预定义的异常类并不能满足特定业务需求,这时就需要自定义异常类。自定义...

    Java的异常类

    ### Java的异常类详解 #### 一、概述 在Java编程中,异常处理是一项非常重要的技术,它能够帮助开发者有效地管理程序运行时可能出现的各种错误情况。Java中的异常类主要分为两大类:`Error`和`Exception`。前者...

    JAVA实验十一 异常处理与集合类

    1. **自定义异常类**: `NotEnoughBalanceException`是继承自`Exception`类的,用于表示尝试从`SavingsAccount`类中取出的金额超过了账户余额。当`withdraw`方法检测到这种情况时,会抛出这个异常,并附带当前余额...

    自定义异常类步骤

    本文将基于给定的文件信息,深入解析“自定义异常类步骤”这一主题,涵盖异常处理的基本概念、自定义异常类的设计与实现,以及如何在实际代码中应用这些自定义异常。 ### 异常处理概述 异常处理是一种编程机制,...

    内部类与异常类.doc

    内部类与异常类 在 Java 编程语言中,内部类和异常类是两个重要的概念。内部类是指在一个类的内部定义的类,而异常类是指用于处理异常情况的类。在本节中,我们将详细介绍内部类和异常类的概念、特点和使用方法。 ...

    精通Python异常处理:自定义异常类的定义与实践

    Python的异常处理机制不仅包括内置的异常类,还允许开发者定义自己的异常类,以更好地表达程序中可能出现的错误情况。本文将详细介绍如何在Python中定义自定义异常类,并提供丰富的代码示例和最佳实践。 自定义异常...

    Python中的异常处理:自定义异常类详解

    Python提供了一个内置的异常层次结构,但开发者也可以定义自己的异常类,以满足特定的错误处理需求。本文将详细介绍如何在Python中定义和使用自定义异常类,包括代码示例和最佳实践。 自定义异常类是Python异常处理...

Global site tag (gtag.js) - Google Analytics