1. 本周学习总结
2. 书面作业
本次PTA作业题集异常、多线程
finally
题目4-2
1.1 截图你的提交结果(出现学号)
1.2 4-2中finally中捕获异常需要注意什么?
总结:需要注意的是无论怎么样finally块的代码一定会执行,所以必须要执行的代码一定要放在finally块里,就4-2这题来说要求无论程序向系统申请资源成功与否都要释放资源,所以关闭资源的这句代码resource.close();就要放到finally里执行。
用异常改进ArrayIntegerStack
题目4-3
2.1 截图你的提交结果(出现学号)
2.2 实验总结
总结:在写这题的时候,提交了好多次都不通过,原因是pop时出了问题,后来把arrStack[top-1]的值先提前赋值给一个变量,然后再top--;就成功了,否则pop出的值已经是top--后再减1的值导致出错。
自定义异常
题目5-4
4.1 截图你的提交结果(出现学号)
5-4这题的第一个测试点一直过不了,还没找到是什么问题。。。
4.2 自定义异常有哪几个关键点?
答:首先自定义异常必须继承自Throwable或者Exception或者其子类;还要注意是不是需要捕获,本题中的异常是继承Exception的,所以需要捕获;除此之外,自定义异常也是需要有try-catch-finally语句块的,但是需要自己抛出异常。
读取文件并组装对象
实验任务书中中的题目3:读取文件并组装对象
给出关键代码(需出现你的学号)
public class ReadFileUsingScanner201521123039 {
public static void main(String[] args) throws FileNotFoundException {
Scanner in = null;
ArrayList<User> list = new ArrayList<User>();
try {
in = new Scanner(new File("身份证号.txt"));
while (in.hasNextLine()) {
String line = in.nextLine();// 读出myfile.txt的下一行
Scanner lineScanner = new Scanner(line);// 为每一行建立一个扫描器
// System.out.println("lineScanner="+lineScanner);
lineScanner.useDelimiter(" ");// 使用空格作为分隔符
// System.out.println(line);
try {
String a1 = lineScanner.next();// 姓名
String a2 = lineScanner.next();// 身份证号
String a3 = lineScanner.next();// 性别
String a4 = lineScanner.next();// 年龄
String a5 = lineScanner.next();// 地址
while (lineScanner.hasNext()) {// 谨防地址只有一段
a5 += lineScanner.next();
}
System.out.println(a1 + a2 + a3 + a4 + a5);
} catch (Exception e) {
continue;
}
}
} catch (FileNotFoundException e1) {
System.out.println(e1);
} catch(IllegalArgumentException e2){
System.out.println(e2);
} catch(NoSuchElementException e3){
System.out.println(e3);
}finally {
if (in != null)
in.close();
}
Collections.sort(list,(User o1, User o2) -> {
return o1.getAge() - o2.getAge();
});
for (User user : list) {
System.out.println(user.toString());
}
}
学会使用Eclipse进行调试
观看相关调试视频
5.1 简述使用Eclipse进行调试需要几步?
答:
第一步,设置断点(在行号前面的空白处双击即可);
第二步,启动调试器(点击那个甲壳虫似的图标);
第三步,运行程序,使用快捷键进行调试(常使用F5、F6、F7、F8);
第四步,查看状态值(在右上角可以看见)
第五步,清除断点,关闭调试
5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?
答:
F5(Step into)是跳进函数或者方法,在需要判断这个方法或者函数内部是否出错、哪里出错的时候使用
F6(Step over)是跳过某一行,如果不需要看某一行的时候可以使用
F7(Step return)是跳出当前进入的函数或者方法,在需要跳出该函数或方法的时候使用
5.3 除了Eclipse的调试器,你还使用什么方法调试程序?
答:常见的两种调试方法出了使用Eclipse的调试器还有一种就是我们常用的System.out.println方法。
5.3 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做
题集多线程
6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)
6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)
6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。
Labmda改写如下:
6.4 实验总结
总结:
3-1使用守护线程,因为守护线程的特点是所有的前台线程死亡后守护线程会自动结束,而且3-1要求主线程退出时,在main方法中所启动的线程也要自动结束,所以可以使用守护线程;
3-2题目要求线程打印完后,才执行主线程main方法的最后一句,所以使用join方法,等其他线程执行完再执行本线程即main方法最后一句;
4-1前几次提交不通过是因为System.out.println(Thread.currentThread().getName()+" "+isAlive());这句没有在run方法中执行,而是在MyThread方法中执行,打印出来的信息时主线程的名称;
4-2寻找外星人...没有测试数据可以复制粘贴也是有点麻烦。。。前几次提交没有判断Word为null的情况导致答案错误,还有就是用来停止线程的标志位定义的时候按照老师的来也是答案错误,后来定义为 private volatile boolean flag = false;就可以了。原因是 Volatile修饰的变量在每次被线程访问时,都强迫从共享内存中重读该成员变量的值,而且当变量发生变化时,强迫线程将变化值回写到共享内存,这样一来两个不同的线程总是看到某个成员变量的同一个值
4-3题刚开始没理解主线程名要怎么打印,后来发现老师已经定义好了,可以直接用。。。
源代码阅读:多线程程序BounceThread
7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?
答:BallRunnable类是支持多线程的类,它实现了Runnable接口。
public BallRunnable(Ball aBall, Component aComponent)//初始化
{
ball = aBall;
component = aComponent;
}
public void run()
{
try
{
for (int i = 1; i <= STEPS; i++)
{
ball.move(component.getBounds());//调用小球移动的函数
component.repaint();//重画界面
Thread.sleep(DELAY);//睡眠一段时间,CPU让给其它线程
}
}
catch (InterruptedException e)
{
}
}
7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?
答:在Ball类中定义了move()方法和getShape()函数,move方法获取小球的位置坐标,对小球的移动做出处理,比如碰到框图边缘就反弹;另一个是获取小球的形状及大小
7.3 BallComponent也只做了两件事,这两件事分别是什么?
答:
public void add(Ball b)
{
balls.add(b);//在面板上添加一个球
}
public void paintComponent(Graphics g)//在面板上画出这个球
{
...
}
7.4 BounceThread中,什么时候启动了新线程?
答:在点击添加这个按钮时,监听器监听到这一动作后就会调用addBall()方法,先comp.add(b)加入一个小球,然后再t.start();启动新线程。
7.5 这个程序是如何实现?一个大致的执行流程是什么?
答:先用显示弹跳球和开始、关闭按钮的组件构建一个框架,再向容器添加一个“添加”按钮,然后店家“添加”按钮后就可以在画布上添加一个弹跳球,并启动一个线程,使其反弹 ,再移动到一定的次数后就停在同一个位置。
购物车系统中的多线程
8.1 购物车系统中可能存在哪些多线程问题?
答:可能多个用户同时登录时,可能会有卡顿的现象,就比如在抢购的时候,就在那一秒同时有多个用户按下购买的按钮,最后的结果就是一部分人可能抢购成功,一部分没有。