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
 

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

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

    第11章 异常,断言,日志,调试 处理错误 捕获异常 使用异常机制的技巧 使用断言 日志 测试技巧 GUI程序排错技巧 使用调试器 11.1 处理错误 11.1.1异常分类 都继承自Throwable ...

  2. 052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试——debug2 多断点调试程序

    052 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 14 Eclipse下程序调试--debug2 多断点调试程序 本文知识点: Eclipse下程序调 ...

  3. 051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试——debug入门1

    051 01 Android 零基础入门 01 Java基础语法 05 Java流程控制之循环结构 13 Eclipse下程序调试--debug入门1 本文知识点: 程序调试--debug入门1 程序 ...

  4. JavaSE基础(三)--Java基础语法

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  5. Java-Runoob:Java 基础语法

    ylbtech-Java-Runoob:Java 基础语法 1.返回顶部 1. Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍 ...

  6. (四)Java 基础语法

    Java 基础语法 一个Java程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如,一 ...

  7. Java基础语法知识你真的都会吗?

    第一阶段 JAVA基础知识 第二章 Java基础语法知识 在我们开始讲解程序之前,命名规范是我们不得不提的一个话题,虽说命名本应该是自由的,但是仍然有一定的"潜规则",通过你对命名 ...

  8. 2、Java 基础语法标识符、修饰符、变量、 数组、枚举、关键字

    Java 基础语法 一个 Java 程序可以认为是一系列对象的集合,而这些对象通过调用彼此的方法来协同工作.下面简要介绍下类.对象.方法和实例变量的概念. 对象:对象是类的一个实例,有状态和行为.例如 ...

  9. java面向对象编程——第二章 java基础语法

    第二章 java基础语法 1. java关键字 abstract boolean break byte case catch char class const continue default do ...

随机推荐

  1. js文件下载及命名(兼容多浏览器)

    函数功能:实现主流浏览器的文件下载功能: 兼容性: >=IE10,Edge,chrome,firefox; 与后台的请求方式:GET请求,  url携带参数  url?id=123(隐藏文件真实 ...

  2. 自研框架wap.js实践

    示例 使用分为3个步骤: 1, 配置模板渲染中心,方便别人可以看到你的模板渲染,请求是什么关系,复杂度怎样 2, 配置事件分发中心  方便观察事件分发,事件复杂度 3,写对应的请求方法.渲染方法.   ...

  3. linux平台下Hadoop下载、安装、配置

    在这里我使用的linux版本是CentOS 6.4      CentOS-6.4-i386-bin-DVD1.iso      下载地址: http://mirrors.aliyun.com/cen ...

  4. Java中的会话管理——HttpServlet,Cookies,URL Rewriting(译)

    参考谷歌翻译,关键字直接使用英文,原文地址:http://www.journaldev.com/1907/java-session-management-servlet-httpsession-url ...

  5. SICP-Elements of program

    编程语言=组合简单形成复杂的工具 简单的声明和表达式 简单元素之间的组合方式 组合后元素的抽象方式 程序=数据+函数 数据是我们要处理的内容 函数是我们处理数据的方式 函数式与中缀式 函数式不会出现歧 ...

  6. PHP获取当前的毫秒值

    php本身没有提供返回毫秒数的函数,但提供了一个microtime()函数,借助此函数,可以很容易定义一个返回毫秒数的函数 1. 函数 mixed microtime ([ bool $get_as_ ...

  7. MongoDB--GridFS 文件存储系统

    GridFS是Mongo的一种专门用存储小型文件的功能. 使用于下列场景: 1.写入文件:mongofiles put 文件路径 注意,当前mongo实例链接的哪个库,将写文件在哪个实例里面的grid ...

  8. 原生js二级联动

    今天说的这个是原生js的二级联动,在空白页面里动态添加并作出相对应的效果. 1 //创建两个下拉列表 select标签 是下拉列表 var sel = document.createElement(& ...

  9. 梳理spring的层次结构的神器

    今天发现一个快速搞定spring层次结构的神器:效果如下 这是用idea编辑器直接生成的.还可以显示方法属性等等.简直神器.谁用谁知道... 操作如下:

  10. 《JavaScript高级程序设计》笔记一

    第一章 JavaScript简介 一.JavaScript的起源 JavaScript诞生于1995年.当时,它的主要作用是处理一些输入验证操作.之前的话,都是把表单数据发送到服务器端,然后再去判断有 ...