实验九异常、断言与日志
实验时间 2018-10-25
一、知识点总结:
(一)处理错误:
1、可能出现的问题获错误:
用户输入错误、设备错误、物理限制、代码错误。
2、异常具有自己的语法和特定的继承结构:
异常分类:异常对象都是派生于Throwable类的一个实例,但在下一层立即分为两个支:Error和Exception。
(二)异常分类:
1.非致命异常:通过某种修正后程序还能继续执行。 这类错误叫作异常。如:文件不存在、无效的数组 下标、空引用、网络断开、打印机脱机、磁盘满等。 Java中提供了一种独特的处理异常的机制,通过异 常来处理程序设计中出现的错误。
2.致命异常:程序遇到了非常严重的不正常状态,不 能简单恢复执行,是致命性错误。如:内存耗尽、 系统内部错误等。这种错误程序本身无法解决。
3. Java中所有的异常类都直接或间接地继承于 Throwable类。除内置异常类外,程序员可自定义异 常类。
Java中的异常类可分为两大类:
1>.Error Error类层次结构描述了Java运行时系统的内部错误 和资源耗尽错误。应用程序不应该捕获这类异常,也 不会抛出这种异常。
2>.Exception Exception类:重点掌握的异常类。Exception层次结 构又分解为两个分支:一个分支派生于 RuntimeException;另一个分支包含其他异常
(三)声明受查异常:如果遇到无法处理的情况,Java方法可以抛出一个异常,不仅要告诉编辑器将要返回什么值,还要告诉编辑器有可能发生什么错误。方法应该在其首部声明可能发生的所有异常,遇到以下四种情况时应该抛出异常:1调用一个抛出受查异常的方法;2程序运行过程中发现错误,并且利用throw语句抛出一个受查异常;3程序出现错误;4Java虚拟机和运行时库出现的内部错误。
(四)如何抛出异常:首先要决定应该抛出什么类型的异常。对于一个已经存在的异常类,将其抛出十分容易。在这种情况下:1找到一个合适的异常类2创建这个类的一个对象3将对象抛出。一旦方法抛出了异常,这个方法就不可能返回到调用者。
(五)创建异常类:定义一个派生于Exception(或子类)的类。
二、实验
1、实验目的与要求
(1) 掌握java异常处理技术;
(2) 了解断言的用法;
(3) 了解日志的用途;
(4) 掌握程序基础调试技巧;
2、实验内容和步骤
实验1:用命令行与IDE两种环境下编辑调试运行源程序ExceptionDemo1、ExceptionDemo2,结合程序运行结果理解程序,掌握未检查异常和已检查异常的区别。
|
//异常示例1 public class ExceptionDemo1 { public static void main(String args[]) { int a = 0; System.out.println(5 / a); } } |
|
//异常示例2 import java.io.*;
public class ExceptionDemo2 { public static void main(String args[]) { FileInputStream fis=new FileInputStream("text.txt");//JVM自动生成异常对象 int b; while((b=fis.read())!=-1) { System.out.print(b); } fis.close(); } } |
public class ExceptionDemo1 { public static void main(String[] args) { int a = 0; if(a==0) { System.out.println("除数为零"); } else { System.out.println(5 / a); } } }
import java.io.*; public class ExceptionDemo2{ public static void main(String args[]) { FileInputStream fis; try { fis = new FileInputStream("text.txt"); int b; while((b=fis.read())!=-1) { System.out.print(b); } fis.close(); }catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace();//打印堆栈信息 // System.out.println("Hello."); }//JVM自动生成异常对象 } }
实验2: 导入以下示例程序,测试程序并进行代码注释。
测试程序1:
l 在elipse IDE中编辑、编译、调试运行教材281页7-1,结合程序运行结果理解程序;
l 在程序中相关代码处添加新知识的注释;
l 掌握Throwable类的堆栈跟踪方法;
package stackTrace;//堆栈轨迹 import java.util.*; /** * A program that displays a trace feature of a recursive method call.展示一个递归方法调用的轨迹特征 * @version 1.01 2004-05-10 * @author Cay Horstmann */ public class StackTraceTest { /** * Computes the factorial of a number计算一个数的阶乘 * @param n a non-negative integer非负整数 * @return n! = 1 * 2 * . . . * n */ public static int factorial(int n)//静态类阶乘 { System.out.println("factorial(" + n + "):");//输出要阶乘的数n Throwable t = new Throwable();//将抛出异常赋值给t StackTraceElement[] frames = t.getStackTrace();//把抛出的堆栈轨迹t赋值给要素frames多窗口页面 for (StackTraceElement f : frames) System.out.println(f); int r; if (n <= 1) r = 1;//如果n小于等于1,则r等于1 else r = n * factorial(n - 1);//否则 System.out.println("return " + r); return r; } public static void main(String[] args) { Scanner in = new Scanner(System.in);//用户输入 System.out.print("Enter n: "); int n = in.nextInt(); factorial(n); } } //堆栈先进后出,最后进入factorial(1),同样先出进行运算