blog
  • 吕系小的博客
  • Java
    • 读书笔记
      • Thinking in Java
        • Object
          • 面向对象
          • 对象的创建与生命周期
          • 对象与基本类型的存储位置
        • 控制流程
          • 实现类似goto的操作
        • 初始化与清理
          • 对象的创建过程
          • 垃圾回收器如何工作
          • JIT
        • 复用类
          • 继承与初始化
          • final关键字
        • 多态
          • 构造器和多态
          • 方法和调用绑定
      • Java核心技术卷1
        • 面向对象
        • Unicode和char类型
        • Object:所有类的超类
        • 理解方法调用
        • 代理
        • lambda
        • 接口
        • 异常
        • 并发
          • 线程
          • volatile
          • 阻塞队列
          • 线程安全的集合
          • Callable与Future
          • 同步
          • 执行器
      • Java核心技术卷2
        • 流库
          • 流
          • 并行流
          • 基本类型流
          • 约简操作
          • 群组、分区、下游收集器
          • 收集结果
          • Optional
        • IO
          • 输入、输出流
          • 组合流过滤器
          • 文本输入与输出
          • 字符编码方式
          • 读写二进制数据
          • 随机访问文件
          • 对象输入、输出流与序列化
          • Path
          • 目录
          • 内存映射文件
          • Files
        • 日期和时间
          • 时间线
          • 本地时间
          • 日期调整期
          • 时区时间
          • 格式化和解析
        • 脚本、编译与注解处理
          • 脚本
          • 编译器
          • 注解
          • 标准注解
          • 源码级注解处理
        • 安全
          • 类加载器
          • 安全管理器与访问权限
          • 数字签名
      • 深入理解Java虚拟机
        • Java内存区域
        • 垃圾收集机制
      • Head First Java
        • Chapter1.Breaking the Sur face
        • Chapter2.A Trip to Objectville.There will be objects.
        • Chapter3.Know Your Variables
        • Chapter4.How Objects Behave
        • Chapter7.Better Living in Objectville
        • Chapter9.constructors and garbage collection
        • Chapter10.statics
      • 深入分析JavaWeb技术内幕
        • 深入web请求过程
        • 深入分析JavaIO的工作机制
      • Spring IN ACTION
        • Spring之旅
          • 依赖注入
          • IOC 容器
        • 装配bean
          • 组件扫描与自动装配
          • 通过Java代码装配bean
        • 高级装配
          • profile
          • 条件化bean
          • 处理自动装配的歧义性
          • bean的作用域
          • Environment
          • 属性占位符
    • 前后端那些事
      • 跨域访问
      • Token验证机制
    • 学习笔记
  • 数据库
    • MySQL
      • 基础篇
        • SQL分类及帮助文档
        • MySQL架构
        • 存储引擎
        • MySQL支持的数据类型
        • 数据类型的选择
        • 常用函数
      • 索引篇
        • 索引
      • 事务篇
      • 实际问题
        • 成绩分组取最大值问题
  • 计算机操作系统
    • 计算机操作系统组成与分类
    • 进程
      • 进程
      • 进程管理
      • 多线程结构进程
      • KLT与ULK
      • 处理器调度
    • 存储管理
      • 存储管理的主要模式
      • 存储管理的功能
      • 虚拟存储器的概念
      • 存储器的硬件支撑
      • 页式存储管理的基本原理
      • 页式虚拟存储管理
      • 页面调度
      • 反置页表
      • 段式存储管理
      • 段式虚拟存储
      • 段页式存储管理
    • 设备管理
      • IO缓冲区
    • 文件管理
      • 文件的存储
      • 文件的逻辑结构
      • 文件的物理结构
Powered by GitBook
On this page
  • 异常分类(P265-267)
  • throw 和 throws
  • 带资源的try语句(P278-279)
  • 分析堆栈轨迹元素(P280-281)
  • 相关API
  1. Java
  2. 读书笔记
  3. Java核心技术卷1

异常

异常分类(P265-267)

在Java程序设计中,所有的异常都是由Throwable继承而来,但在下一层立即分解为两个分支:Error和Exception。

Error类层次结构描述了Java运行时系统的内部错误和资源耗尽错误。应用程序不应该抛出这种类型的对象。如果出现了这样的内部错误,除了通告给用户,并尽力使程序安全地终止之外,再也无能为力了。

Exception层次结构又分解为两个分支:一个分支派生于RuntimeException。另一个分支包含其他异常。划分两个分支的规则是:由程序错误导致的异常属于RuntimeException;而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。

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

  • 错误的类型转换

  • 数组访问越界

  • 访问null指针

不是派生于RuntimeException的异常包括:

  • 试图在文件尾部后面读取数据

  • 试图打开一个不存在的文件

  • 试图根据给定的字符串查找Class对象,而这个字符串表示的类并不存在

Java语言规范将派生于Error类或RuntimeException类的所有异常称为非受查(unchecked)异常,所有其他的异常称为受查(checked)异常。编译器将核查是否为所有的受查异常提供了异常处理器。

throw 和 throws

  • throws

    • 声明这个方法会抛出这种类型的异常,使其他地方调用它时知道要捕获这个异常

  • throw

    • try/catch模块中抛出一个异常对象,表示异常已经发生,会终止程序运行(finally依然会运行)。

带资源的try语句(P278-279)

假设资源属于一个实现了AutoCloseable接口的类,Java SE 7 为这种代码模式提供了一个很有用的快捷方式。AutoCloseable接口有一个方法:

void close() throws Exception

另外,还有一个Closeable接口。这是AutoCloseable的子接口,也包含一个close方法。不过,这个方法声明为抛出一个IOException。

带资源的try语句(try-with-resources)的最简形式为:

try(Resource res = ...) {
    work with res
}

try块退出时,会自动调用res.close(),catch和finally子句会在关闭资源之后执行。

不带资源的try语句如果try块抛出一个异常,而且close方法也抛出一个异常,这就会带来一个难题:try块抛出的异常会被close方法抛出的异常覆盖。带资源的try语句可以很好地处理这种情况。原来的异常会重新抛出,而close方法抛出的异常会“被抑制”。这些异常将自动捕获,并由addSuppressed方法增加到原来的异常。如果对这些异常感兴趣,可以调用getSuppressed方法,它会得到从close方法抛出并被抑制的异常列表。

分析堆栈轨迹元素(P280-281)

堆栈轨迹(stack trace)是一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。当Java程序正常终止,而没有捕获异常时,这个表就会显示出来。

可以调用Throwable类的printStackTrace方法访问堆栈轨迹的文本描述信息。

Throwable t = new Throwable();
StringWriter out = new StringWriter();
t.printStackTrace(new PrintWriter(out));
String description = out.toString();

一种更灵活的方法是使用getStackTrace方法,它会得到StackTraceElement对象的一个数组。StackTraceElement类含有能够获得文件名和当前执行的代码行号的方法,同时,还含有能够获得类名和方法名的方法。

Throwable t = new Throwable();
StackTraceElement[] frames = t.getStackTrace();
for(StackTraceElement frame : frames)
    analyze frame

静态的Thread.getAllStackTrace方法,它可以产生所有线程的堆栈轨迹。

Map<Thread,StackTraceElement[]> map = Thread.getAllStackTraces();
for(Thread t : map.keySet()) {
    StackTraceElement[] frames = map.get(t);
    analyze frames
}

相关API

  • java.lang.Throwable 1.0

    • Throwable(Throwable cause) 1.4

    • Throwable(String message , Throwable cause) 1.4

      • 用给定的“原因”构造一个Throwable对象。

    • Throwable initCause(Throwable cause) 1.4

      • 将这个对象设置为“原因”。如果这个对象已经被设置为“原因”,则抛出一个异常。返回this引用。

    • Throwable getCause() 1.4

      • 获得设置为这个对象的“原因”的异常对象。如果没有设置“原因”,则返回null。

    • StackTraceElement[] getStackTrace() 1.4

      • 获得构造这个对象时调用堆栈的跟踪。

    • void addSuppressed(Throwable t) 7

      • 为这个异常增加一个“抑制”异常。这出现在带资源的try语句中,其中t是close方法抛出的一个异常。

    • Throwable[] getSuppressed() 7

      • 得到这个异常的所有“抑制”异常。一般来说,这些是带资源的try语句中close方法抛出的异常。

  • java.langh.Exception 1.0

    • Exception(Throwable cause) 1.4

    • Exception(String message , Throwable cause)

      • 用给定的“原因”构造一个异常对象。

  • java.lang.RuntimeException 1.0

    • RuntimeException(Throwable cause) 1.4

    • RuntimeException(String message, Throwable cause) 1.4

      • 用给定的“原因”构造一个RuntimeException对象。

  • java.lang.StackTraceElement 1.4

    • String getFileName()

      • 返回这个元素运行时对应的源文件名。如果这个信息不存在,则返回null。

    • int getLineNumber()

      • 返回这个元素运行时对应的源文件行数。如果这个信息不存在,则返回 -1。

    • String getClassName()

      • 返回这个元素运行时对应的类的完全限定名。

    • String getMethodNmae()

      • 返回这个元素运行时对应的方法名。构造器名是;静态初始化器名是。这里无法区分同名的重载方法。

    • boolean isNativeMethod()

      • 如果这个元素运行时在一个native方法中,则返回true。

    • String toString()

      • 如果存在的话,返回一个包含类名、方法名、文件名和行数的格式化字符串。

Previous接口Next并发

Last updated 6 years ago