《Java核心技术 卷1 基础知识》四

第7章 异常、断言和日志

异常

在Java中,所有异常对象都是派生于Throwable类的一个实例。
如果Java内置的异常类不能够满足需求,用户可以创建自己的异常类

Error类层次结构描述了Java运行时系统的内部错误和自愿耗尽错误,应用程序不应该抛出这种类型的对象。
Exception层次结构又分解为两个分支,一个分支派生于RuntimeException;另一个分支包含其他异常。
划分这两个分支的规则为:
由程序错误导致的异常属于RuntimeException;
程序本身没有问题,但由于像I/O错误这类问题导致的属于其它异常

一般来说,属于RuntimeException的有:

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

正所谓,“如果出现RuntimeException异常,那么就一定是你的问题。”
不属于RuntimeException的异常有:

  • 试图在文件尾部后面读取数据
  • 试图打开一个不存在的文件

Java将派生于Error类或RuntimeException类的所有异常称为非受查异常,所有其他的异常称为受查异常
而编译器将核查是否为所有的受查异常提供了异常处理器

一个方法不仅需要告诉编译器要返回什么值,还要告诉编译器有可能发生什么错误

一个方法必须声明所有可能抛出的受查异常,而非受查异常要么不可控制(Error),要么应该避免发生(RuntimeException)
如果方法没有声明所有可能发生的受查异常,编译器就会发出一个错误信息,使用throws关键字声明受查异常

使用throw关键字抛出异常。此时,只将异常作为对象抛出,不对其进行处理。
抛出一个已经存在的异常类非常容易,
若是遇到任何标准异常类都没有能够充分地描述清楚的问题,就需要创建自己的异常类,
即定义一个派生于Exception的类或者派生于Exception子类的类。

如果某个异常发生时没有在任何地方进行捕获,那程序就会终止执行,并在控制台上打印出异常信息。
要想捕获异常必须要设置try/catch语句块
在一个try语句块中可以捕获多个异常类型,每个异常类型使用一个单独的catch子句

而在catch子句中也可以再次抛出异常,这么做的目的是为了改变异常的类型

不管有无异常被捕获,finally子句的代码都会被执行

使用异常机制的技巧:

  • 只在异常情况下使用异常机制,不可用作测试
  • 不要过分地细化异常;如不要将一条语句封装在一个独立地try语句中
  • 利用异常层次;不要只抛出RuntimeException,要寻找更加适当的子类或创建自己的异常类
  • 不要压制异常;在Java中,往往强烈地倾向于关闭异常
  • 在检查错误时,“苛刻”要比放任好
  • 不要羞于传递异常

断言

断言机制允许在测试期间想代码插入一些检查语句。当代码发布时,这些插入的测试语句将被自动地移走
Java引入了关键字assert,对应的有两种形式
assert 条件;
assert 条件:表达式;

这两种形式都会对条件进行检测,若结果为false,则抛出一个AssertError异常。
在第二种形式中,表达式将会被传入AssertError的构造器,并转换成一个消息字符串

在默认情况下,断言被禁用,需要开启。

什么时候使用断言呢?

  • 断言失败是致命的,不可恢复的错误
  • 断言检查只用于开发和测试阶段。断言只应该用于在测试阶段确定程序内部的错误。

记录日志

每个Java程序员都很熟悉在有问题的代码中插入System.out.println方法调用来帮助观察程序运行的过程,
而一旦发现问题的根源,就要将这个打印语句删除。若其他地方还有问题,则需要重复这种写打印语句又删除的行为。
而记录日志则提供了一种更为科学的方法。

要生成简单的日志记录,可以使用全局日志记录器并调用其info方法:
Logger.getGlobal().info("File->Open menu item seleceted");

但是在适当的地方(如main开始)调用
Logger.getGlobal.setLevel(Level.OFF);
就会取消所有的日志。

在一个专业的应用程序中,不要将所有的日志都记录到一个全局日志记录器中,而是可以自定义日志记录器
可以调用getLogger方法来创建或者获取记录器
private static final Logger myLogger = Logger.getLogger("com.mycompany.myapp");
用一个静态变量存储日志记录器的引用

记录日志的常见用途是记录那些不可预料的异常

原文地址:https://www.cnblogs.com/ASE265/p/12240801.html

时间: 2024-11-08 19:17:17

《Java核心技术 卷1 基础知识》四的相关文章

[基础] Java目录(摘自Java核心技术·卷1 基础知识)

Java核心技术·卷1 基础知识(原书第9版) 第1章 Java程序设计概述 1.1 Java程序设计平台 1.2 Java"白皮书"的关键术语 1.2.1 简单性 1.2.2 面向对象 1.2.3 网络技能 1.2.4 健壮性 1.2.5 安全性 1.2.6 体系结构中立 1.2.7 可移植性 1.2.8 解释型 1.2.9 高性能 1.2.10 多线程 1.2.11 动态性 1.3 Java applet与Internet 1.4 Java发展简史 1.5 关于Java的常见误解

《java核心技术 卷1 基础知识》二

<Java核心技术 卷1 基础知识>第4-5章 在Java中没有类就无法做任何事情 new操作符的返回值是一个引用 在Java中,如果使用一个未初始化的指针,运行系统会产生一个运行时错误. Date 用来表示时间点 LocalDate 日历表示法 同时不推荐使用Date类来处理日历 推荐使用LocalDate来处理日历 每一个拥有名字的类都会被编译生成对应的class文件 所有的Java对象都是在堆中构造的,构造器总是随着new操作符一起使用 在Java中,所有的方法都必须在类的内部定义,但并

《Java核心技术 卷1 基础知识》三

<Java核心技术 卷1 基础知识> 第六章 接口和内部类 接口不是类,而是对类的的一组需求描述. 接口不能包含实例域--接口没有实例 可以将接口看作没有实例域的抽象类 要将类声明为实现某个接口,需要使用关键字implements. 类实现一个接口的具体步骤为: 1)使用implements关键字进行声明要实现的接口 2)对接口中的所有方法进行定义 接口中的所有方法默认为public 但在实现接口时需要声明为public 这里介绍了Comparable接口,该接口只有一个方法,compareT

《Java核心技术 卷1 基础知识》七

<Java核心技术 卷1 基础知识> 第10章 图形程序设计 在Java1.0刚出现时,就包含了一个基本GUI程序设计的类库,即抽象窗口工具箱(Abstract Window Toolkit,AWT) 基本AWT库采用将处理用户界面元素的任务委派给每个目标平台(如windows.Macintosh等)的本地GUI工具箱的方式, 由本地工具箱负责用户界面元素的创建和动作 但由于在不同的平台上,操作行为有一些微妙的差别 因此,AWT也由"一次编写,随处使用"变为"一次

《Java核心技术 卷1 基础知识》一

<java核心技术卷1 第1-3章> JDK Java Development Kit ,即Java开发工具包 但这个工具包的1.2-1.4版本被称为Java SDK,随后才改名为JDK JRE Java运行时环境,它包含虚拟机但不包括编译器 Java SE,Java Standard Edition,Java标准版本 Java EE,Java Enterprise Edition,Java企业版本 Java ME,Java Micro Edition,Java微观版本 Java2 这种提法始

《Java核心技术 卷1 基础知识 原书第9版》pdf

下载地址:网盘下载 内容简介 编辑 CayS.Horstmann等编著,公飞编译的<Java核心技术>(CoreJava)自第1版出版以来,一直备受广大Java程序设计人员的青睐,畅销不衰,是Java经典书籍.第8版针对JavaSE6平台进行了全面更新,囊括了Java平台标准版(JavaSE/J2SE)的全部基础知识,提供了大量完整且具有实际意义的应用实例,详细介绍了Java语言基础知识.面向对象程序设计.接口与内部类.事件监听器模型.swing图形用户界面程序设计.打包应用程序.异常处理.登

Java核心技术 卷1 基础知识-第一天

基本数据类型 java是一种强数据类的的语言 共有8种基本数据类型 其中: 整型4种 int(4字节) short(2字节) long(8字节) byte(1字节) java中整型的范围与机器无关 长度是一定的,不会因为跨平台造成整数溢出 浮点型 两种 double float double的长度是float长度的两倍,双精度数值 但部分都是使用double ,在表示的时候 如果写作3.24 编译器会人会认为是double型 3.24F是float型 浮点数有三个特殊值 正无穷大 (正整数除以0

Java details from Java核心技术 卷1 基础知识(1)

Java是一种包括语言.虚拟机.即时编译.类库.执行环境的平台: 执行环境提供安全性.跨操作系统的可移植性.自动垃圾收集等服务: 设计初衷:简单性.面向对象.网络技能.健壮性.安全性.体系结构中立.可移植性.解释型.高性能.多线程.动态性 简单性:Java剔除了C++中的:头文件.指针运算(甚至指针语法).结构.联合.操作符重载.虚基类等: 面向对象:一种程序设计技术.C++多继承:Java单继承+接口.Java中元类模型(metaclass): 网络技能:Java应用程序能够通过URL打开和访

Java 核心技术 卷1 基础知识 List 13.1

List 13.1  LinkList/LinkedListTest.java java容器之LinkList package linkList; import java.util.LinkedList; import java.util.List; import java.util.ListIterator; public class LinkListTest{ public static void main(String args[]){ List<String> a=new Linked