教材内容总结
这一周学习的进度和前几周比较的话是差不多的,都是学习两章。
异常处理
1.理解异常架构
2.牚握try...catch...finally处理异常的方法
3.会用throw,throws
4.理解Collection和Map架构
5.会用常见的数据结构和算法
6.了解Lambada和泛型
第八章内容主要是对Java的异常处理
Java的异常处理是通过5个关键字来实现的:try,catch,throw,throws,finally。
Throws:
throws总是出现在一个函数头中,用来标明该成员函数可能抛出的各种异常。 如果你想明确地抛出一个RuntimeException,你必须用throws语句来声明它的类型。
Throw:
throw总是出现在函数体中,用来抛出一个异常。程序会在throw语句后立即终止,它后面的语句执行不到,然后在包含它的所有try块中(可能在上层调用函数中)从里向外寻找含有与其匹配的catch子句的try块。
Try:
try语句用大括号{}指定了一段代码,该段代码可能会抛弃一个或多个例外。
Catch:
catch语句的参数类似于方法的声明,包括一个例外类型和一个例外对象。例外类型必须为Throwable类的子类,它指明了catch语句所处理的例外类型,例外对象则由运行时系统在try所指定的代码块中生成并被捕获,大括号中包含对象的处理,其中可以调用对象的方法。
catch语句可以有多个,分别处理不同类的例外。Java运行时系统从上到下分别对每个catch语句处理的例外类型进行检测,直到找到类型相匹配的catch语句为止。这里,类型匹配指catch所处理的例外类型与生成的例外对象的类型完全一致或者是它的父类,因此,catch语句的排列顺序应该是从特殊到一般。
也可以用一个catch语句处理多个例外类型,这时它的例外类型参数应该是这多个例外类型的父类,程序设计中要根据具体的情况来选择catch语句的例外处理类型。
Finally:
try所限定的代码中,当抛弃一个例外时,其后的代码不会被执行。通过finally语句可以指定一块代码。无论try所指定的程序块中抛弃或不抛弃例外,也无论catch语句的例外类型是否与所抛弃的例外的类型一致,finally所指定的代码都要被执行,它提供了统一的出口。通常在finally语句中可以进行资源的清除工作。如关闭打开的文件等。
collection与map
认识collection架构
Connection: 增、删、遍历对象
add
remove
clear
size
iterator
List: 类似数组,具有位置信息,带索引。List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。查看API文件的时候发现,List接口定义了add(int index, E element)、remove(int index)、set(int index, E element)等许多依索引操作的方法。
ArrayList
类似于《数据结构》中的线性表
LinkedList
类似于《数据结构》中的链表
Set: 其中的对象不能有重复的。同样是收集对象,在收集过程中若有相同对象,则不再重复收集,若有这类需求,可以使用Set接口的操作对象,String的Split()方法,可以指定切割字符串的方式。一般用hashcode()与equals()来判断对象是否相同。
Queue: 队列
核心方法
offer:添加一个元素并返回true,如果队列已满,则返回false。
poll:移除并返问队列头部的元素,如果队列为空,则返回null。
peek:返回队列头部的元素,如果队列为空,则返回null。
Deque: 双向队列。如果希望对Queue的两端进行加入、移除等动作,则可以使用java.util.Deque。
注意区分泛型与继承
Java的Collection API都支持泛型:在使用Collection收集对象时,由于事先不知道被收集对象的形态,因此内部操作时,都是使用object来参考被收集的对象,取回对象时也是以object类型返回。所以若想针对某类定义的行为操作,必须告诉编译程序,让对象重新扮演该类型。JDK5之后增加了泛型语法。若接口支持泛型,在操作时也会比较方便,只要声明参考时有指定类型,那么创建对象时就不用再写类型了,泛型也可以仅定义在方法上,最常见的是在静态方法上定义泛型。
Lambda表达式
注意与匿名类相比的好处:DRY(Don't Repeat Yourself)。
在JDK8中可以使用Lambda来简化程序,Lambda表达式的语法省略了接口类型和方法名称。—>左边是参数列,右边是方法本体。
Iterable与Iterator
Iterator
next
hasNext
Comparable与Comparator
sort:Java中对象排序,要么对象实现了Comparable可以直接sort要么提供Comparator对象告知sort如何排序
键值对应的Map
常用的Map类
以事先利用java.util.Map接口的操作对象来建立键值对应数据,之后若要取得值,只要用对应的键就可以迅速取得。判断键是否重复是根据hashcode()与equals(),所以作为键的对象必须操作hashcode()与equals()。
HashMap:建立的键值对应是无序的
TreeMap:建立的键值对应是有序的
Properties:配置文件
访问Map键值
keySet:将Map中所有的键存入到set集合中。因为set具备迭代器。所有可以迭代方式取出所有的键,再根据get方法。获取每一个键对应的值。keySet():迭代后只能通过get()取key。
values:获取集合中的所有的值,没有键,没有对应关系
教材中的问题并解决
1.最开始不懂什么时候catch什么时候throw
在仔细阅读教材并且查阅资料后,我才逐渐理解。
java 的异常分两大类,RuntimeException 及其子类不要求捕捉,而其它的异常要求捕捉随便举几个 RuntimeException 子异常,有:数组越界异常、空指针异常、0作除数异常非RuntimeException 异常有:Socket异常、IO异常等对比一下我们就会发现,RuntimeException 是在程序中可以完全避免的,比如数组越界异常,只要我在程序里作个判断,如果要访问的数组元素下标和数组的长度作一下比较就知道会不会越界,再比如空指针异常,如果在访问对象时判断一下对象的变量是否为空就可以了。而非RuntimeException 则是程序无法避免的,比如IO异常,你的程序正在读一个文件,而这个文件所在磁盘出现了坏道,这就必然会引发IOException,这是不是靠编程高手编写完美的程序就可以法避免得了的,程序所能做的只有出现异常之后怎么处理的问题。
2.区分throw与throws
1.import java.io.*;
import java.util.Scanner
public class FileUtil {
public static String readFile (String name) throws FileNotFoundException{
StringBuilder text=new StringBuilder();
try {
Scanner console = new Scanner(new FileInputStream(name));
while (console.hasNext()) {
text.append(console.nextLine())
.append('
');
}
} catch (FileNotFoundException ex){
ex.printStackTrace();
throw ex;
}
return text.toString();
}
}
2.public class Shoot {
static void pop()
throws NegativeArraySizeException{
int [] arr=new int[-3];
}
public static void main(String[] args) {
try{
pop();
}catch (NegativeArraySizeException e){
System.out.println("pop()方法抛出的异常");
}
}
}
通过上面两个例子,我理解了throw与throws的区别
throw是语句抛出一个异常。
语法:throw (异常对象);
throw e;
throws是方法可能抛出异常的声明。(用在声明方法时,表示该方法可能要抛出异常)
语法:(修饰符)(方法名)([参数列表])[throws(异常类)]{......}
public void doA(int a) throws Exception1,Exception3{...}
代码调试中的问题以及解决过程
1.在调试throw与throws时曾经出现过这样的情况。
经过调试后发现,原来是我还没有理解好公共类这个概念,以至于没有将文件名设置为Captor最后导致了错误。
2.书上p267页的代码刚打完idea就提醒最后的elem错误了
对照书上注释可知,最后一段代码的作用是访问所有Node并计数以取得对应索引对象,根据上面IDEA所提示的错误位置找到第一段代码中private class Node中,由书上注释可知,该段代码的作用是将收集的对象用Node封装,那么由此便可得知,在最后一段代码中return的值就应该是last.o而不是last.elem。
代码托管(http://git.oschina.net/bestiisjava2017/nhx20155309-Java)
代码提交过程截图:
- 运行 git log --pretty=format:"%h - %an, %cd : %s" 并截图
代码量截图:
- 运行 find src -name "*.java" | xargs cat | grep -v ^$ | wc -l 并截图
上周考试错题总结
上一周的考题我自我感觉是非常难,所以考的有一些不理想。
- 填空:使用JDB进行调试时单步执行命令有step和next,我们优先使用(next)。
- 填空:使用JDB进行调试时查看源代码的命令是(list)。
- 填空:System.out.println( “HELLO”.( toLowerCase() ) ) 会输出“hello”..
- 面向对象中,设计经验可以用(设计模式)表达
- 可以用父类声明对象引用,用子类生成对象,但需要强制类型转换。(X)
这些错误都表明了我对整个书并没有看透,甚至还有遗漏的地方,并且有时候过于死板举一反三的能力不高,这些都应该是我以后需要克服的。
结对及互评
评分标准
基于评分标准,我给本博客打分8分。
得分情况如下:
解决了教材中的问题
代码行数大于200行;
代码格式规范
按照模板书写
点评过的同学博客和代码
20155220 吴思其(git@git.oschina.net:bestiisjava2017/wsq20155220_javaProgramming.git)
体验和感悟
Java与其他语言也有很大的不同。Java提供了一个功能强大语言的所有功能,但几乎没有一点含混特征。C++安全性不好,但C和C++被大家接受,所以Java设计成C++形式,让大家很容易学习。Java去掉了C++语言中的指针运算、结构、typedefs、#define、需要释放内存等功能,减少了平常出错的50%,让Java的语言功能很精炼。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 200/500 | 2/4 | 18/38 | |
第三周 | 500/900 | 3/7 | 22/60 | |
第四周 | 280/1300 | 2/9 | 30/90 |
预计学习:30小时
实际学习:27小时