一、概念和分类

JAVA程序设计语言中,异常对象都是Throwable类的一个实例。Throwable分为Error和Exception。

  其中,Error类层次结构描述了JAVA运行时系统的内部错误和资源耗尽错误,这种错误无法操作。在设计JAVA程序时,我们只需要关注Exception。

  Exception包含两个分支:

    1. RuntimeException
    2. 其他异常。

  划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于I/O错误这类问题导致的异常属于其他异常。

  RuntimeException即是运行时异常,即在程序运行的时候才出现的异常,又称“未检查异常”,意即“编译器未检查出的异常”。

  其他异常称为“已检查异常”。

  派生于RuntimeException的异常包含下面几种情况:

    • 错误的类型转换。
    • 数组访问越界
    • 访问空指针

  其他异常包括:

    • 试图在文件发问后面读取数据
    • 试图打开一个不存在的文件。
    • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在。

 二、异常的声明

  在JAVA的方法里,如果可能遇到无法处理的情况,比如要打开的文件并不存在,这时就要声明异常。声明异常的方法是在方法的首部声明所有可能抛出的异常。比如标准类库中的FileInputStream类的一个构造器的声明:

  

  一个方法必须声明所有可能抛出的已检查异常(Exception中RuntimeException之外的其他异常),而未检查异常要么不可控制(Error),要么就应该避免发生(RuntimeException)。

  如果一个方法没有声明所有可能发生的已检查异常,编译器就会报错。

三、异常的抛出

  异常的抛出使用“throw”关键字,比如一个方法可能出现EOFException,我们希望它抛出这个异常,可以用下面的语句:

  throw new EOFExcetion();

或: 

  EOFExcetion e = new EOFException();
  throw e;

  如果一个方法里使用了throw关键字抛出了一个异常,并且这个异常又不是RuntimeException,那么必须在方法首部用throws声明这个异常。

  如果一个方法用throws声明了一个异常,那么调用这个方法的方法就必须对这个异常进行捕获,或者继续声明。(这个有一点例外,如果父类方法中没有声明异常,那么子类在覆盖父类这个方法的时候也不能声明异常,见JComponent.paintComponent方法)

四、创建异常类

  有时候我们可能会遇到所有标准异常类都无法准确处理的问题,比如

  int age = -1;

  这行代码本身没有什么问题,但是实际上年龄不可能为负数。这个时候我们就需要自己来创建一个异常类:

  

  

五、异常的捕获

  如果某个异常没有在任何地方进行捕获,那么程序就会终止执行,并在控制台上打印出异常信息,其中包括异常的类型和堆栈和内容。

  要想捕获一个异常,必须设置 try/catch 语句块:

  try{
    someCode;
  }catch(ExceptionType e){
    handle for this Exception;
  }
  •   如果在try语句块中的任何代码抛出了一个在catch子句中有被说明的异常类,那么程序将跳过try语句块的其余代码,并且执行catch子句中的处理代码。
  •   如果在try语句块中的代码没有抛出任何异常,那么程序将跳过catch语句。
  •   如果方法中的任何代码抛出了一个在catch子句中没有声明的异常类型,那么这个方法就会立刻退出。

  

JAVA里的异常的更多相关文章

  1. Java 里的异常(Exception)详解

    作为一位初学者, 本屌也没有能力对异常谈得很深入.   只不过Java里关于Exception的东西实在是很多. 所以这篇文章很长就是了.. 一, 什么是java里的异常   由于java是c\c++ ...

  2. Java 中的异常和处理详解

    Java 中的异常和处理详解 原文出处: 代码钢琴家 简介 程序运行时,发生的不被期望的事件,它阻止了程序按照程序员的预期正常执行,这就是异常.异常发生时,是任程序自生自灭,立刻退出终止,还是输出错误 ...

  3. Core Java 总结(异常类问题)

    所有代码均在本地编译运行测试,环境为 Windows7 32位机器 + eclipse Mars.2 Release (4.5.2) 2016-10-17 整理 下面的代码输出结果是多少?为什么?并由 ...

  4. 【Java心得总结二】浅谈Java中的异常

    作为一个面向对象编程的程序员对于 下面的一句一定非常熟悉: try { // 代码块 } catch(Exception e) { // 异常处理 } finally { // 清理工作 } 就是面向 ...

  5. 关于java中的异常问题 1

    1.首先参考一下关于java异常处理方面的知识 查看博客http://lavasoft.blog.51cto.com/62575/18920/ 这里介绍的很好,下面从中学习到一些东西,摘抄如下: 1. ...

  6. [Effective Java]第九章 异常

    声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...

  7. 点评阿里JAVA手册之异常日志(异常处理 日志规约 )

    下载原版阿里JAVA开发手册  [阿里巴巴Java开发手册v1.2.0] 本文主要是对照阿里开发手册,注释自己在工作中运用情况. 本文内容:异常处理 日志规约 本文难度系数为一星(★) 本文为第三篇 ...

  8. (转)Java里的堆(heap)栈(stack)和方法区(method)(精华帖,多读读)

    [color=red][/color]<一> 基础数据类型直接在栈空间分配, 方法的形式参数,直接在栈空间分配,当方法调用完成后从栈空间回收.   引用数据类型,需要用new来创建,既在栈 ...

  9. java.util.ConcurrentModificationException 异常问题详解

    环境:JDK 1.8.0_111 在Java开发过程中,使用iterator遍历集合的同时对集合进行修改就会出现java.util.ConcurrentModificationException异常, ...

随机推荐

  1. js中原型继承的三种方式

  2. DeepLearning学习(1)--多层感知机

    想直接学习卷积神经网络,结果发现因为神经网络的基础较弱,学习起来比较困难,所以准备一步步学.并记录下来,其中会有很多摘抄. (一)什么是多层感知器和反向传播 1,单个神经元 神经网络的基本单元就是神经 ...

  3. redis原理分析

    基本全是参考http://blog.csdn.net/a600423444/article/details/8944601     redis的使用大家都很熟悉,可能除了watch 锁,pipelin ...

  4. Win32 OpenGL标准例子

    在VS2008的MSDN中有一个标准的OpenGL例子,记录如下: /* * Example of a Win32 OpenGL program. * The OpenGL code is the s ...

  5. MySQL的存储引擎

    MySQL的一个重要特性就是支持插件式存储引擎.其存储引擎接口定义良好,有兴趣的开发者可以通过阅读文档编写自己的存储引擎. 接下来简单介绍一下MySQL的常见存储引擎: 一.MyISAM MySQL ...

  6. 【Android端 APP 启动时长获取】启动时长获取方案及具体实施

    一.什么是启动时长? 1.启动时长一般包括三种场景,分别是:新装包的首次启动时长,冷启动时长.热启动时长 冷启动 和 热启动 : (1)冷启动:当启动应用时,后台没有该程序的进程,此时启动的话系统会分 ...

  7. 安卓开发 想要获取某个View的高度(我是在做滚动浮层的时候用到的)

    1.activity中有个onWindowFocusChanged()方法,可以获取控件的大小,别的地方可能会调用过早导致获取不到实际的大小 @Override public void onWindo ...

  8. 在Android项目中引入MuPdf

    由于公司手机App要加入一个附件查看功能,需要查看PDF文件,在网上找了许多第三方工具,最后选择了MuPDF. 更多第三方工具可以查看大神总结的:http://www.cnblogs.com/poke ...

  9. php常用的数组函数

    array_change_key_case -- 返回字符串键名全为小写或大写的数组 array_chunk -- 将一个数组分割成多个 array_combine --  创建一个数组,用一个数组的 ...

  10. NGUI BUG /各种坑

    以下为:NGUI3.6具体使用过程中碰到的 各种BUG /各种坑 备忘 1.UIToggle 使用UIToggle组件实现多个tab标签互斥,如果是在代码中动态的设置显示某个tab标签对应的内容,则需 ...