20145204《Java程序设计》第5周学习总结
教材学习内容总结
语法与继承构架
我们之前接触到的C通常都是将程序流程和错误处理混在一起,在编写程序的时候必须考虑可能出现的错误并提前做好处理,然而在Java中则将错误以对象的方式呈现为java.lang.Throwable的各种实例,方便我们针对错误进行处理。以下是关于异常处理的学习。
异常体系结构
Throwable定义的错误信息分为两大子类:java.lang.Error和java.lang.exception。
- Error类是程序无法处理的严重的系统错误。有硬件层面的错误,或者内存空间不足等问题。
- Exception是程序本身可以处理的异常。在Java中分为非受检异常和受检异常两大类。受检异常(Exception及其子类)是在写程序时必须明确处理错误的方法,非受检异常(RuntimeException)不要求处理语法。
- 我们要掌握Exception异常处理必须要对java上层的类认真研究才可以学好。
异常的捕捉和处理
try、catch、finally、throw、throws是在异常处理中的五个关键字。
分别应用于不同状态下的异常处理。
关键字assert
有两种用法:
1、assert boolean_expression;
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出AssertionError,并终止执行。
2、assert boolean_expression; : detail_expression;
如果<boolean表达式>为true,则程序继续执行。
如果为false,则程序抛出java.lang.AssertionError,并输入<错误信息表达式>。
Collection
Collection简单的理解就是是最基本的集合接口,可以收集对象,一个Collection代表一组Object,即Collection的元素(Elements)。Collection的两个“子接口”List和Set。
List的作用是收集对象,并且以索引的方式保留收集的对象的顺序,set也是用来收集对象,但是set在收集的过程中如果有相同的对象就不再重复收集。
在collection收集对象时,由于事先不知道被收集的对象的形态,因此内部操作时都是用object来参考被收集的对象。
教材学习中的问题和解决过程
课本 TryCatch的两个程序比较:
第一个程序是将while循环语句放在try里面变量的定义都在try-catch里,而且当遇到错误输入时程序即停止。
try{
Scanner console =new Scanner (System.in);
double sum=0;
int count =0;
while(true){
int number=console.nextInt();
if(number==0)
{
break;// TODO code application logic here
}
sum+=number;
count++;
}System.out.printf("平均 %.2f%n",sum/count);
}catch (InputMismatchException ex){
System.out.println("必须输入整数");
}
}
}
运行结果:
第二种方案是try在while循环语句里,这样设置时当遇到错误输入时程序将跳过该输入,直到输入0是停止:
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);
}
运行结果:
在比较两个程序时这句程序 System.out.printf("平均 %.2f%n", sum/count);
在两个程序里的位置不一样,由于它是在while语句结束后才运行,所以我尝试将第一个程序里的这个语句放在与第二个程序里相同的位置,结果如下图:
出错了!细想一下原来try语句块里的内容以对象建立了一个实例,所以try语句块中的变量出了该语句块在调用就会出错。
代码调试中的问题和解决过程
public class Average4 {
public static void main(String[] args) {
double sum = 0;
int count = 0;
while(true){
int number = nextInt();
if(number ==0){
break;
}
sum += number;
count++;
}
System.out.printf("平均 %.2f%n",sum / count);
}
static Scanner console = new Scanner(System.in);
static int nextInt(){
String input = console.next();
while(!input.matches("\d*")){
System.out.println("请输入数字");
input = console.next();
}
return Integer.parseInt(input);
}gai
在这个程序中将因为是nextInt函数要用static Scanner console = new Scanner(System.in);
所以我把放在函数里却出现了问题:
这个不清楚是什么原因,还是static关键词没有弄的很透彻。
本周代码托管截图
其他(感悟、思考等,可选)
在这一周的学习中,实践部分加强了许多,以前总是觉得只要能够看懂课本上的代码就够了,所以就会出现一个误区:我明明可以看懂java代码为什么自己编的时候就我从下手?这周我不仅看代码,还试着移动一些看似可以动的代码的位置,可是这些句子一动就错,在初次编译就通不过,在找寻原因的过程中更让我加深了对java概念和java编写程序的理解,慢慢熟悉了java的编写程序规则。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 3500行 | 30篇 | 400小时 | |
第一周 | 100/100 | 1/1 | 20/20 | |
第二周 | 200/300 | 1/2 | 30/50 | |
第三周 | 300/600 | 2/4 | 28/78 | |
第四周 | 300/900 | 1/5 | 20/98 | |
第五周 | 300/1200 | 1/6 | 30/128 |