《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()方法添加初始用户信息,这个方法不知道如何使用,我并没有用到这个方法。
(三)代码托管
- 码云截图
![]()






浙公网安备 33010602011771号