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

1. 本周学习总结


2. 书面作业

本次PTA作业题集异常、多线程

1.finally

题目4-2

1.1 截图你的提交结果(出现学号)

1.2 4-2中finally中捕获异常需要注意什么?

在finally中关闭资源会出现异常,finally中的异常也需要捕获,且要在finally中捕获。finally无论try块中是否抛出异常都会执行。

2.用异常改进ArrayIntegerStack

题目4-3

2.1 截图你的提交结果(出现学号)

2.2 实验总结

原先当栈空,栈满的时候都会抛出null,经过修改过后,栈空,栈满时会分别抛出EmptyStackExceptionFullStackException的异常,更直观地显示程序出现的问题,也方便修改

3.自定义异常

题目5-4

4.1 截图你的提交结果(出现学号)

4.2 自定义异常有哪几个关键点?

一、注意:
(1)所有异常都必须是 Throwable 、Exception或其子类的子类。
(2)如果希望写一个需要try-catch异常类,则需要继承 Exception 类。
(3)如果你想写一个不需要try-catch异常类,那么需要继承 RuntimeException 类。
(4)抛出异常时,应让用户知道错误发生的原因,显示异常类及异常的具体原因
(5)尽量使用JDK已有的异常类:重用、便于理解

为三个方法进行改进,如果满足条件,抛出异常即可。使用异常而不是返回null来提示用户程序出错,能让调用者更直观地看到哪里出错了,为什么出错了,且返回的信息都是关于栈的情况,不会突然间可能就冒出一个空指针异常。

4.读取文件并组装对

4.1给出关键代码(需出现你的学号)

public class ReadFileUsingScanner201521123030{
public static void main(String[] args)  throws FileNotFoundException{
ArrayList<User> student=new ArrayList<User>();
Scanner in = null;
try{
    in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
    int count=0;
    while(in.hasNextLine()){
        String line = in.nextLine();//读出myfile.txt的下一行      
        count++;
        Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
        lineScanner.useDelimiter(" ");//使用空格作为分隔符
        try{
            String a1 = lineScanner.next();//姓名
            if(a1.length() == 0 || a1.length() > 10)
            {
                throw new IllegalArgumentException("a1.length = " + a1.length());
            }
            
            String a2 = lineScanner.next();//身份证号
            if(a2.length() == 0)
            {
                throw new IllegalArgumentException("a2.length = " + a2.length());
            }
            String a3 = lineScanner.next();//性别
            if(!a3.equals("男") && !a3.equals("女"))
            {
                throw new IllegalArgumentException("性别写的不是男女,是"+a3);
            }
            String a4 = lineScanner.next();//年龄
            String a5 = lineScanner.next();//地址
            while(lineScanner.hasNext()){//谨防地址只有一段
                a5 += lineScanner.next();
            }
            student.add(new User(a1,a2,a3,Integer.parseInt(a4),a5));
        }       
        catch(IllegalArgumentException e)
        {
            System.out.println("出错的类是:"+e+"。错误在文件的第"+count+"行:"+line);
        }
        catch(NoSuchElementException e)
        {
            System.out.println("出错的类是:"+e+"。错误在文件的第"+count+"行:"+line);
        }         
    }
}catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
} finally {
    if (in != null) {
        in.close();
    }
}
Collections.sort(student, (User o1, User o2) -> {
        return o1.getAge() - o2.getAge();
});
for (User user : student) {
    System.out.println(user.toString());
}
 
    
}
}   

5.学会使用Eclipse进行调试

观看相关调试视频

5.1 简述使用Eclipse进行调试需要几步?

一、在正确的地方设置断点
1.根据错误提示信息,确定错误类型
2.缩小出错范围、确定错误发生点
3.将鼠标放在错误的一行的前方(在编译器区域的左侧)上,双击即可设置断点
二、启动调试模式
点击右上角的“Debug”(像小虫子的图标)可以看到Debug透视图
三、使用F5、F6、F7快捷键进行调试
四、查看状态值
在窗口的右上方可以看到代码中的相对应得值

5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?

F5(step into)进入某个函数
F6(step over)跳过。 当要跳过某个语句的时候使用
F7(step return)跳出某个函数。某个函数有很多语句的时候,我们想中途跳出这个函数,使用F7。

5.3 除了Eclipse的调试器,你还使用什么方法调试程序?

1.每个需要测试的类中放一个main方法
2.JUnit(单元测试框架)
3.日志(现在用的更多使用第三方日志框架Log4j2)
4.Throwable的printStackTrace方法
5.System.err 
6.将错误信息保存到文件中 java Test 2 >errors.txt

5.3 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做

输出语句。

6.题集多线程

6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)

6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)


6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。

6.4 实验总结

3-1:t1为守护线程即可
3-2:t1.start(),之后用while(t1.isAlive()){}或者使用t1.join()语句确认其结束
4-1:重写run()方法,循环输出0 到 n - 1,结束之后输出该线程的名称,并且调用isAlive()来表示线程是否还活着。
4-2:这题做得很心累啊,交pta一直答案错误。现在总结一下错误的原因有两个:一个是没有判断word是否为null,一个是后来看了测试点提示有两个测试点分别为正常终止线程结束和没有终止线程结束,我一开始没有考虑这个。改正第一个问题比较简单但是我不知道出错在这个地方,是后来问了同学才知道,加了判断if(word!=null),然后让word=null,因为题目要求对每个传入的word只检查一遍。第二个问题关键在没有终止线程结束,也就是不是通过boolean标志来终止线程(这是正常终止线程结束的方法),即通过捕获异常来终止线程。这需要sleep方法抛出一个InterruptedException异常,InterruptedException被抛出,就可以在run方法中捕获这个异常,让线程安全退出。

7.源代码阅读:多线程程序BounceThread

7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?

BallRunnable类是支持多线程的类,它实现了Runnable接口。让某个小球在界面上移动,并休眠,切换线程

7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?

确定小球移动坐标,获取移动路径

7.3 BallComponent也只做了两件事,这两件事分别是什么?

添加小球,并画出来。

7.4 BounceThread中,什么时候启动了新线程?

点击addButton按钮的时候会添加一个小球,启动一个新线程。

8.购物车系统中的多线程

8.1 购物车系统中可能存在哪些多线程问题?

有多个Frame就有多个线程。刚开始写购物车系统的时候用while(true){}来切换frame,导致多个线程和主线程同时运行,占用CPU资源。

3. 码云上代码提交记录

posted @ 2017-04-29 20:37  周汉麟  阅读(214)  评论(0编辑  收藏  举报