20162311 2016-2017-2 《程序设计与数据结构》第八周学习总结
教材学习内容总结
- 异常处理
- 异常是一个对象
- 程序运行出现异常时,可以捕获并进行适当处理
try-catch
语句- finally子句
- 异常的传播
- 异常可以形成类层次
- 异常分为免检异常和必检异常
- I/O异常
- 输入输出时会出现异常
蓝墨云班课视频学习总结
- 异常的分类
- RuntimeException以及它的子类都属于
unchecked
(免检)异常,其余属于checked
(必检)异常 checked
异常不进行处理或抛出的话,无法通过编译
- RuntimeException以及它的子类都属于
throw
和throws
的作用throw
用来抛出一个异常对象throws
用来声明异常(必检异常),throws Exception
紧跟在方法之后
- Java中的I/O
- 读取文件和写入文件的方法
- I/O中的核心类:
InputStream
,OutputStream
是所有字节流的父类
- 内部类和匿名内部类
- 内部类:一个类定义在另一个类的内部
- 匿名内部类:没有名字的内部类
教材学习中的问题和解决过程
-
问题1:在看云班课里的视频时,我跟着视频里的老师一起敲测试代码,把一个from.txt文件里的内容打印出来,却出现了不一样的情况
文件内容是“abcd”,按理打印出的应该是97、98、99、100(“abcd”的ASCII码),可是我的结果却是在100后面多了个10。 -
解决方案:我到云班课上提问,老师提示我查查10在ASCII码中的含义,于是我查了ASCII码表,发现10是换行符。于是我在虚拟机中用od命令查看from.txt文件的内容,发现最后果然有个换行符。
可是我并没有敲回车,也没有换行,为什么会有换行符呢?老师在讲解说,在Linux下,文件的每行会自动加一个换行符,我们是看不到的,要用od命令查看才能知道,而且如果实在Windows下,是自动加回车(“/r”)。 -
问题2:书上的程序10.2有一行代码,用到了这样一个方法:
Integer.praseInt();
,不明白这个方法的作用。 -
解决方案:查找API帮助文档。
praseInt()
是Integer
类中的一个静态方法,返回值类型为Int,作用是将字符串参数作为有符号的十进制整数进行解析。
书上的代码是要将一串String
类型的数字转化成Int
类型
代码调试中的问题和解决过程
- 问题1:在做PP10.1时,程序写好后编译运行,本应输入10个整数,结果确输了11个,我的源代码如下
import java.util.Scanner;
public class AverageNumberException
{
public static void main (String[] args)
{
String num;
int num1, sum = 0, average, i = 0;
final int TIMES = 10;
Scanner scan = new Scanner(System.in);
System.out.println("Enter 10 integers: ");
System.out.print(" ");
num = scan.nextLine();
while (i>=0 && i<10)
{
try
{
num1 = Integer.parseInt(num);
sum += num1;
i++;
}
catch(NumberFormatException e)
{
System.out.println("The integer you entered is invalid! Please input again.");
}
System.out.print(" ");
num = scan.nextLine();
}
average = sum / TIMES;
System.out.println("Average: " + average);
}
}
运行结果
我输了出去异常的数字之外,我输了11个数程序才结束
- 解决方案:我在IDEA上进行了调试,是循环出了问题
我把循环条件改了一下:
import java.util.Scanner;
public class AverageNumberException
{
public static void main (String[] args)
{
String num;
int num1, sum = 0, average, i = 0;
final int TIMES = 10;
Scanner scan = new Scanner(System.in);
System.out.println("Enter 10 integers: ");
while (ture)
{
try
{
System.out.print(" ");
num = scan.nextLine();
num1 = Integer.parseInt(num);
sum += num1;
i++;
}
catch(NumberFormatException e)
{
System.out.println("The integer you entered is invalid! Please input again.");
}
if (i==9)
{
break;
}
}
average = sum / TIMES;
System.out.println("Average: " + average);
}
}
但结果却是只能输9个数,我想肯定是循环出了问题,于是我把if(i==9)
改成了if(i==10)
,改好之后就能输入10个数了(除了那个异常的数)。我想原因是输入第一个整数后,i自加1,从0变成1,这样循环下去,到第九个有效整数时,i就变成了9,也就退出循环了。我又看了一下最初的代码,发现是同样的问题,于是也改了一下
import java.util.Scanner;
public class AverageNumberException
{
public static void main (String[] args)
{
String num;
int num1, sum = 0, average, i = 0;
final int TIMES = 10;
Scanner scan = new Scanner(System.in);
System.out.println("Enter 10 integers: ");
System.out.print(" ");
num = scan.nextLine();
while (i>=0 && i<9)
{
try
{
System.out.print(" ");
num = scan.nextLine();
num1 = Integer.parseInt(num);
sum += num1;
i++;
}
catch(NumberFormatException e)
{
System.out.println("The integer you entered is invalid! Please input again.");
}
}
average = sum / TIMES;
System.out.println("Average: " + average);
}
}
可结果却是,可以输10个整数了,但算出的结果却不对。我又仔细看了一下代码,发现虽然循环对了,但是,我在循环外输入了第一个整数,这个整数没有被转化成Int类型的值并加到sum中去,所以相当于少加了一个数。于是我在循环外加上了num1 = Integer.parseInt(num);
和sum += num1;
,这样就没有问题了。
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 错题1:
Which of the following methods are included with any object that implements the Iterator interface? (下面哪个方法包含了实现Iterator接口的对象?)
A .next
B .hasNext
C .toString
D .all of the above(以上都正确)
E .a and b(a和b)
正确答案: D
分析:next
和hasnext
是Iterator
中的抽象方法,toString
是Object
中的方法,而所有类都是Object
的子类,所以Iterator
中也有toString
方法。
- 错题2:
Suppose Animal is an interface that specifies a single method – speak. Now suppose the Dog class implements the Animal interface. In addition to the speak method, the Dog class also has a method called wagTail. Now consider the following code(假设Animal是一个指定了单一方法的接口--speak。现在假设Dog类实现了Animal接口。除了speak方法外,Dog类还有一个方法wagTail。现在思考下面的代码:).
Animal a = new Dog();
a.wagTail();
Which of the following is true about this code?(关于这段代码,下面哪项是正确的)
A .It will result in a compile-time error(这段代码会引起编译时错误).
B .It will result in a run-time error.(这段代码会引起运行时错误)
C .It will call the speak method defined in the Animal interface. (这段代码将会调用Animal接口中的speak方法)
D .It will call the wagTail method defined in the Dog class(这段代码将会调用Dog类中的wagTail方法).
E .none of the above are true. (以上都正确)
正确答案: A
分析:这段代码会出现编译时错误,Animal
接口中没有定义wagTail
方法。可以将其显式转换为Dog
类来调用wagTail
方法。
- 错题3:
An interface cannot declare any instance variables(接口不能声明任何实例变量).
A .true
B .false
正确答案: A
分析:接口不能声明任何实例对象,但可用来声明对象引用变量。
- 错题4:
FHS(英文:Filesystem Hierarchy Standard 中文:文件系统层次结构标准)定义了两层规范,第一层是()?
A ./etc 应该放置设置文件
B ./ 下面的各个目录应该要放什么文件数据
C .针对 /usr 及 /var 这两个目录的子目录来定义
D ./bin 与 /sbin 则应该放置可执行文件
E ./var/log 放置系统登录文件
F ./usr/share 放置共享数据
正确答案: B
分析:这是Linux的目录结构,参考Linux 基础入门(新版)中的第四节。
结对及互评
点评过的同学博客和代码
思考
Java是一门工具,从云班课里的视频可以看出,理论的东西较少。视频的大部分时间都是在用敲代码,也就是实践。所以向要学好Java,必须得多用,在运用的过程中找问题,从而学习到更多的东西。因此,不能仅仅照着书上的代码敲,还要多做课后的程序设计题目,培养自己的面向对象程序设计的思想,这样才能不断进步。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 113/113 | 1/1 | 10/10 | |
第二周 | 294/407 | 1/2 | 15/25 | |
第三周 | 433/840 | 1/3 | 15/40 | |
第四周 | 1169/2009 | 2/5 | 30/70 | |
第五周 | 825/2834 | 1/6 | 15/85 | |
第六周 | 331/3165 | 1/7 | 13/98 | |
第七周 | 738/3903 | 2/9 | 22/120 | |
第八周 | 428/4331 | 1/10 | 20/140 |
-
计划学习时间:15小时
-
实际学习时间:20小时
-
改进情况:在PP上花的时间占大部分,主要还是做的少,自己写代码时常常要翻翻笔记,或者重新看一遍视频,毕竟只看一次记不住。这样在做PP时免不了花费大量时间。以后还应当在看视频时就跟着老师一起做测试,这样能较快地掌握相关知识。同时书上的内容也要弄懂,不然做PP时还要不停地翻书,查找相关资料。