20145206 《Java程序设计》第5周学习总结

教材学习内容总结

第八章

8.1 语法与继承架构

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.Scanner;
  6. public class Average {
  7. public static void main(String[] args) {
  8. Scanner console = new Scanner(System.in);
  9. double sum = 0;
  10. int count = 0;
  11. while(true){
  12. int number = console.nextInt();
  13. if(number ==0){
  14. break;
  15. }
  16. sum += number;
  17. count++;
  18. }
  19. System.out.printf("平均 %.2f%n",sum / count);
  20. }
  21. }

如果用户不小心输入错误,就会出现以下情况:



Java 中所有错误都会被打包成对象,如果愿意,可以尝试捕捉代表错误的对象后做一些处理

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.*;
  6. public class Average2 {
  7. public static void main(String[] args) {
  8. try{
  9. Scanner console = new Scanner(System.in);
  10. double sum = 0;
  11. int count = 0;
  12. while (true){
  13. int number = console.nextInt();
  14. if(number ==0){
  15. break;
  16. }
  17. sum += number;
  18. count++;
  19. }
  20. System.out.printf("平均 %.2f%n", sum/count);
  21. }catch (InputMismatchException ex){
  22. System.out.println("必须输入整数");
  23. }
  24. }
  25. }

一个执行时有误的范例:

有时错误可以在捕捉处理之后,尝试恢复程序正常执行流程:

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.*;
  6. public class Average3 {
  7. public static void main(String[] args) {
  8. Scanner console = new Scanner(System.in);
  9. double sum = 0;
  10. int count = 0;
  11. while (true) {
  12. try {
  13. int number = console.nextInt();
  14. if (number == 0) {
  15. break;
  16. }
  17. sum += number;
  18. count++;
  19. } catch (InputMismatchException ex) {
  20. System.out.printf("略过非整数输入:%s%n", console.next());
  21. }
  22. }
  23. System.out.printf("平均 %.2f%n", sum/count);
  24. }
  25. }



错误会被包装为对象,这些对象都是可抛出的,因此设计错误对象都继承自java.lang.Throwable类,Throwable定义了取得错误信息、堆栈追踪等方法,它有两个子类:java.lang.Error与java.lang.Exception.

Error与其子类实例代表严重系统错误,发生严重系统错误时,Java应用程序本身是无力回复的,Error对象抛出时,基本上不用处理,任其传播至JVM为止,或者是最多留下日志信息。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.Scanner;
  6. public class Average4 {
  7. public static void main(String[] args) {
  8. double sum = 0;
  9. int count = 0;
  10. while(true){
  11. int number = nextInt();
  12. if(number ==0){
  13. break;
  14. }
  15. sum += number;
  16. count++;
  17. }
  18. System.out.printf("平均 %.2f%n",sum / count);
  19. }
  20. static Scanner console = new Scanner(System.in);
  21. static int nextInt(){
  22. String input = console.next();
  23. while(!input.matches("\\d*")){
  24. System.out.println("请输入数字");
  25. input = console.next();
  26. }
  27. return Integer.parseInt(input);
  28. }
  29. }

如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将永远不会被执行,编译程序会检查出这个错误。

Java的设计上认为,非受检异常是程序设计不当引发的漏洞,异常应自动往外传播,不应使用try、catch来尝试处理,而应改善程序逻辑来避免引发错误。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.io.*;
  6. import java.util.Scanner;
  7. public class FileUtil {
  8. public static String readFile(String name) throws FileNotFoundException{
  9. StringBuilder text = new StringBuilder();
  10. try{
  11. Scanner console = new Scanner (new FileInputStream(name));
  12. while(console.hasNext()){
  13. text.append(console.nextLine())
  14. .append('\n');
  15. }
  16. }catch(FileNotFoundException ex){
  17. ex.printStackTrace();
  18. throw ex;
  19. }
  20. return text.toString();
  21. }
  22. }

Java是唯一采用受检异常的语言,这有两个目的:一是文件化;二是提供编译程序信息。

查看堆栈追踪最简单的方法,就是直接调用异常对象的printStackTrace().

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. public class StackTraceDemo {
  6. public static void main(String[] args) {
  7. try{
  8. c();
  9. }catch(NullPointerException ex){
  10. ex.printStackTrace();
  11. }
  12. }
  13. static void c(){
  14. b();
  15. }
  16. static void b(){
  17. a();
  18. }
  19. static String a(){
  20. String text = null;
  21. return text.toUpperCase();
  22. }
  23. }

要善用堆栈追踪,前提是程序代码中不可有私吞异常的行为、对异常做了不适当的处理,或显示了不正确的信息。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. public class StackTraceDemo2 {
  6. public static void main(String[] args) {
  7. try{
  8. c();
  9. }catch(NullPointerException ex){
  10. ex.printStackTrace();
  11. }
  12. }
  13. static void c(){
  14. try{
  15. b();
  16. }catch(NullPointerException ex) {
  17. ex.printStackTrace();
  18. throw ex;
  19. }
  20. }
  21. static void b(){
  22. a();
  23. }
  24. static String a(){
  25. String text = null;
  26. return text.toUpperCase();
  27. }
  28. }

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. public class StackTraceDemo3 {
  6. public static void main(String[] args) {
  7. try{
  8. c();
  9. }catch(NullPointerException ex){
  10. ex.printStackTrace();
  11. }
  12. }
  13. static void c(){
  14. try{
  15. b();
  16. }catch(NullPointerException ex) {
  17. ex.printStackTrace();
  18. Throwable t = ex.fillInStackTrace();
  19. throw(NullPointerException) t;
  20. }
  21. }
  22. static void b(){
  23. a();
  24. }
  25. static String a(){
  26. String text = null;
  27. return text.toUpperCase();
  28. }
  29. }



8.2 异常与资源管理

无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。如果程序撰写的流程中先return了,而且也有finally区块,finally区块会先执行完后,再将值返回。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.io.*;
  6. import java.util.Scanner;
  7. public class TryCatchFinally {
  8. public static String readFile(String name) throws FileNotFoundException{
  9. StringBuilder text = new StringBuilder();
  10. Scanner console = null;
  11. try{
  12. console = new Scanner (new FileInputStream(name));
  13. while(console.hasNext()){
  14. text.append(console.nextLine())
  15. .append('\n');
  16. }
  17. }finally{
  18. if(console!=null) {
  19. console.close();
  20. }
  21. }
  22. return text.toString();
  23. }
  24. }
  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. public class FinallyDemo {
  6. public static void main(String[] args) {
  7. System.out.println(test(true));
  8. }
  9. static int test(boolean flag){
  10. try{
  11. if(flag){
  12. return 1;
  13. }
  14. }finally{
  15. System.out.println("finally...");
  16. }
  17. }return 0;
  18. }

在JDK之后,新增了尝试关闭资源语法,想要尝试自动关闭资源的对象,是撰写在try之后的括号中。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.io.FileInputStream;
  6. import java.io.FileNotFoundException;
  7. import java.util.Scanner;
  8. public class FileUtil2 {
  9. public static String readFile(String name) throws FileNotFoundException {
  10. StringBuilder text = new StringBuilder();
  11. try (Scanner console = new Scanner(new FileInputStream(name))) {
  12. while (console.hasNext()) {
  13. text.append(console.nextLine())
  14. .append('\n');
  15. }
  16. }
  17. return text.toString();
  18. }
  19. }

JDK的尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口,这是JDK7新增的接口。尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔。在try的括号中,越后面撰写的对象资源会越早被关闭。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. public class AutoClosableDemo {
  6. public static void main(String[] args) {
  7. try(Resource res = new Resource()){
  8. res.doSome();
  9. }catch(Exception ex){
  10. ex.printStackTrace();
  11. }
  12. }
  13. }
  14. class Resource implements AutoCloseable{
  15. void doSome(){
  16. System.out.println("做一些事");
  17. }
  18. @Override
  19. public void close() throws Exception{
  20. System.out.println("资源被关闭");
  21. }
  22. }

第九章

9.1 使用Collection收集对象

收集对象的行为,像是新增对象的add()方法、移除对象的remove()方法等,都是定义在java.util.Collection中,既然可以收集对象,也要能逐一取得对象,这就是java.lang.Iterable定义的行为,它定义了iterator()方法返回java.util.Iterator操作对象,可以让你逐一取得收集的对象。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.*;
  6. import static java.lang.System.out;
  7. public class Guest {
  8. public static void main(String[] args) {
  9. List names = new ArrayList();
  10. collectNameTo(names);
  11. out.println("访客名单:");
  12. printUpperCase(names);
  13. }
  14. static void collectNameTo(List names){
  15. Scanner console = new Scanner(System.in);
  16. while(true){
  17. out.print("访客名称:");
  18. String name = console.nextLine();
  19. if(name.equals("quit")){
  20. break;
  21. }
  22. names.add(name);
  23. }
  24. }
  25. static void printUpperCase(List names){
  26. for(int i = 0;i<names.size();i++){
  27. String name=(String) names.get(i);
  28. out.println(name.toUpperCase());
  29. }
  30. }
  31. }

数组在内存中会是连续的线性空间,根据索引随机存取时速度快,如果操作上有这类需求时,像是排序,就可以使用ArrayList,可得到较好的速度表现。

同样是收集对象,在收集过程中若有相同对象,则不再重复收集,若有这类需求,可以使用Set接口的操作对象。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.*;
  6. public class WordCount {
  7. public static void main(String[] args) {
  8. Scanner console = new Scanner(System.in);
  9. System.out.print("请输入英文:");
  10. Set words = tokenSet(console.nextLine());
  11. System.out.printf("不存在单字有%d个:%s%n",words.size(),words);
  12. }
  13. static Set tokenSet(String line){
  14. String[] tokens = line.split(" ");
  15. return new HashSet(Arrays.asList(tokens));
  16. }
  17. }



如果对象有操作Queue,并打算以队列方式使用,且队列长度受限,通常建议使用offer()、poll()、与peek()等方法。想对队列的前端与尾端进行操作,在前端加入对象与取出对象,在尾端加入对象与取出对象,Queue的子接口Deque就定义了这类行为。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/29.
  4. */
  5. import java.util.*;
  6. interface Request{
  7. void execute();
  8. }
  9. public class RequestQueue {
  10. public static void main(String[] args) {
  11. Queue requests = new LinkedList();
  12. offerRequestTo(requests);
  13. process(requests);
  14. }
  15. static void offerRequestTo(Queue requests){
  16. for(int i=1;i<6;i++){
  17. Request request = new Request(){
  18. public void execute(){
  19. System.out.printf("处理数据%f%n",Math.random());
  20. }
  21. };
  22. requests.offer(request);
  23. }
  24. }
  25. static void process(Queue requests){
  26. while(requests.peek()!=null){
  27. Request rquest = (Request) request.poll();
  28. request.execute();
  29. }
  30. }
  31. }

虽然不鼓励使用Lambda表达式来写复杂的演算,不过若流程较为复杂,无法在一行的Lambda表达式中写完时,可以使用区块{}符号包括演算流程。在Lambda表达式中使用区块时,如果方法必须返回值,在区块中就必须使用return.

在JDK5之后有了增强式for循环,除了运用在数组上,还可运用在操作Iterable接口的对象上。

在收集对象之后,对对象进行排序是常用的动作,你不用亲自操作排序算法,java.util.Collections提供有sort()方法。由于必须有索引才能进行排序,因此Collections的sort()方法接受List操作对象。

  1. package CH5;
  2. /**
  3. * Created by Administrator on 2016/3/31.
  4. */
  5. import java.util.*;
  6. public class Sort {
  7. public static void main(String[] args) {
  8. List numbers = Arrays.asList(10,2,3,1,9,15,4);
  9. Collections.sort(numbers);
  10. System.out.println(numbers);
  11. }
  12. }



在Java的规范中,跟顺序有关的行为,通常要不对象本身是Comparable,要不就是另行指定Comparator对象告知如何排序。JDK8在List上增加了sort()方法,可接受Comparator实例来指定排序方式。JDK8为排序加入了一些高级语义API,例如Comparator上新增了一些静态方法,结合这些方法,可以让程序代码写来具有较高的可读性。

一般常用Properties的setProperty()指定字符串类型的键值,getProperty()指定字符串类型的键,取回字符串类型的值,通常称为属性名称与属性值。

教材学习中的问题和解决过程

之前提到过在编程序时println与printf不知道什么时候用哪一个,有时用错会出现错误,在这一周敲代码的过程中我发现println适用于输出没有参数的文字等,可以直接换行,而printf则可以输出任何带参数或不带参数的语句,不知道我想的对不对,还是应该跟大家多多交流,多多讨论,这样才能进步!

代码调试中的问题和解决过程

之前在使用IDEA编程序时,明明编好运行成功的程序,再次打开时却无法运行,一直觉得很困惑,直到看到同学操作,我才发现原来之前我在新建文件时有一步出现问题,导致再次打开不能成功运行,还有新建文件时,以前我都是编一个代码建一个src文件夹,这样就会显得代码很乱,学会了每一周新建一个包,把这一周的程序都写在这个包下面,但这些包都在一个src文件夹下,这样看起来清晰了不少。

本周代码托管截图











其他(感悟、思考等,可选)

这一周我吸取了以前几周的教训,以前都是临近周末才开始学习Java,写博客,这一周我没有把任务堆到最后,早早翻开书本学习。虽然老师说看懂代码就不用去敲出来,但我觉得我还不能自己敲出代码,有时书上的例子看不太懂,还是自己动手敲出来慢慢找感觉,也许自己敲一敲就会了呢。这一周很大的收获就是会用wc统计代码行数,这样就能具体算出自己敲了多少行代码啦,也学会了在IDEA里建package,把每一周的代码都放到一个包里,这样就会方便很多,也会有利于维护。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 100/100 1/2 10/15
第二周 100/200 2/4 15/30
第三周 300/500 1/5 30/60
第四周 300/800 1/6 30/90
第五周 347/1147 1/7 30/120

参考资料

20145206邹京儒《Java程序设计》第5周学习总结的更多相关文章

  1. 20145206邹京儒《Java程序设计》课程总结

    20145206邹京儒<Java程序设计>课程总结 (按顺序)每周读书笔记链接汇总 第一周:http://www.cnblogs.com/ZouJR/p/5213572.html http ...

  2. 20145206邹京儒 web安全基础实践

    20145206邹京儒 web安全基础实践 一.实践过程记录 关于WebGoat 1.我们在命令行里执行:java -jar webgoat-container-7.0.1-war-exec.jar运 ...

  3. 20145206邹京儒 Exp8 Web基础

    20145206邹京儒 Exp8 Web基础 一.实践过程记录 Apache (一)环境配置 1.查看端口占用:在这里apach2占用端口80 2.测试apache是否正常工作:在kali的火狐浏览器 ...

  4. 20145206邹京儒 EXP7网络欺诈技术防范

    20145206邹京儒 EXP7网络欺诈技术防范 一.实践过程记录 URL攻击实验前准备 1.在终端中输入命令:netstat -tupln |grep 80,查看80端口是否被占用,如下图所示 2. ...

  5. 20145206邹京儒Exp6 信息搜集与漏洞扫描

    20145206邹京儒Exp6 信息搜集与漏洞扫描 一.实践过程记录 openvas漏洞扫描 1.openvas-check-setup来查看下他的安装状态: 如下图所示:在步骤7中出现错误,显示需要 ...

  6. 20145206邹京儒MSF基础应用

    20145206邹京儒MSF基础应用 一.MS08_067漏洞渗透攻击实践 实验前准备 1.两台虚拟机,其中一台为kali,一台为windows xp sp3(英文版). 2.在VMware中设置两台 ...

  7. 20145206邹京儒《网络对抗技术》 PC平台逆向破解

    20145206邹京儒<网络对抗技术> PC平台逆向破解 注入shellcode并执行 一.准备一段shellcode 二.设置环境 具体在终端中输入如下: apt-cache searc ...

  8. 20145206邹京儒《网络对抗》逆向及Bof基础实践

    20145206邹京儒<网络对抗>逆向及Bof基础实践 1 逆向及Bof基础实践说明 1.1 实践目标 本次实践的对象是一个名为pwn1的linux可执行文件. 该程序正常执行流程是:ma ...

  9. 20145213《Java程序设计》第九周学习总结

    20145213<Java程序设计>第九周学习总结 教材学习总结 "五一"假期过得太快,就像龙卷风.没有一点点防备,就与Java博客撞个满怀.在这个普天同庆的节日里,根 ...

  10. 20145213《Java程序设计》第二周学习总结

    20145213<Java程序设计>第二周学习总结 教材学习内容总结 本周娄老师给的任务是学习教材的第三章--基础语法.其实我觉得还蛮轻松的,因为在翻开厚重的书本,一股熟悉的气息扑面而来, ...

随机推荐

  1. go outside @ CULTS LYRICS

    I really want to go out I really want to go outside and stop to see your day You really want to hole ...

  2. Codeforces 271 Div 2 B. Worms

    题目链接:http://codeforces.com/contest/474/problem/B 解题报告:给你n个堆,第i个堆有ai个物品,物品的编号从1开始,第一堆的编号从1到a1,第二堆编号从a ...

  3. 浅谈VBA

    VBA,全称Visual Basic for Applications,其中的一些专业性的解释可以自行搜索,这里就不一一介绍.半年以前,我是不知道VBA的,当我听到VBA的时候,我却迷糊了.VBA是什 ...

  4. JavaScript中var关键字的使用详解

    作用 声明作用:如声明个变量. 语法 ? 1 var c = 1; 省略var 在javascript中,若省略var关键字而直接赋值,那么这个变量为全局变量,哪怕是在function里定义的. ? ...

  5. dp重拾-完全背包--HDU 4508

    减肥记 湫湫给了你每日食物清单,上面描述了当天她想吃的每种食物能带给她的幸福程度,以及会增加的卡路里量. Input 输入包含多组测试用例. 每组数据以一个整数n开始,表示每天的食物清单有n种食物. ...

  6. HackerRank training-the-army

    Description 有 \(n\) 个技能,每次可以通过一个巫师,将一个技能转化成另一个技能,问最有最多有多少不同的技能. Sol 网络流. 先说说我一开始非常 naive 的建图,将技能拆点,中 ...

  7. QT国际化 一 (lupdate/linguits/lrelease)

    QT国际化(lupdate/linguits/lrelease) 本文由乌合之众瞎写http://www.cnblogs.com/oloroso/ qt国际化其实就是qt中字符串的字符集编码的设置.当 ...

  8. win8_64下安装paramiko

    win8_64下安装paramiko C:\Python35\Scripts>easy_install paramiko 提示 C:\Python35\Scripts>python Pyt ...

  9. 7.7---找只含3,5,7的数(CC150)

    ----思路:利用三个队列,一个存3,一个存5,一个存7. 然后,3*3的都放第一个.然后3*5,5*5的放第二个.然后,3*7,5*7,7*7的都放第三个. 答案: public static in ...

  10. ndk学习11: linux内存管理

        1. 进程地址空间   2.内存管理     栈上分配空间 alloca()       栈上分配大小 strdupa()    拷贝一个字符串到栈上(显然这个函数不安全)           ...