zoukankan      html  css  js  c++  java
  • 201521123055 《Java程序设计》第9周学习总结

    1. 本章学习总结

    2. 书面作业

    Q.1常用异常

    题目5-1

    1.1 截图你的提交结果(出现学号)

    1.2 自己以前编写的代码中经常出现什么异常、需要捕获吗(为什么)?应如何避免?

    1.3 什么样的异常要求用户一定要使用捕获处理?

    1.1

    1.2

    在我个人以前的代码里经常出现的是大多属于未检查异常,诸如数组越界这样的,这种异常通常需要捕获并处理而不是抛出,因为这是人为造成的错误,完全在我们的控制之中,这需要我们更好的在代码里处理这类错误,而不是说明这些错误的发生的可能性。

    1.3

    当我们覆盖了一个父类的方法,而这个父类方法没有抛出异常,那么子类重写的方法就必须捕获并处理代码中出现的每一个已检查异常。不允许子类抛出父类中所没有的异常。

    Q2.处理异常使你的程序更加健壮

    题目5-2

    2.1 截图你的提交结果(出现学号)

    2.2 实验总结

    2.1

    2.2

    题目没什么难点,收获大概就是查看API发现各种异常的场景吧。

    Q3.throw与throws

    题目5-3

    3.1 截图你的提交结果(出现学号)

    3.2 阅读Integer.parsetInt源代码,结合3.1说说抛出异常时需要传递给调用者一些什么信息?

    3.1

    3.2

    先贴上parsetInt方法的代码

        public static int parseInt(String s, int radix)
                    throws NumberFormatException
    

    此处抛出了一个NumberFormatException异常,再来看这个异常在API中的描述

    Thrown to indicate that the application has attempted to convert a string to one of the numeric types, but that the string does not have the appropriate format.

    简单来说就是,将一个格式不正确的字符串转换为整型时会出现错误,那我们来模拟一个出现该错误的场景,测试代码如下:

        try{
            System.out.println(Integer.parseInt("a123"));
        }catch(NumberFormatException ex)
        {
            System.out.println(ex);
        }
    

    结果如下:

    java.lang.NumberFormatException: For input string: "a123"
    

    仔细来看这个打印结果给我们带来了哪些信息,首先是异常的类型,其次是异常的原因,这两点对于调用者来说是十分重要的,只要有了这两个信息,那么问题自然迎刃而解。

    4.函数题

    题目4-1(多种异常的捕获)

    4.1 截图你的提交结果(出现学号)

    4.2 一个try块中如果可能抛出多种异常,捕获时需要注意些什么?

    4.1

    4.2

    需要注意异常类的继承关系,以该题为例,三种异常类型有着很明显的继承关系:

    试将代码块做这样的调整:

            catch(Exception ex)
            {
                System.out.println("number format exception");
                System.out.println(ex);
            }
            catch(IllegalArgumentException ex)
            {
                System.out.println("illegal argument exception");
                System.out.println(ex);
            }
            catch(NumberFormatException ex)
            {
                System.out.println("other exception");
                System.out.println(ex);
            }
    

    运行发现报错,错误信息为:

    Error:(105, 13) java: 已捕获到异常错误java.lang.IllegalArgumentException
    Error:(110, 13) java: 已捕获到异常错误java.lang.NumberFormatException
    

    说是已捕捉到后面两种异常,原因就是catch代码按顺序执行下来,之前已经捕获了Exception异常,而IllegalArgumentException与NumberFormatException都是其派生类,也就不需要捕获了。那么从这里我们可以得知,在捕获异常时,一定要处理好各类异常的继承关系,将“小”的放在前面,“大”的放在后面

    Q5.为如下代码加上异常处理

    byte[] content = null;
    FileInputStream fis = new FileInputStream("testfis.txt");
    int bytesAvailabe = fis.available();//获得该文件可用的字节数
    if(bytesAvailabe>0){
        content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
        fis.read(content);//将文件内容读入数组
    }
    System.out.println(Arrays.toString(content));//打印数组内容
    

    5.1 改正代码,让其可正常运行。注1:里面有多个方法均可能抛出异常。注2:要使用finally关闭资源。

    5.2 使用Java7中的try-with-resources来改写上述代码实现自动关闭资源.

    5.1

        byte[] content = null;
        FileInputStream fis=null;
        try {
            fis=new FileInputStream("testfis.txt");
            int bytesAvailabe = fis.available();//获得该文件可用的字节数
            if (bytesAvailabe > 0) {
                content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
                fis.read(content);//将文件内容读入数组
                }
                System.out.println(Arrays.toString(content));//打印数组
        }
        catch(FileNotFoundException ex)
        {
            System.out.println(ex);
        }
        catch(IOException ex)
        {
            System.out.println(ex);
        }
        finally {
            System.out.println("关闭资源");
            try
            {
                fis.close();
            } catch(IOException ex){
                
            }
        }
    

    改进代码如上

    5.2

         try(FileInputStream fis=new FileInputStream("testfis.txt"))
        {
            byte[] content = null;
            try {
                int bytesAvailabe = fis.available();//获得该文件可用的字节数
                if (bytesAvailabe > 0) {
                    content = new byte[bytesAvailabe];//创建可容纳文件大小的数组
                    fis.read(content);//将文件内容读入数组
                    }
                    System.out.println(Arrays.toString(content));//打印数组
            }
            catch(FileNotFoundException ex)
            {
                System.out.println(ex);
            }
            catch(IOException ex)
            {
                System.out.println(ex);
            }
        }catch(IOException ex){
            ex.printStackTrace();
        }
    

    代码如上

    Q6.重点考核:使用异常改进你的购物车系统(未提交,得分不超过6分)

    举至少两个例子说明你是如何使用异常处理机制让你的程序变得更健壮。
    说明要包含2个部分:1. 问题说明(哪里会碰到异常)。2.解决方案(关键代码)

    找各种异常花了不少时间,不过确实也算是一种提高

    在购物车的加入选项中,如果信息栏为空时点击加入选项则会报错,原因是读取信息栏内信息失败(为空),以下是修改后代码:

            jb2.addActionListener(new ActionListener() {
            	public void actionPerformed(ActionEvent e) {
            		try{
                		Commodity c=new Commodity(Integer.valueOf(jtx2.getText()),jtx3.getText(), Double.valueOf(jtx4.getText()));
                		shopcar.add(c);
            		}catch(Exception ex)
            		{
                        JOptionPane.showMessageDialog(null,"加入失败","提示消息",JOptionPane.WARNING_MESSAGE);  
            		}
            	}
            });
    

    改进后,当信息栏为空时点击加入购物车选项,则会跳出提示窗口

    当购物车为空时,应该有提示信息,原先的则没有,需要进行处理。

    以下为修改后代码:

            public void actionPerformed(ActionEvent e) {
                 try{
                      boolean result=false;
                      for(int i=0;i<shopcar.car.size();i++)
                      {
                    	  ja1.setText(shopcar.car.get(i).toString());
                    	  result=true;
                    	  break;
                      }
                      if(result==false)throw new NullPointerException();
                  }catch(NullPointerException ex)
                  {
                      JOptionPane.showMessageDialog(null,"购物车为空","提示消息",JOptionPane.WARNING_MESSAGE); 
                  }
                }
            });
    

    用一个弹窗显示消息:

    3. PTA实验总结及码云上代码提交记录

  • 相关阅读:
    第四周学习总结
    第十三周编程总结
    2018秋季第十三周助教总结
    第十三周学习总结
    使用函数输出水仙花数 (void的用法)
    ZOJ3229 有源汇上下界最大流
    codeforces-1176 (div3)
    codeforces-1077 (div3)
    牛客假日团队赛1 题解
    牛客练习赛38 离线 启发式合并并查集
  • 原文地址:https://www.cnblogs.com/wkfg/p/6747602.html
Copyright © 2011-2022 走看看