程序中总有些意想不到的情况所引起的错误,Java中的错误也以对象方式呈现为java.lang.Throwable 的各式子类实例。只要你能捕捉包装的对象,就能够针对该错误作一些处理,例如:试回复正常流程、进行日志记录、以某种形式提醒用户。html
下面的例子是求输入数的平均数:前端
package cc.openhome; 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); } }
若是咱们输入:10 20 30 0(回车)会获得平均数20,可是若是咱们在键入的时候出现错误,若键入:1o 20 30 0(回车),则咱们会获得下面的错误提示:java
Exception in thread "main" java.util.InputMismatchException at java.util.Scanner.throwFor(Scanner.java:864) at java.util.Scanner.next(Scanner.java:1485) at java.util.Scanner.nextInt(Scanner.java:2117) at java.util.Scanner.nextInt(Scanner.java:2076) at cc.openhome.Average.main(Average.java:14) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147) Process finished with exit code 1
所以咱们能够try...catch来避免由于输入错误形成的程序中断,下面举了一个例子:git
package cc.openhome; 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("必須輸入整數"); } } }
这个例子中,对于处理错误是采起要求从新输入的方式,固然你也能够采起好比略过非法输入进行求平均值计算等方法进行异常处理。express
若是在方法设计流程中发生异常,而你设计时并无充足的信息知道该如何处理,那么能够抛出异常,让条用方法的客户端来处理。例如:设计模式
package cc.openhome; import java.io.*; import java.util.Scanner; public class FileUtil { public static String readFile(String name) throws FileNotFoundException { StringBuilder text = new StringBuilder(); try { Scanner console = new Scanner(new FileInputStream(name)); while(console.hasNext()) { text.append(console.nextLine()) .append('\n'); } } catch (FileNotFoundException ex) { ex.printStackTrace(); throw ex; } return text.toString(); } }
上面的程序中throws FileNotFoundException(声明方法中会抛出异常)与throw ex(执行时抛出异常)两处关键语句让try...catch处理不了异常的时候,能够抛出由调用方法的客户端处理,而且能够实现先处理部分事项再抛出。数组
在多重方法调用下,异常发生点可能时在某个方法之中,若想得知发生的根源,以及多重方法调用下异常的堆栈传播,能够利用异常对象自动收集的堆栈追踪来取得相关信息。多线程
查看堆栈追踪最简单的方法,就是直接调用异常对象printStackTrace()。例如:app
package cc.openhome; public class StackTraceDemo { public static void main(String[] args) { try { c(); } catch(NullPointerException ex) { ex.printStackTrace(); } } static void c() { b(); } static void b() { a(); } static String a() { String text = null; return text.toUpperCase(); } }
程序执行的某个时间点或某个状况下,必然处于或不处于何种状态,这是一种断言,例如某个时间点程序某个变量值必定时多少。断言的结果必定时成立或不成立,预期结果与实际程序状态相同时,断言成立,不然断言不成立。ide
下面有两种使用语法:
assert boolean_expression; assert boolean_expression : detail_expression;
boolean_expression 若为true,则什么事都不会发生,若是为false,则会发生java.lang.AssertionError,此时若采起的是第二个语法,则会将detail_expression的结果显示出来,若是当中是个对象,则调用toString()显示文字描述结果。
finally能够搭配try...catch来执行关闭资源的动做,不管try区块中有无发生异常,若撰写有finally区块,则finally区块必定会被执行。例如:
package cc.openhome; import java.io.*; import java.util.Scanner; public class FileUtil_2 { public static String readFile(String name) throws FileNotFoundException { StringBuilder text = new StringBuilder(); Scanner console = null; try { console = new Scanner(new FileInputStream(name)); while (console.hasNext()) { text.append(console.nextLine()) .append('\n'); } } finally { if(console != null) { console.close(); } } return text.toString(); } }
list是一种Collection,做用是收集对象,并以索引方式保留收集的对象顺序,其操做类之一是java.lang.ArrayList。List有两种不一样的类ArrayList与LinkedList,在使用过程当中前者是偏向于使用数组的特性,后者则是采用了连接结构。
关于收集对象,在收集过程当中如有相同对象,则再也不重复收集,如有这类需求,可使用Set接口的操做对象。例如:
static Set tokenSet(String line) { String[] tokens = line.split(" "); return new HashSet(Arrays.asList(tokens)); }
这个只是一个程序中的片断,一个子函数,其中就使用了HashSet收集不重复的字符串。
若是但愿收集对象时以队列方式,收集的对象加入至尾端,取得对象时从前端,则可使用Queue接口的操做对象。若是对象有操做Queue,并打算以队列方式使用,且队列长度受限,一般建议使用offer()、poll()与peek()等方法。
Queue方法 | Deque等义方法 |
---|---|
add() | addLast() |
offer() | offerLast() |
remove() | removeFirst() |
poll() | pollFirst() |
element() | getFirst() |
peek() | peekFirst() |
若是项取得Map中全部的键,能够调用Map的KeySet()返回Set对象。因为键时不重复的,因此用Set操做返回时理所固然的作法,若是想取得Map中全部的值,则可使用values()返回Collection对象。
本周的教材学习中出现了不少的问题,很大一方面是概念的问题,课本中提出的新概念没法经过阅读课本弄清楚,而后在后面的学习中就很迷茫。直到周末快结束我尚未整理完教材学习的问题,会在新的一周前几天尽快整理、解决并上传。
代码调试问题:课本中命名为SimpleLinkedList的java文件写入我在Idea中建立的工程之后,工程内其余的java文件都没法正常运行。截图以下:
解决方案:在同窗的提示下,我将SimpleLinkedList文件最后的返回值由elem修改为了o之后,其余的java文件又能够从新运行。
与20155201李卓雯同窗结对
20155201
20155208
20155314
20155303
这一周主要学习了第八章的错误处理,java系统内置的错误处理与c语言手动编译的if判断错误有很大的不一样,体现了java语言面向对象的特色,同时也体现了java更加丰富的内置功能。此外,最近这几周的java学习确实压力很大,由于我并无如老师说的课后每周40个学时去学习= =,因此不少的老的内容还没弄懂新的知识就补充进来,让我压力很大。不过老师上周提出的partner学习模式可能能够给我很大的帮助,借助同是萌新的同窗的解释能让我更容易去理解一些新的内容。上个星期,以前一块儿作挑战杯项目的同窗商量再一块儿作接下来的大创项目,咱们的课题就是借助java平台开发学生生活服务平台终端,那些同窗有java学得很是棒的,但愿这个项目能对java的课程学习有所帮助。
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 50/100 | 1/2 | 10/20 | |
第二周 | 150/200 | 1/2 | 20/30 | |
第三周 | 168/200 | 1/2 | 15/20 | |
第四周 | 300/500 | 1/2 | 20/20 | |
第五周 | 885/1000 | 1/2 | 30/30 |
《Java学习笔记(第8版)》学习指导
Java多线程之Runable与Thread
2016-2017-2 《Java程序设计》教学进程