20145223《Java程序设计》第5周学习总结
20145223 《Java程序设计》第5周学习总结
教材学习内容总结
·由于在编程的时候会遇到因各种原因而导致的错误,于是我们可以使用"try"、"catch"组成的语法捕捉错误:
try {
…………
}
catch(ArrayIndexOutOfBoundsException ex) {
…………
}
·在执行try区域中的语句如果发生错误,执行程序就会跳过有错的地方并将错误与catch括号中声明的类型比较,如果符合则执行接下来catch{……}中的语句。
·错误会被包装成对象,都继承自java.lang.Throwable类,两个子类java.lang.Error和java.lang.Exception在使用上有所不同。Error与其子类表示严重系统错误,基本上出现的这种错误不用处理。而Exception和其子类表示的是程序设计上本身的错误。
·如果某个方法声明抛出Throwable或子类实例,只要不是属于Error或者java.lang.RuntimeException及子类实例,就需要使用try/catch语法进行处理。
·在使用try/catch语法捕捉错误时,如果父类异常对象在子类异常对象前被捕捉,则catch子类异常对象的区块将不会被执行。也就是当我们想要完成程序的编译时,我们必须更改程序中对异常对象捕捉的顺序。
try {
throw new ArithmeticException("例外测試");
}
catch(Exceptione) {
System.out.println(e.toString());
}
catch(ArithmeticException e) {
System.out.println(e.toString());
}
更改后为:
try {
throw new ArithmeticException("例外测試");
}
catch(ArithmeticException e) {
System.out.println(e.toString());
}
catch(Exception e) {
System.out.println(e.toString());
}
·如果出现几个catch区块在做同样的事,例如:
try{
XXX
}catch(IOException e)
{
同样的事;
}catch(InterruptedException e)
{
同样的事;
}catch(ClassCastException e)
{
同样的事;
}……
可以使用多重语法使程序简化:(注意:catch括号中列出的异常不得有继承关系!)
try{
XXX
}catch(IOException|InterrupedException |ClassCastException e)
{
同样的事;
}
·如果操作对象的过程中抛出受检异常但是当前环境信息不足以处理异常,即无法使用try/catch语法,可由方法的客户端依据当时调用的环境信息进行处理,所以这时候我们要用throws声明此方法会抛出的异常类型或父类型。比如:
try {
double data = 100 / 0.0;
System.out.println("浮点数零除:" + data);
if(String.valueOf(data).equals("Infinity"))
throw new ArithmeticException("除零例外");
}
catch(ArithmeticException e) {
System.out.println(e);
}
·在catch区块进行错误处理后可用throw将异常再抛出。
·如果想得知异常发生的根源可以利用异常对象自动收集的堆栈追踪:
1、最简单的方法就是直接调用异常对象的printStackTrace()方法。
2、如果想得取得个别堆栈追踪元素进行处理,使用getStackTrace()方法。
3、如果想要让异常堆栈起点为重抛异常的地方,使用fillInstackTrace()方法
·Finally区块:无论try区块中是否有异常,只要撰写了finally区块,则该区块一定会被执行。如果在程序撰写的流程中出现了return,则先执行finally区块内容,再将结果所取得的值通过return返回。
·收集对象的行为(比如add()方法、remove()方法,都是定义在java.util.Collection中。对对象进行操作的行为,就是java.lang.Iterable定义的行为。
`如果希望收集时记录每个对象的索引顺序,并且取回对象,这样的行为定义在java.lang.List中
(1)如果希望手机的对象不重复,具有集合的行为,则由java.util.Set定义。
(2)如果希望收集对象时以队列方式,收集的对象加入至尾端,取得对象时从前端开始,则由java.util.Queue定义。
(3)如果希望对Queue的两端进行加入或移除操作,则使用java.util.Deque。
·List可以使用数组(Array)或是链结串行(LinkedList)来实作这个特性。对于循序加入与存取,使用ArrayList的效率比较好。对于经常变动元素排列顺序的需求,使用LinkedList会比较好
·ArrayList实例:
Scanner scanner = new Scanner(System.in);
List<String> list = new ArrayList<String>();
System.out.println("输入名称(使用quit结束)");
while(true) {
System.out.print("# ");
String input = scanner.next();
if(input.equals("quit"))
break;
list.add(input);
}
System.out.print("显示输入: ");
for(int i = 0; i < list.size(); i++)
System.out.print(list.get(i) + " ");
System.out.println();
·无论List 、Set还是Queue,都有iterator()方法。在JDK5以后,增强式for循环语句可用在数组上,也可用在Interable接口的对象上——编译程序蜜糖:
for(String s : list) {
System.out.print(s + " ");
}//使用foreach来遍访List中的元素
·利用java.util.Map接口的操作对象来建立键值对应数据,之后可以用键迅速取得值。
·判断键是否重复是根据hashCode()和equals(),作为键的对象必须操作这两个方法。
·HashMap的使用举例:
Map<String, String> map =
new HashMap<String, String>();
String key1 = "caterpillar";
String key2 = "justin";
map.put(key1, "caterpillar的讯息");
map.put(key2, "justin的讯息");
System.out.println(map.get(key1));
System.out.println(map.get(key2));
·取得Map中所有的值,可以用values()返回Collection对象。取得Map的键与值可以用entrySet()方法,调用getKey()取得键,调用getValue()取得值。
代码调试中的问题和解决过程
书上在介绍try/catch的使用方法的时候举了几个例子,但是当我把代码敲到程序中时出现了错误:
仔细检查之后我发现在程序一开始的地方我添加的import只有import java.util.Scanner;但是如果想要运行catch后括号内的内容,必须要再添加一个关于InputMismatchException的import,也就是说改为:
import java.util.InputMismatchException;
import java.util.Scanner;
(ps:书上后面举得例子中所用的方法则是直接添加了java.util.*)
其他(感悟、思考等,可选)
这两章书上的代码很多很长,如果只是机械地敲代码运行程序,那么学习效率也不高,并且也学不到什么东西。还不如用敲代码的时间多琢磨琢磨书上的代码到底是什么意思。盲目地去将书上的代码都试一遍不是学习的关键,重点在于你要弄懂代码里所运用了哪些知识点,慢慢累积起来,才能获得收获。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 4000行 | 20篇 | 400小时 | |
第一周 | 200/200 | 1/1 | 15/12 | |
第二周 | 180/380 | 1/1 | 18/12 | |
第三周 | 600/980 | 1/1 | 17/16 | |
第四周 | 400/1380 | 1/1 | 16/15 | |
第五周 | 300/1680 | 1/1 | 14/14 |