20145306 《Java程序设计》第5周学习总结
教材学习内容总结
第8章:
使用try catch java中所有的错误都会被打包成为对象,这些对象都是可以抛出的。所以这些对象都继承为java.lang.Throwable类,它有两个子类java.lang.Error和java.lang.Exception。Error与其子类实例代表着严重的系统错误,如硬件方面的错误,JVM错误,内存不足的错误。程序设计本身的错误用Exception类来表示,通常称错误处理为Exception Handing。如果一个方法抛出了Error或者Runtimeexception或其子类实例之外的异常实例,就必须用try catch语法来处理,或者在方法中用throws申明此方法会抛出异常实例,否则会编译失败。
while (true){
try{
int number=console.nextInt();
if(number==0){
break;
}
sum+=number;
count++;
}catch(InputMismatchException ex){
System.out.printf("略过非整数:%s%n",console.next());
}
}
System.out.printf("平均 %.2f%n",sum/count);
}
异常继承架构
Exception或其子对象,但不属于Runtimeexveption和其子对象称为受检异常。受检异常的存在是因为在于API设计者在实现某些方法时,某些条件成立时会引发错误。而且认为客户端有能力处理这类异常,而且编译程序必须要提示用户处理异常。客户端无权选择是否处理。属于Runtimeexception衍生出来的子类实例是API设计者在实现某些方法时,某些条件成时会引发错误而且认为API客户端在调用方法之前要进行检查,以避免发生错误。应为编译程序不强迫客户端在程序语法上加以处理,所以成为非受检异常。如果父类异常对象在子类异常对象前面被捕捉到,则catch子类异常对象的处理永远不会被进行,编译程序会检查出这个错误。从JDK7之后可以使用多重捕捉不过任然要注意括号后的异常不得出现继承关系,否则会发生编译错误。操作对象的过程中如果抛出受检异常,而目前的掌握信息又不足以处理,必须使用thorws申明此方法会抛出的异常类型或者父类型。在catch区块中进行完部分的错误处理之后可以使用thorw将异常抛出。对于非受检异常可以不用try catch和throws处理在JDK7中编译程序对于重新抛出的异常类型可以更加精准的判断。 要抓还是要抛
若果程序流程里面有什么异常,但根据目前已知的情况无法对异常进行处理则可以抛出异常。 贴心还是造成麻烦
java是唯一采用受检异常的语言。这有两个目的:一是文件化,受检异常声明会是API操作接口的一部分,客户端只要查阅文件,就可以知道方法可能会引发 哪些异常。二是提供编译程序信息,让编译程序能够在编译时期就检查出API客户端没有处理异常。受检异常本意良好,有助于程序设计人员注意到异常的可能性 并加以处理,但在应用程序规模扩大时,会逐渐对维护造成困难,上述情况不一定是你自定义API 时发生,也可能是在底层引入了一个会抛出受检异常的API而发生类似情况。在某个SQLException发生时,最好的方法是将异常浮现至用户画面呈 现,例如网页技术,将错误信息在网页上显示出来给管理人员。随着应用程序的演化,异常也可以考虑演化,也许一开始是设计为受检异常,但因为一系列因素,将 受检异常演化为非受检异常也是很有必要的。
第九章
认识Collection架构
程序中常有收集对象的需求,就目前为止,你学过可以收集对象的方式就是使用object数组,在javaSE中其实就提供了数个收集对象的类。你可 以直接取用这些类,而不用重新打造类似的API。收集对象的行为,像是新增对象的add()方法,移除对象的remove()方法等,都是定义在
java.util.Collection中。既然能收集对象,也能逐一取得对象,这就是java.lang.Iterable定义的行为,它定义了 iterator()方法返回java.util.Iterator操作对象,可以让你逐一取得对象。然而收集对象会有不同的需求,如果希望收集时记录每 个对象的索引顺序,并可依索引取回对象,这样的行为定义在java.util.List接口中。如果希望收集的对象不重复,具有集合的行为,则由 java.util.Set定义。如果希望收集对象时,以队列排列。收集的对象加入至尾端,取得对象时从前端,则可以使用 java.util.Queue。如果希望对Queue的两端进行加入、移除等动作,则可以使用java.util.Deque。 具有索引的List
List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。 查看API文件的时候发现,List接口定义了add()、remove()、set()等许多依索引操作的方法。 java.util.LinkedList也操作了List接口,可以将书上264页范例中的ArrayList换为LinkedList,而结果不变, 那么什么时候使用ArrayList,什么时候用LinkedList呢?简而言之就是,ArrayList适合排序的时候用,可得到较好的速度表现。而 LinkedList采用了链接结构,当需要调整索引顺序时,比较适用。 内容不重复的Set
同样是收集对象,在收集过程中若有相同对象,则不再重复收集,若有这类需求,可以使用Set接口的操作对象,String的Split()方法,可以指定切割字符串的方式。一般用hashcode()与equals()来判断对象是否相同。 4.支持队列操作的Queue Queue继承自Collection,所以也具有Collection的add()、remove()、element()等方法,然而 Queue定义了自己的offer()、poll()与peek()等方法。最主要的差别在于,add()、remove()、element()等方法 操作失败时会抛出异常,而offer()、poll()、peek()等方法操作失败时会返回特定值。同样的,Deque中定义addFirst()、 removeFirst()、getFirst()、addLast()、removeLast()、getLast()等方法,操作失败时会抛出异常, 而offerFirst()、pollFirst()、peekFirst()、offerLast()、pollLast()、peekLast()等 方法,操作失败时会返回特定值。此外,要记住堆栈结构是先进后出! 5.使用泛型 在使用Collection收集对象时,由于事先不知道被收集对象的形态,因此内部操作时,都是使用object来参考被收集的对象,取回对象时也 是以object类型返回。所以若想针对某类定义的行为操作,必须告诉编译程序,让对象重新扮演该类型。JDK5之后增加了泛型语法。若接口支持泛型,在 操作时也会比较方便,只要声明参考时有指定类型,那么创建对象时就不用再写类型了,泛型也可以仅定义在方法上,最常见的是在静态方法上定义泛型。
6.简介Lambda表达式 如书上279页的范例,你会看到信息重复了,声明request变量时已经告知是Request类型,而建立Request实例的匿名类语法又写了 一次,实际上Request接口只有一个方法必须实现,当这种情况发生时,在JDK8中可以使用Lambda来简化程序,Lambda表达式的语法省略了 接口类型和方法名称。—>左边是参数列,右边是方法本体。编译程序可以由Request request的声明中得知语法上被省略的信息。虽然不鼓励使用Lambda表达式来写复杂的演算,不过若流程较为复杂,无法在一行的Lambda表达式 中写完,可以使用区块{}符号包括演算流程。如果方法必须返回值,在区块中就必须使用return。