20145331《Java程序设计》第5周学习总结
20145331《Java程序设计》第5周学习总结
教材学习内容总结
第八章
概述
Java异常机制主要依赖于try、catch、finally、throw、throws五个关键字。
语法格式如下:
try
{
被检代码;
}
catch(异常类 变量)
{
处理异常的代码(处理方式);
}
关键词try后的一对大括号将一块可能发生异常的代码包起来,称为监控区域。Java方法在运行过程中出现异常,则创建异常对象。将异常抛出监控区域之 外,由Java运行时系统试图寻找匹配的catch子句以捕获异常。若有匹配的catch子句,则运行其异常处理代码,try-catch语句结束。
匹配的原则是:如果抛出的异常对象属于catch子句的异常类,或者属于该异常类的子类,则认为生成的异常对象与catch块捕获的异常类型相匹配。
Throw or Catch:
抛出异常*:当一个方法出现错误引发异常时,方法创建异常对象并交付运行时系统,异常对象中包含了异常类型和异常出现时的程序状态等异常信息。运行时系统负责寻找处置异常的代码并执行。
捕获异常:在方法抛出异常之后,运行时系统将转为寻找合适的异常处理器(exception handler)。潜在的异常处理器是异常发生时依次存留在调用栈中的方法的集合。当异常处理器所能处理的异常类型与方法抛出的异常类型相符时,即为合适 的异常处理器。运行时系统从发生异常的方法开始,依次回查调用栈中的方法,直至找到含有合适异常处理器的方法并执行。当运行时系统遍历调用栈而未找到合适 的异常处理器,则运行时系统终止。同时,意味着Java程序的终止。
finally:
finally创建一个代码块。该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行。finally块无论有没有异常抛出都会执行。如果异常被抛出,finally甚至是在没有与该异常相匹配的catch子句情况下也将执行。一个方法将从一个try/catch块返回到调用程序的任何时候,经过一个未捕获的异常或者是一个明确的返回语句,finally子句在方法返回之前仍将执行。这在关闭文件句柄和释放任何在方法开始时被分配的其他资源是很有用的。finally子句是可选项,可以有也可以无。然而每一个try语句至少需要一个catch或finally子句。
第九章
collection框架结构:
collection框架结构使程序员操作成批的数据或对象元素极为方便。这些接口和类有很多对抽象数据类型操作的API,其核心主要有三种:List、Set和Map。
List:
List是有序的Collection,使用此接口能够精确的控制每个元素插入的位置。用户能够使用索引(元素在List中的位置,类似于数组下 >标)来访问List中的元素,这类似于Java的数组。
ArrayList: 同Vector一样是一个基于数组上的链表,但是不同的是ArrayList不是同步的。所以在性能上要比Vector好一些,但是当运行到多线程环境中时,可需要自己在管理线程的同步问题。
LinkedList: LinkedList不同于前面两种List,它不是基于数组的,所以不受数组性能的限制。
Set:
Set是一种不包含重复的元素的无序Collection。
Map:
Map 是一种把键对象和值对象进行关联的容器,而一个值对象又可以是一个Map,依次类推,这样就可形成一个多级映射。对于键对象来说,像Set一样,一个 Map容器中的键对象不允许重复,这是为了保持查找结果的一致性;如果有两个键对象一样,那你想得到那个键对象所对应的值对象时就有问题了,可能你得到的并不是你想的那个值对象,结果会造成混乱,所以键的唯一性很重要,也是符合集合的性质的。当然在使用过程中,某个键所对应的值对象可能会发生变化,这时会按照最后一次修改的值对象与键对应。对于值对象则没有唯一性的要求,你可以将任意多个键都映射到一个值对象上,这不会发生任何问题(不过对你的使用却可能会造成不便,你不知道你得到的到底是那一个键所对应的值对象)。
教材学习中的问题和解决过程
·教材代码练习:
用户连续输入整数,输入0结束后显示输入数的平均值
public class Average {
public static void main(String[] args) {
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);
}
}
可以运用try、catch,可以在错误发生时显示友好的错误信息,用本章的知识对该代码做了如下处理:
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("必须输入整数");
}
}
还可以在捕捉处理错误之后,尝试恢复程序正常执行流程,如下所示:
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);
}
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
目标 | 3500行 | 20篇 | 300小时 | |
第一周 | 150/150 | 1/1 | 14/14 | |
第二周 | 150/300 | 1/2 | 14/28 | |
第三周 | 100/400 | 1/3 | 14/42 | 学会了托管代码,学会了用构造模型的方法来了解类与对象这部分的知识。 |
第四周 | 200/600 | 1/4 | 14/56 | |
第五周 | 317/917 | 1/5 | 14/70 |
其他(感悟、思考等,可选)
这两章感觉真的很难,相比于前面知识抽象了很多,有很多关于API的东西;通过观看相关的教学视频让我学到了不少东西,而且开始努力敲代码了,虽然还有上几章的内容没有搞懂,不过我敲到哪不会就去看相对应的视频,所以在这周在学习这两章的同时我对this、子父类、接口这些(可能大家感觉简单)的掌握有了更好的掌握,我不觉得这有什么丢人的,反而我真正学到了东西感到很满足(突然能看懂好多书上以前看不懂的代码了,不过还有好多不懂。。),今后我在完成老师规定任务的同时也会保持自己的节奏,真的希望保持这样的势头,总结这周就是在火车上被逼无奈敲代码,看视频,然后突然就停不下来了。
本周代码托管截图