(一)学习总结

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" );
   }
}

运行结果:

1、把可能会发生错误的代码放进try语句块中。
当程序检测到出现了一个错误时会抛出一个异常对象。异常处理代码会捕获并处理这个错误。catch语句块中的代码用于处理错误。当异常发生时,程序控制流程由try语句块跳转到catch语句块。不管是否有异常发生,finally语句块中的语句始终保证被执行。如果没有提供合适的异常处理代码,JVM将会结束掉整个应用程序。

2、Throwable类有两个直接子类:
Exception:出现的问题是可以被捕获的;
Error:系统错误,通常由JVM处理。

3、以有多个catch语句块,每个代码块捕获一种异常。
在某个try块后有两个不同的catch 块捕获两个相同类型的异常是语法错误。使用catch语句,只能捕获Exception类及其子类的对象。因此,一个捕获Exception对象的catch语句块可以捕获所有“可捕获”的异常。将catch(Exceptione)放在别的catch块前面会使这些catch块都不执行,因此Java不会编译这个程序。

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]
One book
Two book
Three book
Exception in thread "main" java.util.ConcurrentModificationException
	at java.util.ArrayList$Itr.checkForComodification(Unknown Source)
	at java.util.ArrayList$Itr.next(Unknown Source)
	at test.Test.main(Test.java:19)

如果删除的是最后一个对象,遍历输出时迭代器的size没有发生改变,所以列表中的内容能够正常输出;当对最后一个对象进行删除时,迭代器的size发生变化,产生异常

错误原因:如果在对一个列表进行遍历时,将其中的元素删除,迭代器的size会发生改变

如果在遍历时非要删除集合中的元素,应如何实现?用迭代器的remove方法进行删除

修改后的代码:

while(it.hasNext())
        {
            String book = (String)it.next();
            System.out.println(book);
            if (book.equals("One book"))
            {
                it.remove();
            }
        }

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);                
    }
}

运行结果:

因为这两个相同内容的同学存储的时候都进行了新的实例化,意味着他们拥有不同的HashCode值

解决方法:加入HashSet中的元素所属类必须重写hashCode()方法和equals()方法以确保对象的唯一性。在源代码中自动添加hashcode和equals方法

修改后的代码为:

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、匹配验证-验证Email是否正确

public static void main(String[] args) {
// 要验证的字符串
String str = "service@xsoftlab.net";
// 邮箱验证规则
String regEx = "[a-zA-Z_]{1,}[0-9]{0,}@(([a-zA-z0-9]-*){1,}\\.){1,3}[a-zA-z\\-]{1,}";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 字符串是否与正则表达式相匹配
boolean rs = matcher.matches();
System.out.println(rs);
}

2、在字符串中查询字符或者字符串

public static void main(String[] args) {
// 要验证的字符串
String str = "baike.xsoftlab.net";
// 正则表达式规则
String regEx = "baike.*";
// 编译正则表达式
Pattern pattern = Pattern.compile(regEx);
// 忽略大小写的写法
// Pattern pat = Pattern.compile(regEx, Pattern.CASE_INSENSITIVE);
Matcher matcher = pattern.matcher(str);
// 查找字符串中是否有匹配正则表达式的字符/字符串
boolean rs = matcher.find();
System.out.println(rs);
}

(二)实验总结

1.模拟KTV点歌系统

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

(1)显示歌曲列表

(2)添加歌曲到列表

(3)删除歌曲

(4)将歌曲置顶

(5)将歌曲前移一位

(6)退出

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

(1)程序设计思路:创建一个存放歌曲的类,存放歌曲。在通过编写每一个功能的方法函数,分别用LinkedList和ArrayList集合,在用集合类的方法实现功能。

问题1:程序组应用 swicth case 循环语句时。无法要主程序无线循环运行,只能运行一次就break结束。

解决方案:本身swicth语句,是没有无线执行功能的,只能在外层嵌套一个for循环,要程序多次运行。

问题2:在实现功能4时,应用list接口方法,但一定要注意把原来的数据删除吊。*.remove()

(三)代码托管

地址链接:

http://git.oschina.net/hebau_cs15/hebau-cs02cmy/tree/master

posted on 2017-05-02 16:47  绝版de初夏  阅读(321)  评论(0编辑  收藏  举报