201521123049 《JAVA程序设计》 第10周学习总结
1. 本周学习总结
1.1 以你喜欢的方式(思维导图或其他)归纳总结异常与多线程相关内容。
2. 书面作业
本次PTA作业题集异常、多线程
2 finally
题目4-2
1.1 截图你的提交结果(出现学号)
1.2 4-2中finally中捕获异常需要注意什么?
1.2 第一次捕获异常时应当是在资源无法正常打开时,此时需要抛出异常并输出该异常的相关提示,接着进入finally中执行必须执行的语句,将资源关闭,如果资源不能正常关闭,需要抛出异常并输出该异常的相关提示。
3 自定义异常
题目5-4
4.1 截图你的提交结果(出现学号)
4.2 自定义异常有哪几个关键点?
1.所有异常都必须是Exception,Throwable的子类或其子类的子类;
2.判断是否需要try-catch异常类,需要则继承Exception类,不需要则继承RuntimeException;
4 读取文件并组装对象
实验任务书中中的题目3:读取文件并组装对象
给出关键代码(需出现你的学号)
public class Main201521123115{
public static void main(String[] args) throws FileNotFoundException {
Scanner in = new Scanner(new File("身份证号.txt"));// 为myfile.txt这个File创建一个扫描器in
ArrayList<User> list=new ArrayList<User>();
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;
String a2;
String a3;
String a4;
String a5;
a1 = lineScanner.next();
a2 = lineScanner.next();
a3 = lineScanner.next();
a4 = lineScanner.next();
a5 = lineScanner.next();
while (lineScanner.hasNext()) {// 谨防地址只有一段
a5 += lineScanner.next();
}
int k=Integer.parseInt(a4);
User user=new User(a1,a2,a3,k,a5);
list.add(user);
System.out.println(a1 + a2 + a3 + a4 + a5);
}catch(Exception e){
}
}
Collections.sort(list,new AgeComparator());age排序后输出
System.out.println(list);
in.close();
}
}
class AgeComparator implements Comparator
@Override
public int compare(User o1, User o2) {
// TODO Auto-generated method stub
return o1.getAge()-o2.getAge();
}
}
5 学会使用Eclipse进行调试
观看相关调试视频
5.1 简述使用Eclipse进行调试需要几步?
5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?
5.3 除了Eclipse的调试器,你还使用什么方法调试程序?
5.3 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做
5.1 (1).根据错误信息判断出错的地方设置断点
(2).启动Debug模式进入调试;
(3).根据需要对设置断点的地方进入该函数(F5),跳过该行或函数(F6),跳出这个函数(F7)
(4).鼠标移动到变量处右键点击watch可查看当前属性
(5).清楚断点结束该程序。
5.2 F5:(step into)进入函数进行调试;
F5:(step over)跳过这行或者跳过这个函数;
F7:(step return)当还未执行完函数但想停止时可以跳出这个函数。
5.3还可以在出错的地方前后用system.out.println()进行打印,查看后续操作是否会执行,多数在当循环函数出现问题时使用system.out.println();,例如T5-4题目中,一开运行时发现输入了一次就打印了sc.closed,于是在while循环的末尾处进行了system.out.println操作,原因是使用了sc.nextLine()将换行符也接受,因此判断不是newz字符时就退出循环打印。
6 题集多线程
6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)
6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)
6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。
6.4 实验总结
Labmda表达式改写:
public static void main(String[] args) {
final String mainThreadName = Thread.currentThread().getName();
Thread t1 = new Thread(() -> {
System.out.println(mainThreadName);
System.out.println(Thread.currentThread().getName());
System.out.println(Arrays.toString(Thread.class.getInterfaces()));
});
t1.start();
}
6.4 3-1:将t1设置为后台线程,使其在主线程终止时也会自动结束;
3-2:调用join()方法,直到目标线程t1结束才恢复;
4-1:编写MyThread类,并按题目要求重写run方法;
4-2:(1)word比较完了需置为null;
(2)需要通过捕获异常来使进程结束,使用sleep方法抛出异常,使线程结束。
7 源代码阅读:多线程程序BounceThread
7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?
7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?
7.3 BallComponent也只做了两件事,这两件事分别是什么?
7.4 BounceThread中,什么时候启动了新线程?
7.5 这个程序是如何实现?一个大致的执行流程是什么?
7.1 BounceFrame类是支持多线程的,实现BallRunnable接口,BounceFrame类先是创建JFrame窗口,并且JFrame窗口中设有两个按钮,strat和Close来触发不同的事件(strat是创建一个新的球移动,close是关闭线程),线程实现球在JFrame窗口内移动,并在终点处停止
7.2 一是球的移动,即如果球击中一个边缘,将球移动到下一个位置,反向方向;二是获取当前位置的球的形状。
7.3 一是球的绘画,二是在面板上添加一个球。
7.4 addButton(buttonPanel, "Start", new ActionListener()),按下strat按钮,触发新的事件,调用函数addBall(),在addBall()中启动新的线程
7.5 流程:
建立JFrame窗口
添加strat和close按钮
点击start按钮,触发事件,调用函数addBall()
在函数中建立Runnable对象,启动线程
close退出线程(退出系统)