20175216 《Java程序设计》第七周学习总结

学号 20175216 《Java程序设计》第七周学习总结

教材学习内容总结

第八章要点:

程序设计本身的错误,建议使用Exception或其子类实例来表现,称错误处理为异常处理。
try-catch结构:

try{
    ...//易出错部分程序块
}catch(.../*错误信息,类似InputMismatchException*/){
    ...//出错后进入该程序块,在程序块内处理错误。
}

抛出异常:catch区块进行完部分错误处理后,可以使用throw将异常抛出,实际上可以再任何流程中抛出异常,直接跳离原有流程,抛出受检或非受检异常。

public static void main(String[] args) throws FileNotFoundException/*声明方法中会抛出异常*/{
    ...
    try{
        ...
    }catch(FileNotFoundException){
        ...
        throw ex;//执行时抛出异常
    }
}

try、catch 用法举例:

import java.util.*;

public class Average2
{
    public static void main(String[] args)
    {
       try
       {
           Scanner console = new Scanner(System.in);
           double sum = 0;
           int count = 0;
           while (true)
           {
               int number = console.nextInt();
               if (number ==0)
               {
                   break;
               }
               sum += number;
               count++;
           }
           System.out.printf("平均 %.2f%n",sum / count);
       }
       catch (InputMismatchException ex)
       {
           System.out.println("必须输入整数");
       }
    }
}

有时错误可以在捕捉处理之后,尝试恢复程序正常执行流程,例如:

import java.util.*;

public class Average3
{
    public static void main(String[] args)
    {
        Scanner console = new Scanner(System.in);
        double sum = 0;
        int count = 0;
        while (true)
        {
            try
            {
                int number = console.nextInt();
                if (number == 0)
                {
                    break;
                }
                sum += number;
                count++;
            }
            catch (InputMismatchException ex)
            {
                System.out.printf("略过非整数输入:%s%n", console.next());
            }
        }
        System.out.printf("平均 %.2f%n", sum / count);
    }
}

异常继承架构
Throwable 定义了取得错误信息、堆栈追踪等方法,有两个子类:java.lang.Error 与 java.lang.Exception

异常处理:程序设计本身的错误,建议使用 Exception 或其子类实例来表现,所以通常称错误处理为异常处理

单就语法与继承架构上来说,如果某个方法声明会抛出 Throwable 或子类实例,只要不是属于 Error、ava.lang.RuntimeException 或其子类实例,你就必须明确使用 try、catch语法加以处理,或者用 throws 声明这个方法会抛出异常,否则会编译失败

受检异常:Exception 或其子对象,但非属于 RuntimeException 或其子对象,称为受检异常

执行期异常(非受检异常):因为编译程序不会强迫一定得在语法上加以处理,亦称为非受检异常

规则表达式:String 的 matches() 方法中设定了 "\d*",这是规则表示式,表示检查字符串中的字符是不是数字,若是则 matches() 返回 true

如果父类异常对象在子类异常对象前被捕捉,则 catch 子类异常对象的区块将永远不不会被执行

多重捕捉语法:

try{
        做一些事...
    }catch(IOException | InterruptedException | ClassCastException e){
//catch 区块会在发生 IOException、InterruptedException、ClassCastException 时执行
        e.printStackTrace();
    }
catch 括号中列出的异常不得有继承关系,否则会发生编译错误
catch or throw?

如果方法设计流程中发生异常,而设计时没有充足的信息知道该如何处理,那么可以抛出异常,让调用方法的客户端来处理。为了告诉编译程序这个事实,必须用 throws 声明此方法会抛出的异常类型或父类型,编译程序才会让你通过编译。例如:

public class FileUtil {
    public static String readFile(String name)
        throws FileNotFoundException{
        StringBuilder text = new StringBuilder();
        Scanner console = new Scanner(new FileInputStream(name));
        while(console.hasNext()){
            text.append(console.nextLine())
                    .apend('\n');
        }
        return text.toString();
    }
}

自定义异常类别时,可以继承Throw、Error 或 Exception或其子类,如果不是继承自Error或 RuntimeException,那么就会是受检异常

自定义受检异常:

public class CustomizedException extends Exception{
...
}
错误发生时:

  • 无足够信息处理异常:就现有信息处理完异常后,重新抛出异常

  • 已针对错误做了某些处理:考虑自定义异常,用以更精确地表示出未处理的错误

  • 客户端有能力处理未处理的错误:自定义受检异常、填入适当错误信息并重新抛出,并在方法上使用 throws加以声明

  • 客户端没有准备好就调了方法造成未处理错误:自定义受检异常、填入适当错误信息并重新抛出

常用实用类:
String类:不可变类,一些看起来能够改变String的方法其实都是创建了一个带有方法所赋予特性的新String。StringBuffer类为字符串缓冲类,可变。
String类覆盖了Object类的equals()方法,而StringBuffer没有。String类的toString()方法是返回当前String实例本身的引用,而StringBuffer类的toString()方法返回的则是当前缓冲区中所有字符内容的新的String对象的引用。使用StringBuffer可以减少JVM创建String对象的次数,减少动态分配和回收内存的次数,提高程序的性能。
Scanner类:获取用户的输入
Math类:数学运算类
Random类:生成随机数
Data类:以毫秒数表示特定的日期。sysout(new Date()) 返回系统日期
DataFormat类:用于定制日期的格式。
Calendar类:设置和读取日期的其中一部分。
BigDecimal类:精准计算

代码调试中的问题和解决过程
问题1

public Test() throws RepletException {
    try {
      System.out.println("Test this Project!")
    }
    catch (Exception e) {
      throw new Exception(e.toString());
    }
  }

throw和throws的区别有什么啊?这里改成throw可以吗?
解决方案:
从网上查询得知,throws是用来声明一个方法可能抛出的所有异常信息,而throw则是指抛出的一个具体的异常类型。通常在一个方法(类)的声明处通过throws声明方法(类)可能抛出的异常信息,而在方法(类)内部通过throw声明一个具体的异常信息。throws通常不用显示的捕获异常,可由系统自动将所有捕获的异常信息抛给上级方法。throw则需要用户自己捕获相关的异常,而后在对其进行相关包装,最后在将包装后的异常信息抛出。

问题2: 什么是多重捕捉,要注意什么问题?
解决2: 一开始看书时,觉得多重捕捉就是讲多个异常合在一起捕捉,遵循"DRY"(Don't Repeat Yourself)原则,使程序更简洁。但是多重捕捉时出现问题,发现是没有注意异常继承架构。在多重捕捉的时候,catch括号中列出的异常不得有继承关系,否则会发生编译错误。

[代码托管]

  • 代码量截图:
    输入图片说明

上周考试错题总结

上周考试无错题。

其他(感悟、思考等,可选)

虚拟机一定记得备份,否则虚拟机崩了之后就会丢失,非常麻烦。
在学习教材的时候,发现其实自己编一遍代码与对着书编代码还是有很大区别的,自己编一遍的话,会发现很多只对着书编所察觉不到的细节,而这些细节也正是我们全面认识这个代码的关键点所在

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 32/32 1/1 12/12
第二周 302/334 1/2 10/22
第三周 771/1105 1/3 15/37
第四周 540/1645 1/4 14/51
第五周 399/2044 1/5 13/64
第六周 1112/3156 1/6 13/77
第七周 653/3809 1/7 13/90
  • 计划学习时间:15小时

  • 实际学习时间:13小时

  • 改进情况:
    这周学习了第八章知识,通过运行代码明白各代码的具体含义,体会到了娄老师上课一直提到的“做中学,学中做”。

参考资料

原文地址:https://www.cnblogs.com/besti20175216/p/10697207.html