1. 本周学习总结
2. 书面作业
1.finally (题目4-2)
1.1 截图你的提交结果(出现学号)
1.2 4-2中finally中捕获异常需要注意什么?
- finally创建一个代码块。该代码块在一个try/catch 块完成之后另一个try/catch出现之前执行。finally块无论有没有异常抛出都会执行
- 如果finally块与一个try联合使用,finally块将在try结束之前执行。
3.自定义异常 (题目5-4)
3.1 截图你的提交结果(出现学号)
3.2 自定义异常有哪几个关键点?
- 编写自定义异常类实际上是继承一个API标准异常类,用新定义的异常处理信息覆盖原有信息的过程。常用的编写自定义异常类的模式如下:
public class CustomException extends Exception { //或者继承任何标准异常类
public CustomException() {} //用来创建无参数对象
public CustomException(String message) { //用来创建指定参数对象
super(message); //调用超类构造器
}
}
- 若同时自定义了多个异常,则可利用多个catch块进行捕获,也可抛出异常。catch块是有顺序的,如果两个异常是子类和父类的关系,则父类的异常必须放在子类异常的后面
4.读取文件并组装对象
实验任务书中中的题目3:读取文件并组装对象
给出关键代码(需出现你的学号)
Scanner in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
System.out.println("201521123043")
while(in.hasNextLine()){
try{
String line = in.nextLine();//读出myfile.txt的下一行
Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
//System.out.println("lineScanner="+lineScanner);
lineScanner.useDelimiter(" ");//使用空格作为分隔符
//System.out.println(line);
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();
}
list.add(new User(a1,a2,a3,Integer.parseInt(a4),a5));
System.out.println(a1+","+a2+","+a3+","+a4+","+a5);
}catch(NoSuchElementException e){
e.printStackTrace();
}catch(NumberFormatException e){
e.printStackTrace();
}
}
in.close();
5.学会使用Eclipse进行调试
观看相关调试视频
5.1 简述使用Eclipse进行调试需要几步?
- 首先设置断点,左键双击
- 在代码编辑区域,点击鼠标右键,选择Debug As,再选择 1 Java Application
- Debug模式的界面
Debug(调试)区域,显示当前正在调试代码是什么,在第多少行
Variables(变量)区域,显示变量的值。
代码编辑区
代码结构区,显示代码中的各个方法。
Console(控制台)区域。
- 点击调试区的黄色箭头按钮,可以逐句的执行代码,并且同时可以在变量区,实时的看到变量的值变化。
- 点击调试区的绿色按钮,可以将程序直接执行完毕,跳过所有断点调试。
5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?
- F5:Step into 跳入函数或方法
- F6:Step over 跳出函数或方法
- F7:Step return 跳回
5.3 除了Eclipse的调试器,你还使用什么方法调试程序?
- 一般使用打印某些其他无关程序的字符,来看程序进行到了哪一步
- 也可以通过捕获异常来看是否有代码问题
6.题集多线程
6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)
6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)
6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。
6.4 实验总结
- start()
用start方法来启动线程,真正实现了多线程运行,这时无需等待run方法体代码执行完毕而直接继续执行下面的代码。通过调用Thread类的start()方法来启动一个线程,这时此线程处于就绪(可运行)状态,并没有运行,一旦得到cpu时间片,就开始执行run()方法,这里方法 run()称为线程体,它包含了要执行的这个线程的内容,Run方法运行结束,此线程随即终止。
- run()
run()方法只是类的一个普通方法而已,如果直接调用Run方法,程序中依然只有主线程这一个线程,其程序执行路径还是只有一条,还是要顺序执行,还是要等待run方法体执行完毕后才可继续执行下面的代码,这样就没有达到写线程的目的。总结:调用start方法方可启动线程,而run方法只是thread的一个普通方法调用,还是在主线程里执行。这两个方法应该都比较熟悉,把需要并行处理的代码放在run()方法中,start()方法启动线程将自动调用 run()方法,这是由jvm的内存机制规定的。并且run()方法必须是public访问权限,返回值类型为void.。
7.源代码阅读:多线程程序BounceThread
7.1 哪个类是支持多线程的类,它实现了什么接口。这个类做了些什么?
- BallRunnable是支持多线程的类
- 实现了Runnable接口
- 这个类也就是控制小球的移动
7.2 Ball.java这个程序只做了两件事,这两件事分别是什么?
public void move(Rectangle2D bounds)
实现小球的移动public Ellipse2D getShape()
获取小球坐标
7.3 BallComponent也只做了两件事,这两件事分别是什么?
public void paintComponent(Graphics g)
画出小球public void add(Ball b)
添加小球
7.4 BounceThread中,什么时候启动了新线程?
//按下按钮
addButton(buttonPanel, "Start", new ActionListener()
{
public void actionPerformed(ActionEvent event)
{
addBall();//添加小球
}
});
//添加小球的函数
public void addBall()
{
Ball b = new Ball();
comp.add(b);
Runnable r = new BallRunnable(b, comp);
Thread t = new Thread(r);
t.start();//启动新线程
}
7.5 这个程序是如何实现?一个大致的执行流程是什么?
- 首先有一个图形界面
- 按下start按钮之后,画出一个小球,让小球运动
- 按一次按钮,出现一个小球,启动一个线程
8.购物车系统中的多线程
8.1 购物车系统中可能存在哪些多线程问题?
- 购物系统中,多个用户同时都在进行商品的浏览,选择,互相之间除了看到的东西是一样的其他基本互不相关
3. 码云上代码提交记录
题目集:异常、多线程(3-1, 3-2, 4-1, 4-2, 4-3)