实验九异常、断言与日志

实验时间 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);
        }
        
    }

}

狄慧201771010104《面向对象程序设计(java)》第九周学习总结

狄慧201771010104《面向对象程序设计(java)》第九周学习总结

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自动生成异常对象
     }
}

狄慧201771010104《面向对象程序设计(java)》第九周学习总结

狄慧201771010104《面向对象程序设计(java)》第九周学习总结

狄慧201771010104《面向对象程序设计(java)》第九周学习总结

实验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),同样先出进行运算
View Code

相关文章:

  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
猜你喜欢
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
  • 2022-12-23
相关资源
相似解决方案