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

教材学习内容总结

try和catch

  • Java中所有错误都会被包装为对象,可以尝试try执行程序并捕捉catch代表错误的对象后做一些处理。

  • 如果用户输入的字符部分符合Scanner对象预期,可以使用try、catch语法,在错误发生时显示更友好的错误信息,并且在捕捉处理之后,尝试恢复程序正常流程。程序代码及运行结果如下。

      import java.util.*;
    public class Average3{
    public static void main(String[] args){
    Scanner console=new Scanner(System.in);
    double sum=0;
    int count=0;
    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);
    } }

异常继承架构

  • 设计错误对象都继承自java.lang.Throwable类,包含java.lang.Errorjava.lang.Eception两个子类。其中Eroor与其子类实例代表严重系统错误,Eception和其子类实例表现的是程序设计本身的错误。

  • catch异常后的区块内容重复了,可以使用多重捕捉语法如

      try{
    ...
    }catch(IOEeception | InterruptedException | ClassCastException e)
    {
    e.printStackTrace();
    }

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

finally

  • 无论try区块中有无异常发生,若撰写有finally区块,则finally区块一定会被执行。

  • 如果流程中先return了,那么finally区块会先执行完后,在将值返回。代码及程序运行结果如下。

      public class FinallyDemo{
    public static void main(String[] args){
    System.out.println(test(true));
    }
    static int test(boolean flag){
    try{
    if(flag){
    return 1;
    }
    }finally{
    System.out.println("finally...");
    }
    return 0;
    }
    }

关闭资源

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

  • 可以同时关闭两个以上的对象资源,中间要以分号分隔。在try的括号中,越后面撰写的对象资源会越早被关闭。代码及运行结果如下。

      import static java.lang.System.out;
    
      public class AutoCloseableDemo{
    public static void main(String[] args){
    try(ResourceSome some=new ResourceSome();
    ResourceOther other=new ResourceOther()){
    some.doSome();
    other.doOther();
    }catch(Exception ex){
    ex.printStackTrace();
    }
    }
    } class ResourceSome implements AutoCloseable{
    void doSome(){
    out.println("做一些事");
    }
    @Override
    public void close() throws Exception{
    out.println("资源Some被关闭");
    }
    } class ResourceOther implements AutoCloseable{
    void doOther(){
    out.println("做其他事");
    }
    @Override
    public void close() throws Exception{
    out.println("资源Other被关闭");
    }
    }

collection、List、Set、Queue

  • 收集对象的行为,像是新增对象的add()方法,移除对象的remove()方法等,都是定义在java.util.Collection中。

  • List是一种Collection,作用是收集对象,并以索引方式保留收集的对象顺序,其操作类之一是java.util.ArrayList。

  • ArrayList适合排序的时候用,可得到较好的速度表现。而LinkedList采用了链接结构,当需要调整索引顺序时,比较适用。

  • 同样是收集对象,在收集过程中若有相同对象,则不再重复收集,若有这类需求,可以使用Set接口的操作对象,String的Split()方法,可以指定切割字符串的方式。一般用hashcode()与equals()来判断对象是否相同。

  • Queue继承自Collection,Queue定义了自己的offer()、poll()与peek()等方法,操作失败时会返回特定值。Deque同理。代码及运行结果如下。

      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() {
    @Override
    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();
    }
    }
    }

Lambda表达式

  • Lambda表达式的语法省略了接口类型和方法名称。—>左边是参数列,右边是方法本体。编译程序可以由Request request的声明中得知语法上被省略的信息。

  • 可以通过Lambda表达式对上面的RequestQueue.java进行改写,使程序更简洁。

      import java.util.*;
    
      interface Request2
    {
    void execute();
    } public class RequestQueue2
    {
    public static void main (String[] args)
    {
    Queue<Request2>requests = new LinkedList<>();
    offerRequestTo(requests);
    process(requests);
    }
    static void offerRequestTo(Queue<Request2>requests)
    {
    for (int i = 1; i < 6;i++)
    {
    requests.offer
    (() -> System.out.printf("处理数据%f%n",Math.random()));
    }
    } static void process(Queue<Request2>requests)
    {
    while(requests.peek() != null)
    {
    Request2 request = requests.poll();
    request.execute();
    }
    }
    }

Interable与Iterator

  • 无论List、Set、Queue还是任何Collection,都可以使用forEach()来显示所收集的对象。
  • 在JDK5之后有了增强式for循环,前面看到它运用在数组上,实际上,增强式for循环还可以运用在操作Iterable接口的对象上。

Comparable与Comparator

  • Collection的sort()方法在取得a对象与b对象进行比较时,会先将a对象扮演为Comparable,然后调用a.compareTo(b),如果a对象顺序上小于b对象则返回小于0的值,若顺序上相等则返回0,若顺序上a大于b则返回大于0的值。
  • 在java的规范中,与顺序有关的行为,通常要不对象本身是Comparable,要不就是另行指定Comparator对象告知如何排序。
  • Queue的操作类之一java.util.PriorityQueue也是,收集至PriorityQueue的对象,会根据你指定的优先权来决定对象在队列中的顺序,优先权的告知,要不就是对象必须是Comparable,或者是建立PriorityQueue时指定Comparator对象。

键值对应的Map

  • 常用的Map操作类为java.util.HashMap与java.util.TreeMap。

  • 若要指定键取回对应的值,则使用get()方法,在hashMap中建立键值对应后,键是无序的,这可以在执行结果中看到。如果想让键是有序的,则可以使用TreeMap。

  • 一般常用Properties的setProperty()指定字符串类型的键值,getProperty指定字符串类型的键,取回字符串类型的值,通常称为属性名称和属性值。properties的=左边设定属性名称,右边设定属性值。

  • 访问Map键值结合Lambda表达式程序代码及运行如下。

      import java.util.*;
    
      public class MapKeyValue3 {
    public static void main(String[] args) {
    Map map = new TreeMap();
    map.put("one","一");
    map.put("two","二");
    map.put("three","三");
    map.forEach(
    (key,value) -> System.out.printf("(键 %s,值 %s)%n",key,value)
    ); }
    }

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

  • 学习到Set的应用时,发现教材269面的Students.java无法通过编译,在IDEA中提示有cannot resolve symbol 'set'的错误。

  • System.out.println();括号中的set 改为students 时编译通过并且成功运行,这是因为输出对象是students而非set,这是教材中的错误,但也提醒了我自己动手敲代码时应该多思考。

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

  • 注意到代码中需要输出的语句有些是用out.println();,有些是System.out.println();在调试课本264面Guest.java的代码时我尝试用System.out.println();代替原来的out.println();,发现结果并没有什么不同。

  • 于是我又在268面Wordcount.java代码中将原来的System.out.println();改成了out.println();,结果在IDEA中提示了错误。

  • 对比两个程序我发现Guest.java代码中比Wordcount.java多了一句import static java.lang.System.out;。将这句声明加到Wordcount.java后错误消失了。

  • 查阅资料后发现System.out.println();是写出到控制台上的,而out.println();是写出到一个输出流上的。所以如果想用out.println();偷懒,必须在前面声明import static java.lang.System.out;

代码托管截图如下





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

相比之前的学习,本周的学习内容对我而言比之前更加生疏,在理解代码理解教材内容时更加吃力,所以花费的时间也比之前多了很多。付出总是会有成果,我觉得这两章的学习给了我一种真正踏入java大门的感觉。越深入学习,会发现教材中有一些小错误,如果照搬教材上的代码那么永远都找不到解决问题的办法。我通过对照类似的程序,找出二者之间的不同之处,然后查阅资料,尝试着修改代码,虽然解决的方法略为笨拙,对我而言不仅有效而且充满乐趣。尝试着自己解决问题,在寻找答案的过程中思考,探索,达到学习的真正目的。

学习进度条

代码行数(新增/累积) 博客量(新增/累积) 学习时间(新增/累积) 重要成长
目标 5000行 30篇 400小时
第一周 200/200 2/2 20/20
第二周 300/500 1/3 20/40
第三周 400/900 1/4 25/65
第四周 1236/2136 1/5 30/95
第五周 1045/3181 1/6 35/130

参考资料

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

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

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

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

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

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

    20145213<Java程序设计>第一周学习总结 教材学习内容总结 期待了一个寒假,终于见识到了神秘的娄老师和他的Java课.虽说算不上金风玉露一相逢,没有胜却人间无数也是情理之中,但娄 ...

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

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

  5. 20145330孙文馨 《Java程序设计》第一周学习总结

    20145330孙文馨 <Java程序设计>第一周学习总结 教材学习内容总结 刚开始拿到这么厚一本书说没有压力是不可能的,开始从头看觉得很陌生进入不了状态,就稍微会有一点焦虑的感觉.于是就 ...

  6. 20145337 《Java程序设计》第九周学习总结

    20145337 <Java程序设计>第九周学习总结 教材学习内容总结 数据库本身是个独立运行的应用程序 撰写应用程序是利用通信协议对数据库进行指令交换,以进行数据的增删查找 JDBC可以 ...

  7. 20145337 《Java程序设计》第二周学习总结

    20145337 <Java程序设计>第二周学习总结 教材学习内容总结 Java可分基本类型与类类型: 基本类型分整数(short.int.long).字节(byte).浮点数(float ...

  8. 20145218《Java程序设计》第一周学习总结

    20145218 <Java程序设计>第一周学习总结 教材学习内容总结 今天下午看了Java学习的视频,感觉很是新奇,之前觉得Java学起来是艰难枯燥的,但通过第一章的学习觉得如果自己可以 ...

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

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

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

    20145224陈颢文<Java程序设计>第二周学习总结 教材学习内容总结 一.类型.变量与运算符 1.类型 整数: 可细分为为short整数(占2字节),int整数(占4字节),long ...

随机推荐

  1. easyui datagrid 异步加载数据时滚动条有时会自动滚到最底部的问题

    在使用easyui 的datagrid异步加载数据时发现滚动条有时会自动滚到最底部.经测试发现,如果加载数据前没有选中行则不会出现这个问题.这样我们可以在重新异步加载数据前取消选中行就可以避免这个问题 ...

  2. SpringBoot整合Mybatis,TypeAliases配置失败的问题

    SpringBoot整合Mybatis,TypeAliases配置失败的问题 问题描述 在应用MyBatis时,使用对象关系映射,将对象和Aliase映射起来. 在Mybatis的文档明确写出,如果你 ...

  3. Django学习笔记2

    1.BookInfo.objects.all() objects:是Manager类型的对象,用于与数据库进行交互 当定义模型类时没有指定管理器,则Django会为模型类提供一个名为objects的管 ...

  4. ORA-12541:TNS:无监听程序问题

    这种情况可能有多种原因,解决办法如下: 方法1.原因:监听日志listener.log过大,超过4. 步骤: a.暂停监听服务 b.删除listener.log,文件位置:E:\app\Adminis ...

  5. 浅谈CSS高度坍塌

    高度坍塌情况: 当父元素没有设置高度,且子元素块都向左(右)浮动起来,那么父元素就会出现坍塌的现象. 解决办法: 在父元素包含块中加一个div: 优点:兼容性强,适合初学者. 缺点:不利于优化. 方法 ...

  6. Java基础之final和abstract关键字

    final final在Java中是一个保留的关键字,可以声明成员变量.方法.类以及本地变量.一旦你将引用声明作final,你将不能改变这个引用了,编译器会检查代码,如果你试图将变量再次初始化的话,编 ...

  7. C/S与B/S 区别以及优缺点

    1.什么是C/S结构 C/S (Client/Server)结构,即客户机和服务器结构.它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现 ...

  8. Tomcat7 调优及 JVM 参数优化

      Tomcat 的缺省配置是不能稳定长期运行的,也就是不适合生产环境,它会死机,让你不断重新启动,甚至在午夜时分唤醒你.对于操作系统优化来说,是尽可能的增大可使用的内存容量.提高CPU 的频率,保证 ...

  9. sql 删除表字段中所有的空格

    源地址:http://bbs.csdn.net/topics/30322040 Sample表中有一个Name字段,目前当中有很多记录含有空格,如:“ 张 学 友 ”,如何用SQL语句将这些空格删掉, ...

  10. 北京Uber优步司机奖励政策(10月19日~10月25日)

    用户组:优步北京人民优步A组(适用于10月19日-10月25日) 滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万 ...