20172319 《Java程序设计教程》 第9周学习总结
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 |
参考资料
《Java程序设计与数据结构教程(第二版)》
《Java程序设计与数据结构教程(第二版)》学习指导
20172319 《Java程序设计教程》 第9周学习总结的更多相关文章
- 20172319 2018.04.01-04.11 《Java程序设计》第5周学习总结
20172319 2018.04.01-04.11 <Java程序设计>第5周学习总结 目录 教材学习内容总结 教材学习中的问题和解决过程 代码调试中的问题和解决过程 代码托管 上周考试错 ...
- 20172319 2018.03.27-04.05 《Java程序设计》第4周学习总结
20172319 2018.03.27-04.05 <Java程序设计>第4周学习总结 教材学习内容总结 第四章 编写类 类与对象的回顾:对象是有状态的,状态由对象的属性值确定.属性由类中 ...
- 20145206邹京儒《Java程序设计》第8周学习总结
20145206 <Java程序设计>第8周学习总结 教材学习内容总结 第十四章 NIO与NIO2 14.1 认识NIO NIO使用频道(Channel)来衔接数据节点,在处理数据时,NI ...
- 20145236 冯佳 《Java程序设计》第2周学习总结
20145236 <Java程序设计>第2周学习总结 教材学习内容总结 一.Java的基本类型. 在Java中的基本类型主要可区分为整数.字节.浮点数字符与布尔. •整数: 类型 长度 范 ...
- 20145129 《Java程序设计》第1周学习总结
20145129 <Java程序设计>第1周学习总结 教材学习内容总结 在第一章学习后初步了解了Java历史及发展,以及JCP,JSR,JVM的相关知识了解.JCP是一个开放性国际组织,由 ...
- 201521123082 《Java程序设计》第13周学习总结
201521123082 <Java程序设计>第13周学习总结 标签(空格分隔): java 1. 本周学习总结 以你喜欢的方式(思维导图.OneNote或其他)归纳总结多网络相关内容. ...
- 201521123082 《Java程序设计》第10周学习总结
201521123082 <Java程序设计>第10周学习总结 标签(空格分隔): java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容. A ...
- 201521123082 《Java程序设计》第9周学习总结
201521123082 <Java程序设计>第9周学习总结 标签(空格分隔):java 1.本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结异常相关内容. 2. 书面作业 ...
- 201521123082 《Java程序设计》第8周学习总结
201521123082 <Java程序设计>第8周学习总结 标签(空格分隔):Java 1. 本周学习总结 1.1 以你喜欢的方式(思维导图或其他)归纳总结集合与泛型相关内容. 1.2 ...
- 201521123061 《Java程序设计》第八周学习总结
201521123061 <Java程序设计>第八周学习总结 1. 本周学习总结 2. 书面作业 1.List中指定元素的删除(题目4-1) 1.1 实验总结 主要是应用到了list中的a ...
随机推荐
- [2012山东ACM省赛] Pick apples (贪心,全然背包,枚举)
Pick apples Time Limit: 1000MS Memory limit: 165536K 题目描写叙述 Once ago, there is a mystery yard which ...
- Jumpserver堡垒机搭建
系统: CentOS 7 IP: 192.168.11.199关闭 selinux 和防火墙 # setenforce # 临时关闭,重启后失效 # systemctl stop firewalld. ...
- UITableViewCell的父视图
最近版本测试阶段,发现一个奇怪的问题,以前在A测试机上出现的崩溃bug,解决后今天在B测试机上又出现了,在B上解决完之后,返回到设备A上发现又不行了.最后调试发现是测试设备系统版本不同导致的,A设备是 ...
- 六、Delphi10.3通过Json.Serializers单元对大量数据序列化
一.参考我之前的博客,Delphi可以很方便的把类和结构体转换成JSON数据,但是数据量大了,就会非常之慢,1万条数据需要20秒左右.如果引用Serializers单元,那么100万数据只需要4秒左右 ...
- Ajax第二天——JQuery的Ajax
JQuery中的Ajax jQuery 对 Ajax 操作进行了封装, 在 jQuery 中最底层的方法是 $.ajax(), 第二层是 load(), $.get() 和 $.post(), (常 ...
- 3504: [Cqoi2014]危桥
3504: [Cqoi2014]危桥 链接 分析: 首先往返的可以转化为全是“往”,那么只要将容量除以2即可. 然后S向a1连边容量为an(除以2之前为2*an),S向a2连边容量为an,b1,b2向 ...
- zabbix3调用接口发送短信告警
一.需求 之前使用的邮件告警,由于经常会忽略邮件,所以有时候告警查看的并不及时,所以增加短信告警的,以便及时处理. 二.zabbix-server端的配置 # 需要在zabbix-server端打开A ...
- 一个简单的nodejs项目(cat-names)分析
https://github.com/sindresorhus/cat-names 一个非常简单的nodejs项目,用来方便的获取猫猫的名字: 安装: npm install --save cat-n ...
- Storm 第一章 核心组件及编程模型
1 流式计算 流式计算:数据实时产生.实时传输.实时计算.实时展示 代表技术:Flume实时获取数据.Kafka/metaq实时数据存储.Storm/JStorm实时数据计算.Redis实时结果缓存. ...
- UWP 记一次WTS 和 UCT翻车经历
这次翻车,真的,在网上绝对找不到回答的. 只有在WTS的Issues讨论中才找到,哈哈 不过这个应该比较少遇到吧,据我所知,提出Issue那个大胸弟和我都遇到了... 翻车具备的条件如下: 1. 使用 ...