20145124《Java程序设计》第5周学习总结
20145124《Java程序设计》第5周学习总结
学习内容总结
8.1语法与继承结构
8.1.1Try、catch
java中所有的错误都会打包为对象,可以try catch代表错误的对象后做一些处理(可以显示错误,也可以恢复正常流程)。
8.1.2异常继承架构
错误包装为对象是可以抛出的,所有的设计错误对象都是继承java.lang.Throwable类(java.lang.Error、java.lang.Exception为其两个子类)。一般的,error错误抛出时,基本上不用处理。 如果某个方法声明会throw throwable或子类实例,不是error和runtimeexception及其子类,即必须用try catch进行处理。
exception及其子对象,不少于runtimeexception或其子对象,称为受检异常(受编译程序检查),程序认为你有能力处理错误,你就需要去处理。同时要注意错误发生的时机,是否可以及时处理。
如果父类异常对象在子类异常对象前catch,那么catch子类异常对象的区块将永远不会被执行,所以要注意捕捉的顺序。
可以使用多重捕捉简化程序(注意不得有继承关系)。
8.1.3Throw or Catch
如果方法设计流程中发生异常,而你没有充足的信息来知道如何处理,可以抛出异常,让调用方法的客户端来处理。 处理完部分错误后,可以使用throw将异常再抛出,但必须在方法上使用throws声明(受检异常)
8.1.4
处理完部分异常后,你可以重新抛出异常,为了更精确地显示错误,可以通过自定义异常
8.1.5Stacktrace
可以使用printstacktrace来进行错误的追踪,要善用stacktrace。用fillinstacktrace()方法可以重新装填异常堆栈,将起点设为重抛异常的地方,并返回throwable对象。
8.1.6assert
用来判断程序执行的某个time point或是否处于某个特定的state,不是的话可以停止程序进行修改。
Assertion常用的几种情况:
1、前置条件的准备(private方法之中) 2、调用方法后承诺效果 3、assert对象某个time point下的状态 4、取代批注 5、assert不会执行到的那部分 6、不能有default的状况
8.2异常与资源管理
8.2.1finally
无论try区块中有误发生异常,若有finally区块,则finally区块一定会被执行。另外注意如果程序流程中先return了,同时有finally区块,那会先执行finally区块再返回值。
8.2.2Try-With-Resources
自动尝试关闭资源是协助你关闭资源,而不是用于异常处理,使用该语法时,不要试图自行撰写程序代码关闭资源。
8.2.3java.lang.AutoCloseable
try with resources 语法所操作的一个接口。
使用Collection收集对象
认识Collection
收集对象的共同行为定义在Collection中。既然可以收集对象,也要能逐一取得对象,这就是java.lang.Iterable定义行为,它定义了iterator()方法返回java.util.Iterator操作对象,可以逐一取得对象。
具有索引的List
List是一种Collection ,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。
List定义了许多索引操作的方法。
ArrayList特性: 有个可指定容量的构造函数,在大致知道将收集的对象范围,可事先建立足够长度的内部数组。
LinkedList特性: LinkedList在操作List接口时,采用了链接结构。若收集对象经常会有变动索引的情况,考虑链接方式操作的List比较好,像是随时会有客户登录或注销的客户端List,使用LinkedList会有比较的好的效率。
内容不重复的Set
同样是收集对象,在收集过程中若有相同对象,则不再重复收集,此时可以使用Set接口的操作对象。
判断对象是否重复时,都会调用hashCode()与equals()方法,建议两个方法同时使用。
支持队列操作的Queue
使用ArrayDeque来操作容量有限的堆栈。
import java.util.*;
import static java.lang.System.out;
public class Stack
{
private Deque elems = new ArrayDeque();
private int capacity ;
public Stack(int capacity)
{
this.capacity = capacity;
}
public boolean push(Object elem)
{
if(isFull())
{
return false;
}
return elems.offerLast(elem);
}
private boolean ifFull()
{
return elems.size() + 1 > capacity;
}
public Object pop()
{
return elems.pollLast();
}
public Object peek()
{
return elems.size();
}
public static void main (String[] agrs)
{
Stack stack = new Stack(5);
stack.push("Justin");
stack.push("Monica");
stack.push("Irene");
out.println(stack.pop());
out.println(stack.pop());
out.println(stack.pop());
}
}
键值对应的Map
常用Map操作类
常用的Map操作类为java.util.HashMap与java.util.TreeMap,其继承自抽象类java.util.AbstractMap。
使用HashMap:在HashMap中建立键值对应之后,键是无序的。
使用TreeMap:如果使用TreeMap建立键值对应,则键的部分将会排序,条件是作为键的对象必须操作Comparable接口,或者是创建TreeMap时指定操作Comparator接口的对象。
使用Properties:Properties类继承自HashTable,HashTable操作了Map接口,Properties自然也有Map行为。Properties的=左边设定属性名称,右边设定属性值。可以使用Properties的load()方法指定InputStream实例。load()方法结束后会自动关闭InputStream实例。
访问Map键值
若想取得Map中所有的键,可以调用Map的keySet()返回Set对象。
若想同时取得Map的键与值,可以使用entrySet()方法,这会返回一个Set对象,每个元素都是Map.Entry实例,可以调用getKey()取得键,调用getValue()取得值。
Map没有继承Iterable,有个forEach()方法是定义在Map接口上,可使用这个方法结合Lambda表达式,在迭代键与值时获得不错的可读性。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 2000行 | 16篇 | 400小时 | |
第一周 | 200/200 | 2/2 | 20/20 | |
第二周 | 200/400 | 1/3 | 20/40 | |
第三周 | 200/600 | 1/4 | 20/60 | |
第四周 | 200/800 | 1/5 | 20/80 | |
第五周 | 200/1000 | 1/6 | 20/100 |