《Java技术》第六次作业

《Java技术》第六次作业

(一)学习总结

1.用思维导图对本周的学习内容进行总结。

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 和 getMessage方法了解异常发生的情况:

printStackTrace:打印方法调用堆栈。

每个Throwable类的对象都有一个getMessage方法,它返回一个字串,这个字串是在Exception构造函数中传入的,通常让这一字串包含特定异常的相关信息。

  • printStackTrace方法的输出结果

  • getMessage方法的输出结果

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);
    }
}
  • 结果

  • 原因:ArrayList采用size属性来维护自已的状态,当size出现变化时,迭代器并不一定能够得到同步,导致迭代器找不到对象的位置,所以异常抛出。

  • 结果

  • 原因:当删除最后一个对象时,迭代器的大小发生改变,而输出没有发生变化。

  • 在遍历时非要删除集合中的元素,应使用迭代器本身的删除方法。

代码如下:

import java.util.*;
public class Test13 {
    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("Three 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 id=2, name=Rose, Student id=1, name=Jack, Student id=2, name=Rose]
  • 实例化了三个匿名对象,每个匿名对象对应一个哈希编码,所以会有相同的值出现。

  • 如果要去掉重复信息,需要重写equals()方法、hashCode()方法,哈希码可以将类中的全部属性进行适当的计算,以求出一个不会重复的哈希码。

5.List集合的常用操作

import java.util.*;

class Person {
	private String name;
	private int age;
	public Person() {

	}

	public Person(String name, int age) {
		this.name = name;
		this.age = age;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getAge() {
		return age;
	}

	public void setAge(int age) {
		this.age = age;
	}

	public String toString() {
		return name + age;
	}
	public boolean equals(Object obj) {
		if (this == obj)
			return true;
		if (obj == null)
			return false;
		if (getClass() != obj.getClass())
			return false;
		Person other = (Person) obj;
		if (age != other.age)
			return false;
		if (name == null) {
			if (other.name != null)
				return false;
			} else if (!name.equals(other.name))
				return false;
		return true;
	}
}

public class Test13 {
	public static void main(String[] args) {
		// Collection <Person> per= new ArrayList<Person>();
		List<Person> per = new ArrayList<Person>();
		per.add(new Person("One", 1));
		per.add(new Person("Two", 2));
		per.add(new Person("Three", 3));
		System.out.println("原始元素:" + per);
		Iterator<Person> it = per.iterator();
		System.out.println("迭代器输出:");
		while (it.hasNext()) {
			Person p = it.next();
			if(new Person("Two",2).equals(p)){
				it.remove();             //迭代器删除
			}
		}
		System.out.println(per);
		System.out.println("是否为空:" + per.isEmpty());// 判断集合是否为空
		System.out.println("修改之后集合输出");
		for (int i = 0; i < per.size(); i++) { // List遍历集合所有数据
			if (!per.contains("One")) {
				per.set(1, new Person("Four", 4));                                                 //修改数据set(i,添加的元素),将"Four",4置于第三个位置
			}

			System.out.println(per.get(i));
		}
		System.out.println("集合大小=" + per.size());
		for (int i = 0; i < per.size(); i++) {                                                   //删除操作,需要在类中重写equals方法
			per.remove(new Person("One", 1));
		}
		System.out.println(per);
		System.out.println("集合大小=" + per.size());
	}
}

(二)实验总结

1.模拟KTV点歌系统

  • 实验内容:

分别用LinkedList和ArrayList集合,实现一个模拟KTV点歌系统的程序。实现以下功能:

(1)显示歌曲列表
(2)添加歌曲到列表
(3)删除歌曲
(4)将歌曲置顶
(5)将歌曲前移一位
(6)退出

题目扩展:歌曲包括曲名、演唱者。增加排序显示歌曲列表功能。

  • 程序设计思路:

建音乐类,定义歌曲属性,并定义一系列实现上述功能的方法。

测试类中,利用switch循环,输入用户要实现的功能的序号,调用音乐类中的方法来实现。

  • 问题:在将歌曲前移一位时,出现错误,我的思路是,用户输入将要前移一位的歌曲名称,根据名称查找歌曲所在位置,并删除歌曲,其次根据输入歌曲所得的位置减一,得到上首歌曲的位置,根据位置再删除上首歌曲,然后在对方的位置分别添加歌曲。

  • 原因:我把输入歌曲的上首歌曲删除了,所以当根据位置添加时,我得到的是输入的歌曲名称。

  • 解决方案:删除两条语句,包括将上首歌曲删除和添加操作。

2.模拟微博用户注册

  • 实验内容

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

提示:

(1)设计一个用户类存储用户注册信息

(2)设计一个校验信息类,定义校验方法完成对输入信息的校验。学习使用正则表达式完成对生日、手机号码和邮箱的验证。

(3)设计一个用户注册类模拟注册过程。用HashSet存储用户数据列表,定义一个initData()方法添加初始用户信息。在main方法中完成用户注册功能。

  • 程序设计思路:

(1)用户类储存用户的基本信息,并添加equals()和hashCode()方法;

(2)校验信息类,分别定义了验证用户名、密码、确认密码、生日、手机号码、邮箱的格式方法,并又定义了手机号码和邮箱是否已经重复注册过;

(3)添加了一个用户的基本信息,来验证用户输入信息是否重复,用HashSet存储用户数据,在while循环中完成了用户注册功能。

  • 问题:有几个小问题没有解决。

比如(1),在用户输入用户名时,调用方法判断用户名是否重复,当用户名重复时,如何指向之前定义的用户名变量,而不是新定义一个变量,重新输入,调用方法,而我的程序中只可以判断两次用户名的重复性,接下来不能继续判断,只能进行下一步密码的输入。

其次(2),定义一个initData()方法添加初始用户信息,这个方法不知道如何使用,我并没有用到这个方法。

(三)代码托管

  • 码云截图
posted @ 2017-05-02 10:54  lymm  阅读(300)  评论(0)    收藏  举报