《Java技术》第六次作业

(一)学习总结

1. xMind总结笔记

  • 第五章异常处理的笔记总结

  • 第七章泛型与集合的笔记总结

2. 当程序中出现异常时,JVM会依据方法调用顺序依次查找有关的错误处理程序。可使用printStackTrace 和getMessage方法了解异常发生的情况。阅读下面的程序,说明printStackTrace方法和getMessage 方法的输出结果分别是什么?并分析异常的传播过程。

    public class PrintExceptionStack {
         public static void main( String args[] ) { 
            try { 
                method1(); 
                } 
            catch ( Exception e ) { 
                System.err.println( e.getMessage() + "\n" );
                e.printStackTrace();
            } 
        }
        public static void method1() throws Exception { 
            method2(); 
        } 
        public static void method2() throws Exception { 
            method3();
        } 
        public static void method3() throws Exception { 
            throw new Exception( "Exception thrown in method3" ); 
        } 
    }
  • printStackTrace方法输出的是异常信息与出现异常的位置:

      java.lang.Exception: Exception thrown in method3
      at lalal.PrintExceptionStack.method3(PrintExceptionStack.java:23)
      at lalal.PrintExceptionStack.method2(PrintExceptionStack.java:19)
      at lalal.PrintExceptionStack.method1(PrintExceptionStack.java:15)
      at lalal.PrintExceptionStack.main(PrintExceptionStack.java:7)
    
  • getMessage 方法输出的是异常名称:

      Exception thrown in method3
    
  • try区域中发生的异常,由catch中指定的程序处理,throw是抛出异常
    method3() 抛出异常-> method2() 抛出异常-> method1()抛出异常-> main()

3. 阅读下面程序,分析程序的运行结果,解释产生错误的原因,如果删除的是books集合的最后一个对象,运行的结果又是什么?你能对此作出解释吗?如果在遍历时非要删除集合中的元素,应如何实现?

    import java.util.*;
    public class Test{
        public static void main(String[] args) {
            Collection<String> books = new ArrayList<String>();
            books.add("One book");
            books.add("Two book");
            books.add("Three book");
            System.out.println("原始元素之后:"+books);
            Iterator<String> it = books.iterator();
            while(it.hasNext()){
                String book = (String)it.next();
                System.out.println(book);
                if (book.equals("One book")){
                     books.remove(book);
                }
            }
                System.out.println("移除元素之后:"+books);
        }
    }
  • 运行结果:

              原始元素之后:
      [One book, Two book, Three book]
      Exception in thread "main" java.util.ConcurrentModificationException
      at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)
      One book
      at java.util.ArrayList$Itr.next(ArrayList.java:791)
      at lalal.Test.main(Test.java:16)
    
  • 删除的是books集合的最后一个对象,运行的结果是(将if里的One book改为Three book就是删除最后一个了):

        原始元素之后:[One book, Two book, Three book]
          One book
          Two book
          Three book
          Exception in thread "main"java.util.ConcurrentModificationException
          at java.util.ArrayList$Itr.checkForComodification(ArrayList.java:819)	                                                                   at java.util.ArrayList$Itr.next(ArrayList.java:791)
          at lalal.PrintExceptionStack.main(PrintExceptionStack.java:16)
    
  • 原因:程序运行中确实把第一个删除了,但是删除用的是book对象删除的破坏了迭代器的内容,迭代器就出现错误了。同理删除最后一个的时候也破坏了迭代器的内容所以程序仍无法进行。

  • 修改后程序:

      import java.util.*;
      public class Test {
          public static void main(String[] args) {
              Collection<String> books = new ArrayList<String>();
              books.add("One book");
              books.add("Two book");
              books.add("Three book");
              System.out.println("原始元素之后:" + books);
              Iterator<String> it = books.iterator();
                   while (it.hasNext()) {
                   String book = (String) it.next();
                   System.out.println(book);
                   if (book.equals("One book")) {
                      it.remove();//将books.remove(book)改为it.remove(),用迭代器删除
                  }
              }
            System.out.println("移除元素之后:" + books);
          }
      }
    

4. HashSet存储的元素是不可重复的。运行下面的程序,分析为什么存入了相同的学生信息?如果要去掉重复元素,应该如何修改程序。

    import java.util.*;
    class Student {
        String id;  
        String name;
        public Student(String id, String name) {
            this.id = id;
            this.name = name;
        }
        public String toString() {
            return "Student id=" + id + ", name=" + name ;
        }
    }
    public class Test
    {
        public static void main(String[] args) {
             HashSet<Student> set = new HashSet<Student>();
             set.add(new Student("1","Jack"));
             set.add(new Student("2","Rose"));
             set.add(new Student("2","Rose"));
             System.out.println(set);                
         }
    }
  • 原因:添加的Student匿名对象,引用的地址不同,所以重复存储了。

  • 解决办法:复写object类里面的equals和hashcode。

      public int hashCode() {
      	final int prime = 31;
          int result = 1;
          result = prime * result + ((id == null) ? 0 : id.hashCode());
          result = prime * result + ((name == null) ? 0 : name.hashCode());
      	return result;
      }
      public boolean equals(Object obj) {
      	if (this == obj)
      		return true;
      	if (obj == null)
      		return false;
      	if (getClass() != obj.getClass())
      		return false;
      	Student other = (Student) obj;
      	if (id == null) {
      		if (other.id != null)
      			return false;
      	} else if (!id.equals(other.id))
      		return false;
      	if (name == null) {
      		if (other.name != null)
      			return false;
      	} else if (!name.equals(other.name))
      		return false;
      	return true;
      }
    

5.其他总结

(二)实验总结

1. 模拟KTV点歌系统

分别用LinkedList和ArrayList集合,实现一个模拟KTV点歌系统的程序。实现以下功能:
(1)显示歌曲列表
(2)添加歌曲到列表
(3)删除歌曲
(4)将歌曲置顶
(5)将歌曲前移一位
(6)退出
题目扩展:歌曲包括曲名、演唱者。增加排序显示歌曲列表功能。

  • 程序设计思路:
    用一个类将歌曲名和歌手名存入,再在测试类中写方法实现显示列表,添加歌曲,删除歌曲,置顶歌曲,前移歌曲,退出。

    • 实验问题分析:

    • 问题1:无法将歌曲列表排序输出。

    • 原因: 自己太过于纠结按照拼音排序。其实在java中就有对字符串进行排序的方法。

  • 解决方案: 根据同学提供的网址,进行实体类排序。(利用foreach输出)先判断歌曲名字是否相同,再判断歌手名是否相同。

        int flag = o1.getMname().compareTo(o2.getMname());
    	if (flag == 0) {
    		return o1.getMperson().compareTo(o2.getMperson());
    	} else {
    		return flag;
    	}
    

2. 模拟微博用户注册

用HashSet实现一个模拟微博用户注册的程序。用户输入用户名、密码、确认密码、生日(格式yyyy-mm-dd)、手机号码(11位,13、15、17、18开头)、邮箱信息进行微博的注册。要求对用户输入的信息进行验证,输入信息正确后,验证是否重复注册,如果不是则注册成功,否则注册失败。

  • 提示:

      (1)设计一个用户类存储用户注册信息
      (2)设计一个校验信息类,定义校验方法完成对输入信息的校验。学习使用正则表达式完成对生日、手机号码和邮箱的验证。
      (3)设计一个用户注册类模拟注册过程。用HashSet存储用户数据列表,定义一个initData()方法添加初始用户信息。在main方法中完成用户注册功能。
    
  • 程序设计思路:
    按照题里给的建类,验证生日、手机号码和邮箱写三个方法,查重在验证的方法中写即可。

  • 实验问题分析:

    • 问题1:查重时总报错java.util.NoSuchElementException

    • 原因:没有依次判断,while(iter.hasNext())

    • 解决方案:

        public int chachong(Set<User> user, String str1) {
            Iterator<User> iter = user.iterator();
        	while (iter.hasNext()) {
            	if (str1.equals(iter.next().getName())) {
        	    	return 1;
        	 }
        }
        return 0;
        }
      
  • 总结:Iterator三步骤少一不可:1.实例化 2. 判断 3.输出

(三)代码托管

(四)学习进度条

代码行数(新增/累积) 学习时间(新增/累积) 本周学习内容
目标 5000行 300小时
第2-4周 400/400 40/40 课上讲的String类用法,温习了很多遍,写程序的时候也查了不少资料,对各种类型做了总结。
第5周 450/850 45/85 复习了上课讲的知识,并且在完成学习总结的时候查阅了很多资料去了。解单列设计模式 等知识点,还将ppt上的程序打了一遍。
第6周 300/1250 35/120 从课外书上更深的了解了抽象类,同学介绍的网站上面了解了类图的画法。
第7周 400/1250 40/160 对接口了解不够深,请同学给我讲了讲,翻资料找了些关于接口的程序去敲。
第10周 400/1650 40/200 在网上找了许多关于set\list\map接口的实例和用法详解。去学习去理解