Java基础语法<十一> 异常 断言 日志 调试

1 处理错误

1.1 异常分类

Error类层次描述了Java运行时系统的内部错误和资源耗尽错误。

设计Java程序时,主要关注Exception层次结构。

由程序错误导致的异常属于RuntimeException ,而程序本身没有问题,但由于像I/O错误这类问题导致的异常属于其他异常。

RuntimeException包含下面几种情况:

  • 错误的类型转换 ClassCastException
  • 数组访问越界 ArrayIndexOutOfBoundsException
  • 访问空指针 NullPointerException
  • 指定的类不存在ClassNotFoundException
  • 数学运算符异常 ArithmeticException
  • 方法参数错误 IllegalArgumentException
  • 没有权限访问 IllegalAccessException

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

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

1.2 声明已检查异常

如果无法处理,抛出一个异常。

例如:一段读取文件的代码知道有可能读取的文件不存在,或者内容为空,因此试图处理文件信息的代码就需要通知编译器可能会抛出IOException类的异常。

在方法处 throws XXXException

1.3 如何抛出异常

方法体内

throw new XXXException();

1.4 创建异常类

定义一个派生于Exception或Exception子类的类

定义的类应该包含两个构造器

一个是默认构造器,另一个是带有详细描述信息的构造器

2 捕获异常

try catch

通常 应该捕获那些知道如何处理的异常,而将那些不知道怎样处理的异常继续进行传递。

try catch catch 。。。 捕获多个异常

catch中再次抛出异常

finally

不管是否有异常被捕获,finally子句中的代码都被执行。 关闭文件读入流,关闭资源时用到

3 使用异常机制的技巧

  • 异常处理不能代替简单的测试 使用if判断
  • 不要过分地细化异常
  • 利用异常层次结构
  • 不要压制异常
  • 在检测错误,苛刻要比放任好
  • 不要羞于传递异常

4 使用断言

断言机制允许在测试期间向代码中插入一些检查语句。当代吗发布时,这些插入的检测语句会自动地移走。

assert 条件;

assert 条件: 表达式;

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

4.1 启用和禁用断言

在默认情况下,断言被禁用。可以运行程序时用-enableassertions或-ea选项启用它

java –ea XXapp

注意:在启用或禁用断言时不必重新编译程序。启用或禁用断言是类加载器的功能。当断言被禁用时,类加载器将跳过断言代码,因此不会降低程序运行的速度。

也可以在某个类或某个包中使用断言

4.2 使用断言完成参数检查

在Java语言中,给出了3种处理系统错误的机制:

抛出一个异常

日志

使用断言

什么时候选择断言:

断言失败是致命的,不可恢复的错误,

断言检查只用于开发和测试阶段

@param a the array to be sorted (must not be null)

assert a != null;

4.3 为文档假设使用断言

5 记录日志

记录日志API优点:

1可以很容易地取消全部日志记录,或者仅仅取消某个级别的日志,而且打开和关闭这个操作也很容易

2可以很简单地禁止日志记录的输出,因此,将这些日志代码留在程序中的开销最小。

3 日志记录可以被定向到不同的处理器,用于在控制台中显示,用于存储在文件中等

4 日志记录器和处理器都可以对记录进行过滤。过滤器可以根据过滤实现器制定的标准丢弃那些无用的记录项。

5 日志记录可以采用不同的方式格式化,例如纯文本和xml

6 应用程序可以使用多个日志记录器,它们使用类似包名的这种具有层次结构的名字

7 在默认情况下,日志系统的配置由配置文件控制

5.1 基本日志

Logger.global 默认记录器,可以用System.out替换它,并通过调用info方法记录日志信息。

Logger.getGlobal().info(“   ”);

PS:自动包含了时间,调用的类名和方法名,但是在相应的地方调用:

Logger.getGlobal().setLevel(Level.OFF); 将会取消所有的日志

5.2 高级日志

企业级日志,不要将所有的日志都记录到一个全局日志记录器中,而是自定义日志记录器

调用getLogger方法可以创建或检索记录器。

与包名类似,日志记录器名也具有层次结构。

7个日志记录级别

SEVERE

WARING

INFO

CONFIG

FINE

FINER

FINEST

在默认情况下,只记录前三个级别,或者使用Level.OFF关闭所有级别的记录。

Logger.setLevel(Level.FINE);

FINE和更高级别的记录都可以记录下来。

可以使用Level.ALL开启所有级别的记录

记录方法:

logger.waring(message);

logger.fine(message);

logger.log(Level.FINE,message);

默认的日志记录将显示包含日志调用的类名和方法名,如同堆栈所显示的那样。但是,如果虚拟机对执行过程进行了优化,就得不到准确的调用信息。此时,可以调用logp方法获得调用类和方法的确切位置:

void logp(Level L ,String className;String methodName,String message)

5.3 修改日志管理器配置

可以通过编辑配置文件来修改日志系统的各种属性。e/lib/loggin.properties

要想使用另外一个配置文件,就要将java.util.logging.config.file特性设置为配置文件的存储位置,并用下列命令启动应用程序

java –Djava.util.logging.config.file-config-File mainClass;

.level=INFO

5.4 本地化

本地化的应用程序包含资源包中的本地特定信息。

5.5 处理器

日志记录器将记录发送到ConsoleHandler中,并由它输出到System.err流中。

默认情况下,日志记录器将记录发送到自己的处理器和父处理器。要将日志记录发送到其他地方,就要添加其他的处理器。日志API提供了FileHandler,另一个是SocketHandler。SocketHandler将记录发送到特定的主机和端口,FileHandler可以收集文件中的记录。

可以像下面这样直接将记录发送到默认文件的处理器

FileHandler handler = new FileHandler();

logger.addHandler(handler);

这些记录被发送到用户主目录的javan.log文件中,n是文件的唯一编号。

还可以通过扩展Handler或StreamHandler类自定义处理器。

5.6 过滤器

根据日志记录的级别进行过滤

也可以通过实现Filter接口并定义下列方法来自定义过滤器

boolean isLoggable(LogRecord record)

5.7 格式化器

ConsoleHandler类和FileHandler类可以生成文本和XML格式的日志记录。

也可以自定义格式,需要扩展Formater类并覆盖下面这个方法

String format(LogRecord record)

5.8 日志记录说明

1 为一个简单的应用程序,选择一个日志记录器,并把日志记录器命名为与应用程序包一样的名字。

2 默认的  日志配置将级别等于或高于INFO级别的所有消息记录到控制台。用户可以覆盖默认的配置文件。

3 级别为INFO、WARING、SEVERE的消息将显示在控制台上,将有意义的消息设置为这几个级别。

6 调试技巧

  • 1 使用打印任意值
  • 2 类中放一个main方法 单元测试
  • 3 Junit
  • 4 日志代理
  • 5 利用Throwable类提供的printStackTrace方法,可以从任何一个异常中获得堆栈情况。
  • 6 堆栈跟踪显示在System.err上
  • 7 将一个程序中的错误信息保存在一个文件中
  • 8 让非捕获异常的堆栈跟踪出现在System.err中并不是一个很理想的方法。
  • 9 可以用-verbose启动java虚拟机观察类的加载过程
  • 10 Xlint 选项编译器对一些普通容易出现的代码问题进行检查
  • 11 java虚拟机对java应用程序进行监控和管理的支持
  • 12可以使用jmap实用工具获得一个堆的转储,其中显示了堆中的每个对象。
  • 13 如果使用-Xprof标志运行java虚拟机,就会运行一个基本的剖析器来跟踪那些代码中经常被调用的方法。

7 使用调试器

在Debug中

Step Into 命令跟踪到每个方法调用的内部 Eclipse F5

Step Over 命令定位到下一行,而并不跟踪到方法调用的内部 Eclipse F6

时间: 2024-12-18 20:27:35

Java基础语法<十一> 异常 断言 日志 调试的相关文章

[core java学习笔记][第十一章异常断言日志调试]

第11章 异常,断言,日志,调试 处理错误 捕获异常 使用异常机制的技巧 使用断言 日志 測试技巧 GUI程序排错技巧 使用调试器 11.1 处理错误 11.1.1异常分类 都继承自Throwable类 分成Error和Exception Error类 描写叙述了Java运行时系统的内部错误和资源耗尽错误. 应用程序不应该抛出此种类型的错误.假设出现了这样的内部错误.除了通告给用户,并尽力使程序安全地终止外,再也无能为力 Exception层次结构:最需关注的 RuntimeException

Java基础语法

Java的基础语法中包含字符集.标识符和关键字.变量和常量.语句.注释.运算符和表达式这些基本要素. 一.关键字 编程语言都有一些保留的单词,用于定义该语言,这些单词对于编译器有特殊含义,不能作为标识符使用: Java中的true.false.null这三个保留字,不能作为标识符使用,对于编译器有特殊含义: main是一个用于描述Java程序开始方法的特殊名称,它不是一个关键字: abstract 抽象 boolean 逻辑运算: 布尔 break 打破: 断开 byte 字节: case 例,

黑马程序员——Java基础语法(一) --- 关键字、标识符、注释、常量和变量、运算符

------<a href="http://www.itheima.com" target="blank">Java培训.Android培训.iOS培训..Net培训</a>.期待与您交流! ------- 本篇博文主要总结java的基础语法,主要的内容包括:关键字.标识符.注释.常量和变量.运算符几部分. 一.关键字 关键字是被Java语言赋予了特殊含义的单词.关键字中所有的字母都是小写. java中的关键字主要包括如下几部分: 1.用于定

Java基础语法(一)---关键字、常量、变量、运算符

Java基础语法(一)---关键字.常量.变量.运算符一.关键字 定义:被Java赋予了特殊含义的单词. 特点:体现上都是英文小写. 1. 用于定义数据类型的关键字 基本数据类型: 整数类型: byte(1字节,最大值127) short(2字节,最大值为2^15-1) int(4字节,最大值为2^31-1) long(8字节,最大值为2^63-1) 浮点类型: float (单精度实数在内存中占32bit 有效数字为6~7位) double(双精度实数占内存单元为64bit 有效数字为15~1

第8天 Java基础语法

第8天 Java基础语法 今日内容介绍 Eclipse开发工具 超市库存管理系统 Eclipse开发工具 Eclipse是功能强大Java集成开发工具.它可以极大地提升我们的开发效率.可以自动编译,检查错误.在公司中,使用的就是Eclipse进行开发. Eclipse的下载.安装.卸载 下载 http://www.eclipse.org 安装 (只需要解压后就能使用) 卸载(只需要将文件夹删除就可以了) 注意: 开发软件的安装目录中,尽量不要出现空格与中文 Eclipse的使用 在当前阶段,我们

Java基础语法(一)

Java基础语法(一) Java基础语法部分与c++及c语言大同小异,本篇列举我容易搞混的点. Java命名规范 规范这种东西,当然是能遵守就遵守,你不遵守,虽然不会怎么样,但是容易被喷.毕竟代码都是给别人看的,可读性很重要. Java对大小写很敏感,hello和Hello不同. 英文一定要对应意思!!!不然别人真的看了会笑.拼音也就自己看的懂,随便取个a过一段时间自己都看不懂啦. 源文件名必须和类名相同,即类名.java.不这样搞就错了! 类名采用大驼峰命名法,即每个单词首字母大写. 变量名,

Java基础语法(二)——数据类型扩展与运算符详解

一.前言 ? 上文我们讲解了有关java编程基础语法的变量与关键字的知识点,本文将主要对java基础语法中的运算符进行讲解. ? 在讲解语法之前我们先来讲一下真正的开发环境. 二.Java集成开发环境 2.1eclipse的使用方法 ? 之前我们在体验java编程或者写小的demo的时候,都是命名一个.java的源文件,在dos界面中编译和运行,但是这样给人的感觉并不友好,为了解决这一问题,一些大佬便开发了与各种语言对应的集成开发环境,其中包含文本编辑处理,自动编译,简化运行,随时进行代码调试.

java 基础语法

第一周接触java基础语法,上课听得头痛,还是半懂不懂,放学后讲的啥子都忘了. 这是老师给的周末作业: 1.输入长与宽计算长方形面积与周长.(用精度类型计算)2.输入一个学生三科成绩,计算平均分.3.输入int型市场价格,购买价格,计算差额,差额显示为单精度浮点型.4.42页第二,计算房贷那道题.5.输入一个学生成绩,学习成绩>=90分的同学用A表示,60-89分之间的用B表示,60分以下的用C表示.6.题目:输入三个整数x,y,z,请把这三个数由小到大输出.程序分析:我们想办法把最小的数放到x

Java基础语法1

                         Java基础语法(1)知识点目录 1:关键字 (1)定义 (2)特点 (3)注意事项 2:标识符 (1)定义 (2)组成规则 (3)注意事项 (4)常见的命名规则(见名知意) A:包 单级包 多级包 B:类或者接口 一个单词 多个单词 C:方法或者变量 一个单词 多个单词 D:常量 全部大写 一个单词 多个单词 3:注释 (1)定义 (2)分类 A:单行注释 B:多行注释 C:文档注释 (3)注释的作用 4:常量 (1)定义 (2)分类 A:字面