zoukankan      html  css  js  c++  java
  • 周强 201771010141 《面向对象程序设计(java)》第九周实验总结

    实验部分

    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 在程序中相关代码处添加新知识的注释;

    掌握Throwable类的堆栈跟踪方法;

    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 + "):");
          Throwable t = new Throwable();
          StackTraceElement[] frames = t.getStackTrace();//创建一个表示指定执行点的堆栈跟踪元素,t存放方法调用栈的信息
          for (StackTraceElement f : frames)
             System.out.println(f);
          int r;
          if (n <= 1) r = 1;
          else r = n * factorial(n - 1);//计算n个数的阶乘需要调用之前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);
       }
    }

    测试程序2:

    l Java语言的异常处理积极处理方法和消极处理两种方式

    l 下列两个简答程序范例给出了两种异常处理的代码格式。在elipse IDE中编辑、调试运行源程序ExceptionalTest.java,将程序中的text文件更换为身份证号.txt,要求将文件内容读入内容,并在控制台显示;

    掌握两种异常处理技术的特点。

    //积极处理方式  

    import java.io.*;

    class ExceptionTest {

    public static void main (string args[])

       {

           try{

           FileInputStream fis=new FileInputStream("text.txt");

           }

           catchFileNotFoundExcption e

         {   ……  }

    ……

        }

    }

    //消极处理方式

    import java.io.*;

    class ExceptionTest {

    public static void main (string args[]) throws  FileNotFoundExcption

         {

          FileInputStream fis=new FileInputStream("text.txt");

         }

    }

    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class ExceptionalTest {
        public static void main(String args[]) {
             try {
                    FileInputStream fis = new FileInputStream("身份证号.txt");
                    BufferedReader in = new BufferedReader(new InputStreamReader(fis));
                    String a,b = new String();
                    while ((a = in.readLine()) != null) {
                        b += a + "
     ";
                    }
                    in.close();
                    System.out.println(b);
    
                } catch (FileNotFoundException e) {
                    System.out.println("学生信息文件找不到");
                    e.printStackTrace();
                } catch (IOException e) {
                    System.out.println("学生信息文件读取错误");
                    e.printStackTrace();
                }
            }
            }
    import java.io.BufferedReader;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    
    public class ExceptionalTest {
        public static void main(String[] args) throws IOException {
            FileInputStream fis = new FileInputStream("身份证号.txt");
            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
            String a, b = new String();
            while ((a = in.readLine()) != null) {
                b += a+ "
     ";
            }
            in.close();
            System.out.println(b);
        }
    }

    实验3: 编程练习

    练习1

    编制一个程序,将身份证号.txt 中的信息读入到内存中;

    l 按姓名字典序输出人员信息;

    l 查询最大年龄的人员信息;

    l 查询最小年龄人员信息;

    输入你的年龄,查询身份证号.txt中年龄与你最近人的姓名、身份证号、年龄、性别和出生地;

    l 查询人员中是否有你的同乡;

    l 在以上程序适当位置加入异常捕获代码。

    import java.io.BufferedReader;
    import java.io.File;
    import java.io.FileInputStream;
    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.InputStreamReader;
    import java.util.ArrayList;
    import java.util.Arrays;
    import java.util.Scanner;
    import java.util.Collections;//对集合进行排序、查找、修改等;
    
    public class Test {
        private static ArrayList<Citizen> citizenlist;
    
        public static void main(String[] args) {
            citizenlist = new ArrayList<>();
            Scanner scanner = new Scanner(System.in);
            File file = new File("E:/java/身份证号.txt");
            //异常捕获
            try {
                FileInputStream fis = new FileInputStream(file);
                BufferedReader in = new BufferedReader(new InputStreamReader(fis));
                String temp = null;
                while ((temp = in.readLine()) != null) {
    
                    Scanner linescanner = new Scanner(temp);
    
                    linescanner.useDelimiter(" ");
                    String name = linescanner.next();
                    String id = linescanner.next();
                    String sex = linescanner.next();
                    String age = linescanner.next();
                    String birthplace = linescanner.nextLine();
                    Citizen citizen = new Citizen();
                    citizen.setName(name);
                    citizen.setId(id);
                    citizen.setSex(sex);
                    // 将字符串转换成10进制数
                    int ag = Integer.parseInt(age);
                    citizen.setage(ag);
                    citizen.setBirthplace(birthplace);
                    citizenlist.add(citizen);
    
                }
            } catch (FileNotFoundException e) {
                System.out.println("信息文件找不到");
                e.printStackTrace();
            } catch (IOException e) {
                System.out.println("信息文件读取错误");
                e.printStackTrace();
            }
            boolean isTrue = true;
            while (isTrue) {
    
                System.out.println("1.按姓名字典序输出人员信息");
                System.out.println("2.查询最大年龄的人员信息、查询最小年龄人员信息");
                System.out.println("3.查询人员中是否查询人员中是否有你的同乡");
                System.out.println("4.输入你的年龄,查询文件中年龄与你最近人的姓名、身份证号、年龄、性别和出生地");
                System.out.println("5.退出");
                int nextInt = scanner.nextInt();
                switch (nextInt) {
                case 1:
                    Collections.sort(citizenlist);
                    System.out.println(citizenlist.toString());
                    break;
                case 2:
                    int max = 0, min = 100;
                    int m, k1 = 0, k2 = 0;
                    for (int i = 1; i < citizenlist.size(); i++) {
                        m = citizenlist.get(i).getage();
                        if (m > max) {
                            max = m;
                            k1 = i;
                        }
                        if (m < min) {
                            min = m;
                            k2 = i;
                        }
                    }
                    System.out.println("年龄最大:" + citizenlist.get(k1));
                    System.out.println("年龄最小:" + citizenlist.get(k2));
                    break;
                case 3:
                    System.out.println("出生地:");
                    String find = scanner.next();
                    String place = find.substring(0, 3);
                    for (int i = 0; i < citizenlist.size(); i++) {
                        if (citizenlist.get(i).getBirthplace().substring(1, 4).equals(place))
                            System.out.println("出生地" + citizenlist.get(i));
                    }
                    break;
                case 4:
                    System.out.println("年龄:");
                    int yourage = scanner.nextInt();
                    int near = peer(yourage);
                    int j = yourage - citizenlist.get(near).getage();
                    System.out.println("" + citizenlist.get(near));
                    break;
                case 5:
                    isTrue = false;
                    System.out.println("程序已退出!");
                    break;
                default:
                    System.out.println("输入有误");
                }
            }
        }
    
        public static int peer(int age) {
            int flag = 0;
            int min = 53, j = 0;
            for (int i = 0; i < citizenlist.size(); i++) {
                j = citizenlist.get(i).getage() - age;
                if (j < 0)
                    j = -j;
                if (j < min) {
                    min = j;
                    flag = i;
                }
            }
            return flag;
        }
    }
    public class Citizen implements Comparable<Citizen> {
    
        private String name;
        private String id;
        private String sex;
        private int age;
        private String birthplace;
    
        public String getName() {
            return name;
        }
    
        public void setName(String name) {
            this.name = name;
        }
    
        public String getId() {
            return id;
        }
    
        public void setId(String id) {
            this.id = id;
        }
    
        public String getSex() {
            return sex;
        }
    
        public void setSex(String sex) {
            this.sex = sex;
        }
    
        public int getage() {
            return age;
        }
    
        public void setage(int age) {
            this.age = age;
        }
    
        public String getBirthplace() {
            return birthplace;
        }
    
        public void setBirthplace(String birthplace) {
            this.birthplace = birthplace;
        }
    
        public int compareTo(Citizen other) {
            return this.name.compareTo(other.getName());
        }
    
        public String toString() {
            return name + "	" + sex + "	" + age + "	" + id + "	" + birthplace + "
    ";
        }
    }

    练习2

    l 编写一个计算器类,可以完成加、减、乘、除的操作;

    利用计算机类,设计一个小学生100以内数的四则运算练习程序,由计算机随机产生10道加减乘除练习题,学生输入答案,由程序检查答案是否正确,每道题正确计10分,错误不计分,10道题测试结束后给出测试总分;

    将程序中测试练习题及学生答题结果输出到文件,文件名为test.txt

    l 在以上程序适当位置加入异常捕获代码。

    import java.io.FileNotFoundException;
    import java.io.IOException;
    import java.io.PrintWriter;
    import java.util.Scanner;
    
    public class calculator {
    
        public static void main(String[] args) {
            Scanner in = new Scanner(System.in);
            PrintWriter out = null;
            try {
                out = new PrintWriter("test.txt");
                int sum = 0;
                for (int i = 0; i < 10; i++) {
                    int a = (int) Math.round(Math.random() * 10);
                    int b = (int) Math.round(Math.random() * 10);
                    int menu = (int) Math.round(Math.random() * 3);
                    switch (menu) {
                    case 1:
                        System.out.println(a + "+" + b + "=");
                        int c1 = in.nextInt();
                        if (c1 == (a + b)) {
                            sum += 10;
                            System.out.println("恭喜答案正确");
                        } else {
                            System.out.println("抱歉,答案错误");
                        }
                        break;
                    case 2:
                        System.out.println(a + "-" + b + "=");
                        int c2 = in.nextInt();
                        if (c2 == (a - b)) {
                            sum += 10;
                            System.out.println("恭喜答案正确");
                        } else {
                            System.out.println("抱歉,答案错误");
                        }
    
                        break;
                    case 3:
                        System.out.println(a + "*" + b + "=");
                        int c = in.nextInt();
                        if (c == a * b) {
                            sum += 10;
                            System.out.println("恭喜答案正确");
                        } else {
                            System.out.println("抱歉,答案错误");
                        }
    
                        break;
                    case 4:
                        if (b == 0) {
                            System.out.println("除数为零");
                        } else {
                            System.out.println(a + "/" + b + "=");
                        }
                        int c4 = in.nextInt();
                        if (c4 == a / b) {
                            sum += 10;
                            System.out.println("恭喜答案正确");
                        } else {
                            System.out.println("抱歉,答案错误");
                        }
    
                        break;
                    }
                }
                System.out.println("你的得分为" + sum);
                out.println("你的得分为" + sum);
                out.close();
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
        }
    
    }

    实验4:断言、日志、程序调试技巧验证实验。

    实验程序1

    //断言程序示例

    public class AssertDemo {

        public static void main(String[] args) {        

            test1(-5);

            test2(-3);

        }

        

        private static void test1(int a){

            assert a > 0;

            System.out.println(a);

        }

        private static void test2(int a){

           assert a > 0 : "something goes wrong here, a cannot be less than 0";

            System.out.println(a);

        }

    }

    l 在elipse下调试程序AssertDemo,结合程序运行结果理解程序;

    l 注释语句test1(-5);后重新运行程序,结合程序运行结果理解程序;

    掌握断言的使用特点及用法。

    实验程序2:

    l 用JDK命令调试运行教材298-300页程序7-2,结合程序运行结果理解程序;

    并掌握Java日志系统的用途及用法。

    import java.awt.*;
    import java.awt.event.*;
    import java.io.*;
    import java.util.logging.*;
    import javax.swing.*;
    
    /**
     * A modification of the image viewer program that logs various events.
     * @version 1.03 2015-08-20
     * @author Cay Horstmann
     */
    public class LoggingImageViewer
    {
       public static void main(String[] args)
       {
           //将所有消息记录到应用程序特定的文件中
          if (System.getProperty("java.util.logging.config.class") == null
                && System.getProperty("java.util.logging.config.file") == null)
          {
             try//放入可能出错的语句
             {
                Logger.getLogger("com.horstmann.corejava").setLevel(Level.ALL);//得到日志记录器
                final int LOG_ROTATION_COUNT = 10;
                Handler handler = new FileHandler("%h/LoggingImageViewer.log", 0, LOG_ROTATION_COUNT);
                Logger.getLogger("com.horstmann.corejava").addHandler(handler);
             }
             catch (IOException e)
             {
                Logger.getLogger("com.horstmann.corejava").log(Level.SEVERE,
                      "Can't create log file handler", e);
             }
          }
    
          EventQueue.invokeLater(() ->//使事件派发线程上的可运行对象排队
                {
                   Handler windowHandler = new WindowHandler();
                   windowHandler.setLevel(Level.ALL);
                   Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler);
    
                   JFrame frame = new ImageViewerFrame();
                   frame.setTitle("LoggingImageViewer");
                   frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    
                   Logger.getLogger("com.horstmann.corejava").fine("Showing frame");
                   frame.setVisible(true);
                });
       }
    }
    
    /**
     * 显示图像的帧。
     */
    class ImageViewerFrame extends JFrame
    {
       private static final int DEFAULT_WIDTH = 300;
       private static final int DEFAULT_HEIGHT = 400;   
    
       private JLabel label;
       private static Logger logger = Logger.getLogger("com.horstmann.corejava");
    
       public ImageViewerFrame()
       {
          logger.entering("ImageViewerFrame", "<init>");      
          setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
    
          //设置菜单栏
          JMenuBar menuBar = new JMenuBar();
          setJMenuBar(menuBar);
    
          JMenu menu = new JMenu("File");
          menuBar.add(menu);
    
          JMenuItem openItem = new JMenuItem("Open");
          menu.add(openItem);
          openItem.addActionListener(new FileOpenListener());
    
          JMenuItem exitItem = new JMenuItem("Exit");
          menu.add(exitItem);
          exitItem.addActionListener(new ActionListener()
             {
                public void actionPerformed(ActionEvent event)
                {
                   logger.fine("Exiting.");
                   System.exit(0);
                }
             });
    
          //使用标签显示图像
          label = new JLabel();
          add(label);
          logger.exiting("ImageViewerFrame", "<init>");
       }
    
       private class FileOpenListener implements ActionListener
       {
          public void actionPerformed(ActionEvent event)
          {
             logger.entering("ImageViewerFrame.FileOpenListener", "actionPerformed", event);
    
             //设置文件选择器
             JFileChooser chooser = new JFileChooser();
             chooser.setCurrentDirectory(new File("."));
    
             //接受以.gif结尾的所有文件
             chooser.setFileFilter(new javax.swing.filechooser.FileFilter()
                {
                   public boolean accept(File f)
                   {
                      return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory();
                   }
    
                   public String getDescription()
                   {
                      return "GIF Images";
                   }
                });
    
             //显示文件选择器对话框
             int r = chooser.showOpenDialog(ImageViewerFrame.this);
    
             // 如果图像文件被接受,将其设置为标签的图标
             if (r == JFileChooser.APPROVE_OPTION)
             {
                String name = chooser.getSelectedFile().getPath();
                logger.log(Level.FINE, "Reading file {0}", name);
                label.setIcon(new ImageIcon(name));
             }
             else logger.fine("File open dialog canceled.");
             logger.exiting("ImageViewerFrame.FileOpenListener", "actionPerformed");
          }
       }
    }
    
    /**
     * 用于在窗口中显示日志记录的处理程序。
     */
    class WindowHandler extends StreamHandler//继承
    {
       private JFrame frame;
    
       public WindowHandler()
       {
          frame = new JFrame();
          final JTextArea output = new JTextArea();
          output.setEditable(false);
          frame.setSize(200, 200);
          frame.add(new JScrollPane(output));
          frame.setFocusableWindowState(false);
          frame.setVisible(true);
          setOutputStream(new OutputStream()
             {
                public void write(int b)
                {
                } // not called
    
                public void write(byte[] b, int off, int len)
                {
                   output.append(new String(b, off, len));
                }
             });
       }
    
       public void publish(LogRecord record)
       {
          if (!frame.isVisible()) return;
          super.publish(record);
          flush();
       }
    }

    实验程序3:

    l 用JDK命令调试运行教材298-300页程序7-2,结合程序运行结果理解程序;

    按课件66-77内容练习并掌握Elipse的常用调试技术。

    1)条件断点(有一定条件的断点):在Eclipse Java 编辑区的行头双击就会得到一个断点,代码会运行到此处时停止。

    在断点处点击鼠标右键,选择最后一个“Breakpoint Properties”。

    2)变量断点:在变量的值初始化,或是变量值改变时可以停止。

    3)方法断点:方法断点就是将断点打在方法的入口处。

    4)异常断点:当异常发生时,代码会停在异常发生处。

    5)重新调试:回退时,请在需要回退的线程方法上点右键,选择“Drop to Frame”。

    6)单步执行程序 

    7)检查变量

    8)改变变量值

     实验总结:

       通过本周的学习,我对于Java程序运行中出现的异常,断言有了初步的理解。但是在实验过程中,我发现我需要多加练习,加深理解。课下我会多加练习,对于之前所学的知识多加回顾,查漏补缺。

  • 相关阅读:
    Ext JS学习第三天 我们所熟悉的javascript(二)
    Ext JS学习第二天 我们所熟悉的javascript(一)
    Ext JS学习第十七天 事件机制event(二)
    Ext JS学习第十六天 事件机制event(一)
    Ext JS学习第十五天 Ext基础之 Ext.DomQuery
    Ext JS学习第十四天 Ext基础之 Ext.DomHelper
    Ext JS学习第十三天 Ext基础之 Ext.Element
    Ext JS学习第十天 Ext基础之 扩展原生的javascript对象(二)
    针对错误 “服务器提交了协议冲突. Section=ResponseHeader Detail=CR 后面必须是 LF” 的原因分析
    C# 使用HttpWebRequest通过PHP接口 上传文件
  • 原文地址:https://www.cnblogs.com/qq97/p/9866067.html
Copyright © 2011-2022 走看看