20145224 《Java程序设计》第五周学习总结

教材学习内容总结

第八章异常处理

8.1.1使用try、catch

·教材范例用户连续输入整数,输入0结束后显示输入数的平均值(代码如下)

import java.util.Scanner;

public class Average {
public static void main(String[] args) {
Scanner console = new Scanner(System.in);
double sum = 0;
int count = 0;
while(true) {
int number = console.nextInt();
if(number == 0) {
break;
}
sum += number;
count++;
}
System.out.printf("平均 %.2f%n", sum / count);
}
}

·运行结果如下:



·如果用户不小心将30输入为3o则会出现如下结果:



原因是Scanner对象nextInt()方法将用户输入的下一字符串直接定义为int型,,不符合对象预期,因此本章同学try以及catch代表错误对象后做一些处理。


import java.util.*; public class Average2 {
public static void main(String[] args) {
try {
Scanner console = new Scanner(System.in);
double sum = 0;
int count = 0;
while (true) {
int number = console.nextInt();
if (number == 0) {
break;
}
sum += number;
count++;
}
System.out.printf("平均 %.2f%n", sum / count);
} catch (InputMismatchException ex) {
System.out.println("必須輸入整數");
}
}
}

·运行结果如下:



若输入30错为3o则运行结果如下:



·若nextInt发生了(InputMismatchException ex)的错误,执行流程就会跳到catch区块,还可继续下一个循环流程:

·运行结果如下:



·若编程过程中出现了“unrepored exception IOException must be Caught or declare to be thrown···”

解决:使用try、catch打包System.in.read(),声明throws java.io.IOException。

·如果父类异常对象在子类异常前被捕捉,则catch子类异常对象的区块将永远不会被执行。

·catch括号中列出的异常不得有继承关系,否则会发生编译错误。

·在catch区块进行完部分错误处理之后,可以使用throw将异常再抛出。

·操作对象异常无法使用try、catch处理时,可由方法的客户端一句当时调用的环节信息进行处理,使用throw声明会抛出的异常类型或父类。

·如果使用继承时,父类某个方法声明throws某些异常,子类重新定义该方法时可以:①不声明throws任何异常②throws父类该方法中声明的某些异常③throws父类该方法中声明异常的子类④throws父类方法中未声明的其他异常⑤throws父类方法中声明异常的父类。在多重方法调用下,异常发生点可能是在某个方法之中,若想得知异常发生的根源,以及多重方法调用下的堆栈传播,可以利用异常对象自动收集的堆栈追踪来取得相关信息,例如调用异常对象的printStackTrace()。

·在使用throw重抛异常时,异常的追踪堆栈起点,仍是异常的发生根源,而不是重抛异常的地方!

·如果想要让异常堆栈七点为重抛异常的地方,可以使用fillInstackTrance()方法:

·断点的使用:

①断言客户端调用方法前,已经准备好某些前置条件(通常在private方法之中)

②断言客户端调用方法后,具有方法承诺的结果。

③断言对象某个时间点下的状态。

④使用断言取代批注。

⑤断言程序流程中绝对不会执行到的程序代码部分。

8.2

·FileUtil中通过Scanner搭配FileInputStream来读取文档,实际上Scanner对象有close方法,可以关闭Scanner相关资源与搭配的FileInputSream.断言是判定程序中的某个执行点必然是或不是某个状态,所以不能当作像if之类的判断式来使用,assert不应当作程序执行流程的一部分。

·若想最后一定要执行关闭资源的动作,try、catch语法可以搭配finally,无论try区块中有无发生异常,若撰写有finally区块,则finally区块一定会被执行。

·若程序撰写先return。而且有finally区块,那么这个区块会先执行,然后再讲返回值返回。

·尝试关闭资源语法:想要尝试自动关闭资源的对象,是撰写在try之后的括号中,如果无须catch处理任何异常,可以不用撰写,也不用撰写finally自行尝试关闭资源。

·尝试关闭资源语法可套用的对象,必须操作java.lang.AutoCloseable接口

·尝试关闭资源语法也可以同时关闭两个以上的对象资源,只要中间以分号分隔

第九章Collection与Map

9.1

·JavaSE中提供了满足各种需求的API,收集对象的行为,都定义在java.collection中,既能收集对象也能驱逐对象。

·如果手机是具有索引顺序,可以使用数组。

·List是一种Collection,作用是收集对象,并以索引的方式保留手机的对象顺序

import java.util.Arrays;

public class ArrayList<E> {
private Object[] elems;
private int next; public ArrayList(int capacity) {
elems = new Object[capacity];
} public ArrayList() {
this(16);
} public void add(E e) {
if(next == elems.length) {
elems = Arrays.copyOf(elems, elems.length * 2);
}
elems[next++] = e;
} public E get(int index) {
return (E) elems[index];
} public int size() {
return next;
}
}

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

·LinkedList在操作List接口时,采用了链接(Link)结构。

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

·HashSet的操作概念是,在内存中开设空间,每个空间会有个哈希编码。;Queue继承自Collection,所以也具有Collection的add()、remove()、element()等方法,然而Queue定义了自己的offer()、poll()与peek()等方法,最主要的差别之一在于:add()、remove()、element()等方法操作失败时会抛出异常,而offer()、poll()与peek()等方法操作失败时会返回特定值。

·如果对象有操作Queue,并打算以队列方式使用,且队列长度受限,通常建议使用offer()、poll()与peek()等方法。LinkedList不仅操作了List接口,与操作了Queue的行为,所以可以将LinkedList当作队列来使用。

import java.util.*;

interface Request {
void execute();
} public class RequestQueue {
public static void main(String[] args) {
Queue requests = new LinkedList();
offerRequestTo(requests);
process(requests);
} static void offerRequestTo(Queue requests) {
// 模擬將請求加入佇列
for (int i = 1; i < 6; i++) {
Request request = new Request() {
public void execute() {
System.out.printf("處理資料 %f%n", Math.random());
}
};
requests.offer(request);
}
}
// 處理佇列中的請求
static void process(Queue requests) {
while(requests.peek() != null) {
Request request = (Request) requests.poll();
request.execute();
}
}
}

·运行结果如下:



·使用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 isFull() {
return elems.size() + 1 > capacity;
} public Object pop() {
return elems.pollLast();
} public Object peek() {
return elems.peekLast();
} public int size() {
return elems.size();
} public static void main(String[] args) {
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());
}
}

·运行结果如下:



·队列的前端与尾端进行操作,在前端加入对象与取出对象,在尾端加入对象与取出对象,Queue的子接口Deque就定义了这类行为;java.util.ArrayDeque操作了Deque接口,可以使用ArrayDeque来操作容量有限的堆栈。泛型语法:类名称旁有角括号<>,这表示此类支持泛型。实际加入的对象是客户端声明的类型。

·匿名类语法来说,Lambda表达式的语法省略了接口类型与方法名称,->左边是参数列,而右边是方法本体;在Lambda表达式中使用区块时,如果方法必须有返回值,在区块中就必须使用return。interator()方法提升至新的java.util.Iterable父接口。

·Collections的sort()方法要求被排序的对象必须操作java.lang.Comparable接口,这个接口有个compareTo()方法必须返回大于0、等于0或小于0的数;Collections的sort()方法有另一个重载版本,可接受java.util.Comparator接口的操作对象,如果使用这个版本,排序方式将根据Comparator的compare()定义来决定。

解决方法

1.操作Comparable

import java.util.*;

class Account2 implements Comparable<Account2> {
private String name;
private String number;
private int balance; Account2(String name, String number, int balance) {
this.name = name;
this.number = number;
this.balance = balance;
} @Override
public String toString() {
return String.format("Account2(%s, %s, %d)", name, number, balance);
} @Override
public int compareTo(Account2 other) {
return this.balance - other.balance;
}
} public class Sort3 {
public static void main(String[] args) {
List accounts = Arrays.asList(
new Account2("Justin", "X1234", 1000),
new Account2("Monica", "X5678", 500),
new Account2("Irene", "X2468", 200)
);
Collections.sort(accounts);
System.out.println(accounts);
}
}

2.操作Comparator

import java.util.*;

public class Sort4 {
public static void main(String[] args) {
List words = Arrays.asList("B", "X", "A", "M", "F", "W", "O");
Collections.sort(words);
System.out.println(words);
}
}

·在java的规范中,与顺序有关的行为,通常要不对象本身是Comparable,要不就是另行指定Comparator对象告知如何排序;若要根据某个键来取得对应的值,可以事先利用java.util.Map接口的操作对象来建立键值对应数据,之后若要取得值,只要用对应的键就可以迅速取得。常用的Map操作类为java.util.HashMap与java.util.TreeMap,其继承自抽象类java.util.AbstractMap。

·Map也支持泛型语法,如使用HashMap的范例:

import java.util.*;
import static java.lang.System.out; public class Messages
{
public static void main(String[] args)
{
Map<String, String> messages = new HashMap<>();
messages.put("Justin", "Hello!Justin的訊息!");
messages.put("Monica", "給Monica的悄悄話!");
messages.put("Irene", "Irene的可愛貓喵喵叫!"); Scanner console = new Scanner(System.in);
out.print("取得誰的訊息:");
String message = messages.get(console.nextLine());
out.println(message);
out.println(messages);
}
}

·如果使用TreeMap建立键值对应,则键的部分则会排序,条件是作为键的对象必须操作Comparable接口,或者是在创建TreeMap时指定操作Comparator接口的对象。

Properties类继承自Hashtable,HashTable操作了Map接口,Properties自然也有Map的行为。虽然也可以使用put()设定键值对应、get()方法指定键取回值,不过一般常用Properties的setProperty()指定字符串类型的键值,getProperty()指定字符串类型的键,取回字符串类型的值,通常称为属性名称与属性值。

·如果想取得Map中所有的键,可以调用Map的keySet()返回Set对象。由于键是不重复的,所以用Set操作返回是理所当然的做法,如果想取得Map中所有的值,则可以使用values()返回Collection对象。

·如果想同时取得Map的键与值,可以使用entrySet()方法,这会返回一个Set对象,每个元素都是Map.Entry实例。可以调用getKey()取得键,调用getValue()取得值。

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

本周把第三章的课后操作题给编了一下,而且都能比较顺利地编出来,编写过程中遇到的一些错误也能自己发现并纠正,感觉找到了一些些信心了。

/**
* Created by Kevin Chen on 2016/4/1.
*/ import java.util.Scanner; public class Fibonacci {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
int x = 0;
int[] Fi = new int[51];
Fi[0] = 0; Fi[1] = 1;
System.out.println("求几个费式数?(50以内)");
int num = scanner.nextInt();
if (num >= 2) {
for (int j = 2; j < num; j++){
Fi[j] = Fi[j - 1] + Fi[j - 2];
}
}
for (int i = 0; i < num; i++){
System.out.printf("%3d;",Fi[i]);x++;
if (x == 5){
System.out.println();
x = 0;
} }
}
}

/**
* Created by Kevin Chen on 2016/4/1.
*/
public class WashPoker {
public static void main(String[] args) {
String[] poker = {"砖 A","砖 2","砖 3","砖 4","砖 5","砖 6","砖 7","砖 8","砖 9","砖 10","砖 J","砖 Q","砖 K",
"梅 A","梅 2","梅 3","梅 4","梅 5","梅 6","梅 7","梅 8","梅 9","梅 10","梅 J","梅 Q","梅 K",
"心 A","心 2","心 3","心 4","心 5","心 6","心 7","心 8","心 9","心 10","心 J","心 Q","心 K",
"桃 A","桃 2","桃 3","桃 4","桃 5","桃 6","桃 7","桃 8","桃 9","桃 10","桃 J","桃 Q","桃 K", };
int i = 52;int j = 0;
do{
int number = (int) (Math.random() * i-1);
System.out.printf(" %s;",poker[number]);
for (int k = number; k < i - 1; k++){
poker[k] = poker[k + 1];
}
i = i - 1;j++;
if (j == 13){
System.out.println();
j = 0;
}
}while (i != 0);
}
}

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

现在基本能够根据IDEA给出的错误提示自己找出代码的错误所在并纠正啦。

本周代码托管截图







学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 2/4 18/38
第三周 500/1000 3/7 22/60
第四周 300/1300 2/9 30/90

参考资料

《Java程序设计》第五周学习总结的更多相关文章

  1. 201521123025<java程序设计>第五周学习总结

    1. 本周学习总结 2. 书面作业 1.代码阅读:Child压缩包内源代码 1.1 com.parent包中Child.java文件能否编译通过?哪句会出现错误?试改正该错误.并分析输出结果. 1.2 ...

  2. Java程序设计第五周学习总结

    1. 本周学习总结 1.1 尝试使用思维导图总结有关多态与接口的知识点. 1.2 可选:使用常规方法总结其他上课内容. 2. 书面作业 **代码阅读:Child压缩包内源代码 Child.java源代 ...

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

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

  4. 21045308刘昊阳 《Java程序设计》第九周学习总结

    21045308刘昊阳 <Java程序设计>第九周学习总结 教材学习内容总结 第16章 整合数据库 16.1 JDBC入门 16.1.1 JDBC简介 数据库本身是个独立运行的应用程序 撰 ...

  5. 20145236 《Java程序设计》第九周学习总结

    20145236 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC简介 1.JDBC是java联机数据库的标准规范.它定义了一组标准类与接口,标准API ...

  6. 20155304田宜楠2006-2007-2 《Java程序设计》第一周学习总结

    20155304田宜楠2006-2007-2 <Java程序设计>第一周学习总结 教材学习内容总结 - 浏览教材,根据自己的理解每章提出一个问题 第一章 除了书上提到的开发工具还有什么适合 ...

  7. 20155303 2016-2017-2 《Java程序设计》第二周学习总结

    20155303 2016-2017-2 <Java程序设计>第二周学习总结 教材学习内容总结 『注意』 "//"为单行批注符: "/*"与&quo ...

  8. 20145237 《Java程序设计》第九周学习总结

    20145237 <Java程序设计>第九周学习总结 教材学习内容总结 第十六章 整合数据库 JDBC入门 ·数据库本身是个独立运行的应用程序 ·撰写应用程序是利用通信协议对数据库进行指令 ...

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

    20175209 <Java程序设计>第九周学习总结 一.教材知识点总结 有关数据库下载中存在可能出现的问题已经在博客<数据库安装和使用过程中出现的一些问题>给出了相应的解决办 ...

  10. 20175313 张黎仙《Java程序设计》第九周学习总结

    目录 学号 20175313 <Java程序设计>第九周学习总结 一.教材学习内容总结 二.教材学习中的问题和解决过程 三.代码托管 四.心得体会 五.学习进度条 六.参考资料 学号 20 ...

随机推荐

  1. Linux中安装Cisco Packet Tracer

    Cisco Packet tracer是什么? Cisco Packet Tracer是一个强大的网络模拟工具,用于进行Cisco认证时的培训.它为我们 提供了各个路由器和网络设备的良好的接口视图,这 ...

  2. HTML5媒体

    1.视频格式 格式 文件 描述 AVI .avi AVI (Audio Video Interleave) 格式是由微软开发的.所有运行 Windows 的计算机都支持 AVI 格式.它是因特网上很常 ...

  3. JBOSS批量扫描

    exploit-db提供出了EXP,如下: /* * JBoss JMXInvokerServlet Remote Command Execution * JMXInvoker.java v0.3 - ...

  4. ASP.NET四则运算--策略模式

    在ASP.NET中实现四则运算,同样使用了类的封装,以及策略模式.只不过是把封装的类.前台代码以及后台的代码分离开来,但同样是要达到功能的实现. Calculator.cs using System; ...

  5. 现在有T1、T2、T3三个线程,怎样保证T2在T1执行完后执行,T3在T2执行完后执行?使用Join

    public class TestJoin { public static void main(String[] args) { Thread t1 = new Thread(new T1(), &q ...

  6. T-SQL JOIN

    a表name sex张三 男李四 女 b表name age李四 30王五 23 1 全外连接select a.name,a.sex,b.name,b.agefrom a full outer join ...

  7. phpcms 内容——>评论管理 中添加 打开文章链接的 功能

    需要实现的功能:在后台管理系统中的 内容 下的——>评论管理  中添加 打开文章链接的 功能 1.数据库表是 v9_comment和v9_comment_data_1. v9_comment是被 ...

  8. SQL 语句集合

    创建数据库 创建之前判断该数据库是否存在 if exists (select * from sysdatabases where name='databaseName') drop database ...

  9. iOS - OC NSNumber 数字

    前言 @interface NSNumber : NSValue @interface NSDecimalNumber : NSNumber 将基本数据类型包装成 OC 对象 1.NSNumber 与 ...

  10. DBCP JAVA 连接池

    package com.sinoglobal.db; import java.sql.Connection; import java.sql.DriverManager; import java.sq ...