20172319 2018.05.06-05.14
《Java程序设计教程》第9周学习总结
目录
教材学习内容总结
第十一章 异常:
- 11.1 异常处理:
异常: 程序中出现的问题或非正常情况;
一个异常是一个定义非正常情况或错误的对象;
错误类似于异常,但其代表不可恢复的问题且必须被捕获处理;
一个抛出异常可用3种方法处理:
1.根本不处理异常(忽略异常)——可能导致程序终止;
2.当异常发生时处理异常(使用try语句);
3.在程序的某个位置集中处理异常(捕获异常后,在方法调用层次的更高层处理该异常); - 11.2 未捕获的异常:
Exception in thread "main"java.lang.ArithmeticException: / by zero
at week9.Zero.main(Zero.java:17)
第一行(表示异常输出信息):何种异常;出现该异常的原因。
其他行(方法调用堆栈踪迹信息):异常在何处发生;
通过调用抛出异常类的方法,也可获取调用堆栈踪迹信息。(getMessage
方法:返回一个字符串,解释异常抛出的原因;printStackTrace
方法:输出调用堆栈踪迹信息)
- 11.3 try-catch语句:
try
{
//需要被检测的异常代码
}
catch(a Exception)
{
//相应的异常处理,即处理异常代码
}
catch(b Exception)
{
//相应的异常处理,即处理异常代码
}
catch(c Exception)
{
//相应的异常处理,即处理异常代码
}
...
finally
{
//一定会被执行的代码
}
若try中有异常抛出,则转到相应的catch子句中进行相应的异常处理。
- 11.4 异常的传递:
在异常的发生处没有捕获和处理该异常,则将传递给上级调用方法 - 11.5 异常类结构层次:
- 11.5.1 自定义异常:
从Exception类或其后代类派生一个新类,定义自己的异常。选择何种父类由新异常所代表的问题和条件决定。 - 11.5.2 可检测异常与不可检测异常:
可检测异常(编译器要求必须处置的异常):正确的程序在运行中,很容易出现的、情理可容的异常状况。一旦发生这种异常状况,就必须采取某种方式进行处理。
除了RuntimeException及其子类以外,其他的Exception类及其子类都属于可检测异常。这种异常 的特点是Java编译器会检查它,也就是说,当程序中可能出现这类异常,要么用try-catch语句捕获它,要么用throws子句声明抛出它,否则编译不会通过。
不可检测异常(编译器不要求强制处置的异常):包括运行时异常(RuntimeException与其子类)和错误(Error)。 - 11.6 I/O异常:
标准I/O流 | 说明 |
---|---|
System。in | 标准输入流 |
System。out | 标准输出流 |
System。err | 标准错误流(输出错误信息) |
(注:表格中的字符会自动产生链接,因此用。而不是.)
第十二章 递归:
- 12.1 递归思想:
方法调用自己本身 - 12.1.1 无穷递归:
非递归定义:基本情况。任何递归定义中必须有非递归定义的部分才能使其最终结束,否则将会产生无穷递归。 - 12.1.2 数学中的递归运算:
数学公式与数学函数。eg:n! - 12.2 递归编程:
- 12.2.1 递归与迭代的比较:
所有的问题都可以用迭代解决,但有些时候递归比迭代更方便。 - 12.2.2 直接递归与间接递归:
直接递归:方法调用自己。
间接递归:方法调用其他方法,最终导致再次调用自己。 - 12.3 递归的应用:
- 12.3.1 迷宫旅行
- 12.3.2 汉诺塔问题
教材学习中的问题和解决过程
- 问题1:finally子句一定会被执行?
- 解决:书上是这么说的,但其实这有先决条件:
1. 得先执行到try-catch语句;
可以看到,在try语句之前return就返回了,finally语句就不会执行。
可当return放在try语句里时,并不会影响到finally语句的执行。
理由: return 是可以当作终止语句来用的,可以它来跳出当前方法,并返回一个值给调用方法。然后该方法就结束了,不会执行return下面的语句。
Note: If the JVM exits while the try or catch code is being executed, then the finally block may not execute. Likewise, if the thread executing the try or catch code is interrupted or killed, the finally block may not execute even though the application as a whole continues.
当try语句退出时肯定会执行finally语句。这确保了即使发了一个意想不到的异常也会执行finally语句块。
但是finally的用处不仅是用来处理异常——它可以让程序员不会因为return、continue、或者break语句而忽略了清理代码。
把清理代码放在finally语句块里是一个很好的做法,即便可能不会有异常发生也要这样做。
2.在try或者catch的代码在运行的时候,程序终止:
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
/**
* 文件内容为:Hello
* 若将System.exit(0);注释掉,文件内容为Hi
*/
class ExceptionDemo5 {
public static void main(String[] args) {
try {
FileOutputStream fout = new FileOutputStream(new File("E:\ex.txt"));
fout.write("Hello".getBytes());
fout.close();
System.exit(0); // 直接退出系统
} catch (IOException e) {
} finally {
try {
FileOutputStream fout = new FileOutputStream(new File("E:\ex.txt"));
fout.write("Hi".getBytes());
fout.close();
} catch (IOException e) {
}
}
}
}
在执行try语句时,System.exit(0)中断了线程,因此finally不会被执行到。
return语句: 并不一定都是函数的出口,执行return时,只是把return后面的值复制了一份到返回值变量里去。
- 问题2:如果try里的异常被捕获了,那剩下的代码怎么办?
- 解决:当try中的语句出现异常,而catch会捕获并进行相应的处理,此时退出了try语句,在异常之后的代码将不会执行,可这东西存在是为了让程序更好地运行而不是发现异常后直接终止。
eg:
try:
open("file1.txt")
open("file2.txt")
open("file3.txt")
catch Exception, e:
print e
当file1不存在,catch到了并打印了error,而这样之后后面的open("file2.txt")
open("file3.txt")
便不会执行;
有人说放在finally语句中,嗯,听起来是个好主意,可若在open("file2.txt")
open("file3.txt")
出现异常怎么办?这样的程序还是不符合要求。
最后终于找到一个靠谱的:
try:
语句1
catch:
异常处理
try:
语句2
catch:
异常处理
这样可以避免出现异常后导致后面的代码被跳过。
记得当时纠结了好久,最后总结了一个字:懒: try-catch是在可能会出现异常的地方使用,而不是对一大整串代码进行try,这样虽然减少的代码的编写量,但写出的东西是不符合要求的。
-
问题3:读取和写入文件
-
解决:上课讲了,但讲得快,而且之前没给课堂代码,整个人也是稀里糊涂的,最后自己查了资料:
Java读取txt文件和写入txt文件
Java读取文件的几种方法
CSDN上面的东西挺多的,大多数知识都可以从中找到。 -
问题4:System.err???
-
解决:在三个标准I/O流中,System.out与System.err都是属于输出流,有什么不一样?
书上说System.err可以输出错误信息,System.out也可以啊
再看看用了System.err的,除了输出的信息更显眼外似乎也没什么不同。。。
后面自己查到了网上的代码,试了一下:
可以看出,使用了System.err
的3输出位置是不固定的。
System.out.println输出有缓存,System.err.println是立即输出,可能在输出1或2,还没有输出换行时输出3。
代码调试中的问题和解决过程
-
问题1:读取文件时遇到了空格
-
解决:在I/O异常练习时,遇到了读文件的操作,但读取时遇到空格,
最后找到string.split
方法,以某一特殊符为界,分割字符串后将每一部分存入数组。 -
问题2:I/O异常练习时实现任意个整数
-
解决:刚开始我的代码是这样的
Scanner scanner = new Scanner(System.in)
List elements = new LinkedList();
while(scanner.hasNext())
{
int element = scanner.nextInt();
if(element==0)
{
break;
}else{
elements.add(element);
}
}
Integer[] intArray = elements.toArray(new Integer[0]);
后面发现有漏洞,若用户要求输入0并写入文件怎么办?
emmmm,那就改咯
Scanner scanner = new Scanner(System.in)
List elements = new LinkedList();
while(scanner.hasNext())
{
int element = scanner.nextInt();
if(element.equals("XXX"))
{
break;
}else{
elements.add(element);
}
}
Integer[] intArray = elements.toArray(new Integer[0]);
然而还是遇到了问题element.equals("XXX")
不行,因为int element
,行改吧
Scanner scanner = new Scanner(System.in);
System.out.println("键入任意个整数,输入非整数时停止该操作并将所键入数存储:");
List elements = new LinkedList();
while(scanner.hasNext()){
System.out.println("键入任意个整数,输入非整数时停止该操作并将所键入数存储:");
int element = scanner.nextInt();
elements.add(element);
}
Integer[] intArray1 = (Integer[]) elements.toArray(new Integer[0]);
emmmm,貌似可以了,然而我发现这一操作不能停止,一有其他类型就直接报错,嗯,继续改:
Scanner scanner = new Scanner(System.in);
System.out.println("键入任意个整数,输入非整数时停止该操作并将所键入数存储:");
List elements = new LinkedList();
while(scanner.hasNextInt()){
System.out.println("键入任意个整数,输入非整数时停止该操作并将所键入数存储:");
int element = scanner.nextInt();
elements.add(element);
scanner.hasNext();
}
Integer[] intArray1 = (Integer[]) elements.toArray(new Integer[0]);
我的天,终于写好了,仅仅是为了满足0,这一要求,要仔细斟酌许久。
编程要锲而不舍,写代码要力求完美。不然交的程序会被扣分(#.#)
代码托管
上周考试错题总结
- 错题1:
- 理解:选择排序和插入排序都可以实现。这意味着不需要额外的存储空间,而在整个过程中需要被排序的数据重新排列在数据数组中 。
- 错题2:
- 理解:只要程序实现重载,多态性就得以体现。
结对及互评
点评过的同学博客和代码
- 本周结对学习情况:
- 20172316赵乾宸
- 博客中值得学习的或存在问题:
1.内容总结过于简单
2.每一周都有所成长,很好
3.问题的解决是通过查阅资料然后自己总结的,很好 - 20172329王文彬
- **博客中值得学习的或存在问题: **
1.排版格式缩进有问题
2.代码应有适当的注释及换行(考虑将来打开还能看得懂自己哪一行是干嘛的)
3.对于问题的追问很深入
其他(感悟、思考等,可选)
- 这一周算得上是挺忙的一周了,并没有时间来仔细看课本,都是依据练习的要求,不断地分解,不懂的就查漏补缺,
边做边学,理论与实践相结合更利于学习。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 202/202 | 1/2 | 15/15 | 积极主动敲代码 |
第二周 | 490/692 | 1/3 | 18/33 | 善于思考 |
第三周 | 581/1273 | 1/4 | 15/48 | 善于完善 |
第四周 | 1857/3130 | 1/6 | 33/81 | 累 |
第五周 | 655/3787 | 1/7 | 22/103 | |
第六周 | 531/4318 | 1/8 | 18/121 | |
第七周 | 810/5128 | 1/9 | 23/ 144 | |
第八周 | 698/5826 | 1/13 | 21/ 165 | |
第九周 | 756/6582 | 1/15 | 54/ 219 |