zoukankan      html  css  js  c++  java
  • 201871010107公海瑜《面向对象程序设计(java)》第十周学习总结 公海瑜

        201871010107-公海瑜《面向对象程序设计(java)》第十周学习总结

    项目 内容
    这个作业属于哪个课程 https://www.cnblogs.com/nwnu-daizh/
    这个作业的要求在哪里  https://www.cnblogs.com/nwnu-daizh/p/11435127.html
    作业学习目标  1.掌握java异常处理技术;

     2.了解断言的用法;

     3.了解日志的用途;

     4.掌握程序基础调试技巧。

    第一部分:总结第七章关于异常处理相关理论知识 

    1. 处理错误

    程序中常见的几类错误:

    (1)用户输入错误

    (2)设备错误

    (3)物理限制

    (4)代码错误

    异常:

    在程序执行的过程中所发生的异常事件,它中断指令的正常执行。

    异常分类:

    (1)非致命异常和致命异常

    (2)在java中,异常对象都派生于Throwable类的一个实例。

    (3)所有的异常类由Throwable继承而来,分为Error类和Exception类(重点学习)

    (4)Exception类中的RuntimeException为运行时异常类,一般由程序错误产生。派生于Error类或RuntimeException类的所有异常被称为未检查异常,编译器允许不对这些异常进行处理 

    (5)声明抛出异常:throws语句

    (6)捕获异常:try、catch、finally块

    Try语句:括住可能抛出异常的代码段

    Catch语句:指明要捕获的异常及相应的处理代码

    Finally语句:必须执行的程序块

    程序编码时异常处理的两种方式:

      1)积极处理方式:确切知道如何处理的异常应该捕获;

      2)消极处理方式:不知道如何去处理的异常声明抛出。

    断言:是程序的开发和测试阶段用于插入一些代码错误检测语句的工具。

    断言(assert)语法如下:

    1、assert 条件

    或者

    2、assert 条件:表达式

    这两个形式都会对布尔“条件”进行判断,如果判断结果为假(false),说明程序已经处于不正确的状态下,系统则抛出AssertionError,给出警告并且退出。在第二种形式中,“表达式”会传入AssertionError的构造函数中并转成一个消息字符。

    第二部分:实验部分

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

    异常示例1:增加判断分母是否为零的语句:

    public class ExceptionDemo1 {
                public static void main(String args[]) {
                    int a = 0;
                    if(a==0)
                        System.out.println("error");
                    else
                        System.out.println(5 / a);
                }
            
    
        }
    ExceptionDemo1运行结果:


    ExceptionDemo2运行结果:

    实验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.10 2017-12-14
     * @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();
          for (StackTraceElement f:frames)
              System.out.println(f);  
          int r;
          if (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);
          }
       }

    运行结果如下:

    测试程序2:

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

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

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

    //积极处理方式  

    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 ExceptionTest {
        public static void main(String[] args) throws IOException {
            try {
                FileInputStream fis = new FileInputStream("身份证号.txt");
                BufferedReader in = new BufferedReader(new InputStreamReader(fis));
                String m, n = new String();
                while ((m = in.readLine()) != null) {
                    n += m + "\n ";
                }
                in.close();
                System.out.println(n);
    
            } 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.IOException;
    import java.io.InputStreamReader;
    
    public class ExceptionTest {
        public static void main(String[] args) throws IOException {
                FileInputStream fis = new FileInputStream("身份证号.txt");
                BufferedReader in = new BufferedReader(new InputStreamReader(fis));
                String m, n = new String();
                while ((m = in.readLine()) != null) {
                    n += m + "\n ";
                }
                in.close();
                System.out.println(n);
        }
    }

    运行结果如图:

    实验3: 编程练习

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

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

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

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

    代码如下:

     

    实验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);后重新运行程序,结合程序运行结果理解程序;

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

    代码如下:

    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);
    
        }
    
    }

    结果如图:

     注释语句test1(-5)后代码如下:

    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);
    
        }
    
    }

    运行结果如图:

    实验程序2:

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

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

    代码如下:

    package logging;
    
    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;
                var 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(() ->
                {
                   var windowHandler = new WindowHandler();
                   windowHandler.setLevel(Level.ALL);
                   Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler);
    
                   var 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);
    
          // 设置菜单栏
          var menuBar = new JMenuBar();
          setJMenuBar(menuBar);
    
          var menu = new JMenu("File");
          menuBar.add(menu);
    
          var openItem = new JMenuItem("Open");
          menu.add(openItem);
          openItem.addActionListener(new FileOpenListener());
    
          var 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);
    
             // 设置文件选择器
             var 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();
          var 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,结合程序运行结果理解程序;

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

    代码如下:

    package logging;
    
    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;
                var 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(() ->
                {
                   var windowHandler = new WindowHandler();
                   windowHandler.setLevel(Level.ALL);
                   Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler);
    
                   var 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);
    
          // 设置菜单栏
          var menuBar = new JMenuBar();
          setJMenuBar(menuBar);
    
          var menu = new JMenu("File");
          menuBar.add(menu);
    
          var openItem = new JMenuItem("Open");
          menu.add(openItem);
          openItem.addActionListener(new FileOpenListener());
    
          var 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);
    
             // 设置文件选择器
             var 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();
          var 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();
       }
    }

    运行结果如图:

    1)条件断点 

    2)变量断点

    3)方法断点

    4)异常断点

    5)重新调试

    6)单步执行程序 

    7)检查变量

    8)改变变量值

    三.实验总结

            通过这个周的学习,我了解了异常的概念,以及异常的分类,掌握了异常的捕获和处理办法等。虽然课堂上听的不是特别明白,但通过课下的学习我大概基本都掌握消化了老师课堂上讲的知识点,通过课后的实验以及作业,我的编写代码的能力以及程序运行出错后改错的能力也大大提升。希望以后的学习中,我的能力能进一步提升。

     

  • 相关阅读:
    Pytorch tensor求和( tensor.sum())
    Pytorch torch.cat(inputs, dimension=0)
    README.md编写
    Numpy-np.random.normal()正态分布
    numpy数组的分割与合并
    使用Pandas读取CSV文件
    train loss与test loss结果分析/loss不下降
    Python-给数字/字符串前加0
    SVM简单上手示例
    迁移学习简介
  • 原文地址:https://www.cnblogs.com/gonghaiyu/p/11776153.html
Copyright © 2011-2022 走看看