201871010111-刘佳华《面向对象程序设计(java)》第十周学习总结
实验八 异常、断言与日志
实验时间 2019-11-1
1、实验目的与要求
(1) 掌握java异常处理技术;
(2) 了解断言的用法;
(3) 了解日志的用途;
(4) 掌握程序基础调试技巧;
一:理论部分。
错误类型:1)用户输入错误;2)设备错误;3)物理限制;4)代码错误
1.异常:在程序的执行过程中所发生的异常事件,它中断指令的正常执行。异常对象都是派生于Throwable类的一个实例。
所有异常类都是由Throwable继承而来,在下一层分解为两个支:Error(致命错误)和Exception(非致命错误)。
设计java程序时,关注Exception层次结构。Exception层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。RuntimeException为运行时异常类,一般是程序错误产生。
派生于RuntimeException的异常包含下面几种情况:
1)错误的类型转换
2)数组访问越界
3)访问空指针
Java将派生于Error类或RuntimeException类的所有异常称为未检查异常,编译器允许不对它们做出异常处理。
2.抛出异常:声明抛出异常在方法声明中用throws子句中来指明。
1)throws子句可以同时指明多个异常,说明该方法将不对这些异常进行处理,而是声明抛出它们。
2)一个方法必须声明该方法所有可能抛出的已检查异常,而未检查异常要么不可控制(Error),要么应该避免发生(RuntimeException)。如果方法没有声明所有可能发生的已检查异常,编译器会给出一个错误消息。
3)抛出异常对象通过throw语句来实现。
3.创建异常类。
自定义异常类:定义一个派生于Exception的直接或间接子类。如一个派生于IOException的类。
4.捕获异常:
1)捕获异常的第一步是用try{}子句选定捕获异常的代码范围,由try所限定的代码块中的语句在执行过程中可能会自动生成异常对象并抛出。
2)catch子句:catch块是对异常对象进行处理的代码;
a.每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的各类异常事件;
b.catch语句只需要一个形式参数指明它所能捕获的异常类对象,这个异常类必须是Throwable的子类,运行时系统通过参数值把被抛出的异常对象传递给catch块;
c.catch块可以通过异常对象调用类Throwable。
getMessage:用来得到有关异常事件的信息;
printStackTrace:用来跟踪异常事件发生时执行堆栈的内容。
5.堆栈跟踪:程序执行中一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。
6.程序编码时异常处理的两种方式:
1)积极处理方式:确切知道如何处理的异常应该捕获;
2)消极处理方式:不知道如何去处理的异常声明抛出。
5.断言:
是程序的开发和测试阶段用于插入一些代码错误检测语句的工具。
断言(assert)语法如下:
1、assert 条件
或者
2、assert 条件:表达式
这两个形式都会对布尔“条件”进行判断,如果判断结果为假(false),说明程序已经处于不正确的状态下,系统则抛出AssertionError,给出警告并且退出。在第二种形式中,“表达式”会传入AssertionError的构造函数中并转成一个消息字符
2、实验内容和步骤
实验1:用命令行与IDE两种环境下编辑调试运行源程序ExceptionDemo1、ExceptionDemo2,结合程序运行结果理解程序,掌握未检查异常和已检查异常的区别
//异常示例1
public class ExceptionDemo1 {
public static void main(String args[]) {
int a = 0;
System.out.println(5 / a);
}
}
运行截图如下:
因分母为零,程序在运行过程中出现异常。修改后程序如下:
修改后代码:
1 package TEST01; 2 3 import java.util.Scanner; 4 5 public class ExceptionDemo1 { 6 public static void main(String args[]) { 7 Scanner in = new Scanner(System.in); 8 int a =in.nextInt(); 9 if (a==0) { 10 System.out.println("input error!"); 11 } 12 else 13 System.out.println(5 / a); 14 in.close(); 15 } 16 }