zoukankan      html  css  js  c++  java
  • 201871010109胡欢欢《面向对象程序设计(java)》第十周学习总结 201871010109

    201871010109-胡欢欢《面向对象程序设计(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)设备错误;

    2.异常

    (1)定义:在程序的执行时发生的异常事件,会中断指令的正常执行。异常对象都是派生于Throwable类的一个实例。

    (2)分类:所有异常类都是由Throwable继承而来,在下一层分为两个分支:Error和Exception。

    (3)设计java程序时,关注Exception层次结构。Exception层次结构又分解为两个分支:一个分支派生于RuntimeException;另一个分支包含其他异常。RuntimeException为运行时异常类,一般是程序错误产生。

    3.派生于RuntimeException的异常包含下面几种情况:

    (1)错误类型转换

    (2)访问空指针

    (3)数组访问越界

    4.抛出异常:声明抛出异常在方法声明中用throws子句来指明。

    (1)throws子句可同时指明多个异常,该方法不对这些异常进行处理,只是声明抛出它们。

    (2)一个方法必须声明该方法所有可能抛出的已检查异常,而未检查异常要么不可控制(如Error),要么应该避免发生(如RuntimeException)。如果方法没有声明所有可能发生的已检查异常,编译器会报告一个错误消息。

    (3)抛出异常对象通过throw语句来实现。

    5.创建异常类。

    自定义异常类:定义一个派生于Exception的直接或间接子类。

    6.捕获异常:

    (1)捕获异常的第一步是用try{}子句选定捕获异常的代码范围,由try所限定的代码块中的语句在执行过程中会自动生成异常对象并抛出。

    (2)catch子句:catch块是对异常对象进行处理的代码;

       1.每个try代码块可以伴随一个或多个catch语句,用于处理try代码块中所生成的各类异常事件;

     2.catch语句只需要一个形式参数指明它所能捕获的异常类对象,这个异常类必须是Throwable的子类,运行时系统通过参数值把被抛出的异常对象传递给catch块;

     3.catch块可以通过异常对象调用类Throwa。

       getMessage:用于得到有关异常事件的信息;

       printStackTrace:用于跟踪异常事件发生时执行堆栈的内容。

    7.堆栈跟踪:程序执行中一个方法调用过程的列表,它包含了程序执行过程中方法调用的特定位置。

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

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

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

    2、实验内容和步骤

    实验1:用命令行与IDE两种环境下编辑调试运行源程序ExceptionDemo1、ExceptionDemo2,结合程序运行结果理解程序,掌握未检查异常和已检查异常的区别。

    package project7;
    //异常示例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();
    
          }
    
    }

    运行结果:

    实验2  导入以下示例程序,测试程序并进行代码注释。

    实验2:测试程序1

    (1)在elipse IDE中编辑、编译、调试运行教材281页7-1,结合程序运行结果理解程序;

    (2)在程序中相关代码处添加新知识的注释;

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

    代码如下:

     import java.util.*;
    4 
    5 /**
    6  * A program that displays a trace feature of a recursive method call.
    7  * @version 1.10 2017-12-14
    8  * @author Cay Horstmann
    9  */
    10 public class StackTraceTest
    11 {
    12    /**
    13     * Computes the factorial of a number
    14     * @param n a non-negative integer
    15     * @return n! = 1 * 2 * . . . * n
    16     */
    17    public static int factorial(int n)    //求阶乘
    18    {   //调用Throwable类的getStackTrace方法访问栈堆轨迹的文本描述信息
    19       System.out.println("factorial(" + n + "):");
    20       var walker = StackWalker.getInstance(); //创建对象时调用堆栈的跟踪 
    21       walker.forEach(System.out::println);    //调用对象walker的foreach循环   
    22       int r;
    23       if (n <= 1) r = 1;
    24       else r = n * factorial(n - 1);     //计算n阶乘需要去调用n-1的阶乘
    25       System.out.println("return " + r);
    26       return r;
    27    }
    28 
    29    public static void main(String[] args)
    30    {
    31       try (var in = new Scanner(System.in)) 
    32       {
    33          System.out.print("Enter n: ");
    34          int n = in.nextInt();
    35          factorial(n);
    36       }
    37    }
    38 }

    运行结果:

    测试程序2:

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

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

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

    //积极处理方式  

    import java.io.*;

    class ExceptionTest {

    public static void main (string args[])

       {

           try{

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

           }

           catch(FileNotFoundExcption 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("E://身份证号.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.*;
    2 
    3 public class ExceptionTest { 4     public static void main (String args[]) throws IOException
    5    {
    6          
    7        try{
    8            FileInputStream fis=new FileInputStream("D://身份证号.txt");
    9            BufferedReader in = new BufferedReader(new InputStreamReader(fis));
    10            String s = new String();
    11            while ((s = in.readLine()) != null) {
    12                System.out.println(s);
    13            }
    14            in.close();
    15            fis.close();
    16           
    17        }
    18        finally {
    19         return ;
    20        }
    21        
    22    }
    23 }

    运行结果:

    实验3: 编程练习

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

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

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

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

    代码如下:

    import java.io.FileNotFoundException;
    import java.io.PrintWriter;
    import java.util.Scanner;
     
    public class jisuan {
        public static void main(String[] args) {
     
            Scanner in = new Scanner(System.in);
            jieguo student=new jieguo();
            PrintWriter out = null;
            try {
                out = new PrintWriter("text.txt");
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            }
            int sum = 0;
     
             
             
            for (int i = 1; i <=10; i++) {
                int a = (int) Math.round(Math.random() * 100);
                int b = (int) Math.round(Math.random() * 100);
                int c= (int) Math.round(Math.random() * 3);
     
                 
               switch(c)
               {
               case 0:
                   System.out.println(i+": "+a+"/"+b+"=");
                    
                   while(b==0)
                   {
                       b = (int) Math.round(Math.random() * 100);
                }
                    
                int C = in.nextInt();
                out.println(a+"/"+b+"="+C);
                if (C == student.division(a, b)) {
                    sum += 10;
                    System.out.println("right");
                }
                else {
                    System.out.println("false");
                }
                 
                break;
                 
               case 1:
                   System.out.println(i+": "+a+"*"+b+"=");
                   int D = in.nextInt();
                   out.println(a+"*"+b+"="+D);
                   if (D == student.multiplication(a, b)) {
                       sum += 10;
                       System.out.println("right");
                   }
                   else {
                       System.out.println("false");
                   }
                   break;
               case 2:
                   System.out.println(i+": "+a+"+"+b+"=");
                   int E = in.nextInt();
                   out.println(a+"+"+b+"="+E);
                   if (E == student.add(a, b)) {
                       sum += 10;
                       System.out.println("right");
                   }
                   else {
                       System.out.println("false");
                   }
                    
                   break ;
               case 3:
                   System.out.println(i+": "+a+"-"+b+"=");
                   int F = in.nextInt();
                   out.println(a+"-"+b+"="+F);
                   if (F == student.reduce(a, b)) {
                       sum += 10;
                       System.out.println("right");
                   }
                   else {
                       System.out.println("false");
                   }
                   break ;
                  }
              }
           System.out.println("成绩"+sum);
            out.println("成绩:"+sum);
             out.close();       
       }
    }
    public class jieguo {
           private int a;
           private int b;
            public int  add(int a,int b)
            {
                return a+b;
            }
            public int   reduce(int a,int b)
            {
                return a-b;
            }
            public int   multiplication(int a,int b)
            {
                return a*b;
            }
            public int   division(int a,int b)
            {
                if(b!=0)
                return a/b;
                else return 0;
            }
     
    } 

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

    实验程序1:

    public class AssertDemo {
     3     public static void main(String[] args) {        
     4         test1(-5);
     5         test2(-3);
     6     }
     7     
     8     private static void test1(int a){
     9         assert a > 0;  //引用assert关键字对条件进行检测
    10         System.out.println(a);
    11     }
    12     private static void test2(int a){
    13        assert a > 0 : "something goes wrong here, a cannot be less than 0";
    14         System.out.println(a);
    15     }
    16 }

    禁用断言运行结果:

    启用断言运行结果:

    实验程序2:

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

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

    import java.awt.*;
      4 import java.awt.event.*;
      5 import java.io.*;
      6 import java.util.logging.*;
      7 import javax.swing.*;
      8 
      9 /**
     10  * A modification of the image viewer program that logs various events.
     11  * @version 1.03 2015-08-20
     12  * @author Cay Horstmann
     13  */
     14 public class LoggingImageViewer
     15 {
     16    public static void main(String[] args)
     17    {
     18       if (System.getProperty("java.util.logging.config.class") == null
     19             && System.getProperty("java.util.logging.config.file") == null)
     20       {
     21          try
     22          {
     23             Logger.getLogger("com.horstmann.corejava").setLevel(Level.ALL);
     24             final int LOG_ROTATION_COUNT = 10;
     25             FileHandler handler = new FileHandler("%h/LoggingImageViewer.log", 0, LOG_ROTATION_COUNT);
     26             Logger.getLogger("com.horstmann.corejava").addHandler(handler);
     27          }
     28          catch (IOException e)
     29          {
     30             Logger.getLogger("com.horstmann.corejava").log(Level.SEVERE,
     31                "Can't create log file handler", e);
     32          }
     33       }
     34 
     35       EventQueue.invokeLater(() ->
     36             {
     37                WindowHandler windowHandler = new WindowHandler();
     38                windowHandler.setLevel(Level.ALL);
     39                Logger.getLogger("com.horstmann.corejava").addHandler(windowHandler);
     40 
     41                ImageViewerFrame frame = new ImageViewerFrame();
     42                frame.setTitle("LoggingImageViewer");
     43                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
     44 
     45                Logger.getLogger("com.horstmann.corejava").fine("Showing frame");
     46                frame.setVisible(true);
     47             });
     48    }
     49 }
     50 
     51 /**
     52  * The frame that shows the image.
     53  */
     54 class ImageViewerFrame extends JFrame
     55 {
     56    private static final int DEFAULT_WIDTH = 300;
     57    private static final int DEFAULT_HEIGHT = 400;   
     58 
     59    private JLabel label;
     60    private static Logger logger = Logger.getLogger("com.horstmann.corejava");
     61 
     62    public ImageViewerFrame()
     63    {
     64       logger.entering("ImageViewerFrame", "<init>");      
     65       setSize(DEFAULT_WIDTH, DEFAULT_HEIGHT);
     66 
     67       // set up menu bar
     68       JMenuBar menuBar = new JMenuBar();
     69       setJMenuBar(menuBar);
     70 
     71       JMenu menu = new JMenu("File");
     72       menuBar.add(menu);
     73 
     74       JMenuItem openItem = new JMenuItem("Open");
     75       menu.add(openItem);
     76       openItem.addActionListener(new FileOpenListener());
     77 
     78       JMenuItem exitItem = new JMenuItem("Exit");
     79       menu.add(exitItem);
     80       exitItem.addActionListener(new ActionListener()
     81          {
     82             public void actionPerformed(ActionEvent event)
     83             {
     84                logger.fine("Exiting.");
     85                System.exit(0);
     86             }
     87          });
     88 
     89       // use a label to display the images
     90       label = new JLabel();
     91       add(label);
     92       logger.exiting("ImageViewerFrame", "<init>");
     93    }
     94 
     95    private class FileOpenListener implements ActionListener
     96    {
     97       public void actionPerformed(ActionEvent event)
     98       {
     99          logger.entering("ImageViewerFrame.FileOpenListener", "actionPerformed", event);
    100 
    101          // set up file chooser
    102          JFileChooser chooser = new JFileChooser();
    103          chooser.setCurrentDirectory(new File("."));
    104 
    105          // accept all files ending with .gif
    106          chooser.setFileFilter(new javax.swing.filechooser.FileFilter()
    107             {
    108                public boolean accept(File f)
    109                {
    110                   return f.getName().toLowerCase().endsWith(".gif") || f.isDirectory();
    111                }
    112 
    113                public String getDescription()
    114                {
    115                   return "GIF Images";
    116                }
    117             });
    118 
    119          // show file chooser dialog
    120          int r = chooser.showOpenDialog(ImageViewerFrame.this);
    121 
    122          // if image file accepted, set it as icon of the label
    123          if (r == JFileChooser.APPROVE_OPTION)
    124          {
    125             String name = chooser.getSelectedFile().getPath();
    126             logger.log(Level.FINE, "Reading file {0}", name);
    127             label.setIcon(new ImageIcon(name));
    128          }
    129          else logger.fine("File open dialog canceled.");
    130          logger.exiting("ImageViewerFrame.FileOpenListener", "actionPerformed");
    131       }
    132    }
    133 }
    134 
    135 /**
    136  * A handler for displaying log records in a window.
    137  */
    138 class WindowHandler extends StreamHandler
    139 {
    140    private JFrame frame;
    141 
    142    public WindowHandler()
    143    {
    144       frame = new JFrame();
    145       JTextArea output = new JTextArea();
    146       output.setEditable(false);
    147       frame.setSize(200, 200);
    148       frame.add(new JScrollPane(output));
    149       frame.setFocusableWindowState(false);
    150       frame.setVisible(true);
    151       setOutputStream(new OutputStream()
    152          {
    153             public void write(int b)
    154             {
    155             } // not called
    156 
    157             public void write(byte[] b, int off, int len)
    158             {
    159                output.append(new String(b, off, len));
    160             }
    161          });
    162    }
    163 
    164    public void publish(LogRecord record)
    165    {
    166       if (!frame.isVisible()) return;
    167       super.publish(record);
    168       flush();
    169    }
    170 }

    实验4:测试程序3

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

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

    具体代码如下:

    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);
                });
       }
    }
     
    /**
     * The frame that shows the image.
     */
    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);
     
          // set up menu bar
          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);
                }
             });
     
          // use a label to display the images
          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);
     
             // set up file chooser
             JFileChooser chooser = new JFileChooser();
             chooser.setCurrentDirectory(new File("."));
     
             // accept all files ending with .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";
                   }
                });
     
             // show file chooser dialog
    -

    结果如下:

    第三部分:实验总结:

    本周学习了程序运行过程中产生的异常和处理异常的方法,断言和日志。通过课后作业的学习,我对异常的抛出,断言有了进一步的认识,并且在测试程序和自主编程练习中加以应用,知道了一些异常情况的基本处理方式,对于异常有了更深刻的了解。

  • 相关阅读:
    Failed to convert WOFF 2.0 font to SFNT 字体图标显示不出来
    每日一字:困
    每日一字:biáng
    sqlserver数据类型简记
    每日一字:天
    可以作为今生目标的一句话
    每日一字:惑
    [转载]优秀程序员的12中能力
    每日一字:怒
    [转载]像树一样活着
  • 原文地址:https://www.cnblogs.com/1763088787h/p/11795383.html
Copyright © 2011-2022 走看看