201521123017 《Java程序设计》第10周学习总结
1. 本周学习总结
2. 书面作业
Q1.finally
题目4-2
1.1 截图你的提交结果(出现学号)
1.2 4-2中finally中捕获异常需要注意什么?
1.1 截图
1.2 4-2中finally中捕获异常需要注意resource是否是空指针,及在关闭resource可能产生的其它异常,try-catch所捕获的异常为Exception异常,这样可以捕获所有可能的异常(包括NullPointerException及其Exception子类异常)
Q2.用异常改进ArrayIntegerStack
题目4-3
2.1 截图你的提交结果(出现学号)
2.2 实验总结
2.1 截图
2.2 实验总结:主要的功能函数public Integer push(Integer item);
,public Integer pop();
,public Integer peek();
与之前PTA实验的所写代码一致,主要是对于异常的抛出。例如如果栈满,抛出FullStackException
,public Integer push(Integer item) throws FullStackException
,并判定if(this.size()>=arrStack.length)
,则FullStackException e= new FullStackException();throw e;
抛出异常,之后入栈的功能实现的代码不变,其余函数也是类似改进,在方法名后面+throws+异常类型,在方法实现中判断栈的情况抛出对应异常,实现方法的代码不变即可
Q3.自定义异常
题目5-4
3.1 截图你的提交结果(出现学号)
3.2 自定义异常有哪几个关键点?
3.1 截图
3.2 建立两个异常类IllegalScoreException
,IllegalNameException
继承exception类,接着对不合理的数据判定抛出异常。例如 如果姓名首字母为数字则抛出IllegalNameException
,public void setName(String name) throws IllegalNameException
,判定name.charAt(0)>='0'&&name.charAt(0)<='9'
,抛出throw new IllegalNameException(告诉调用者错误的信息)
,对不合理分数抛出异常,与之类似,改动的主要是异常的类型IllegalScoreException
和判定的条件score1<0 || score1>100
Q4.读取文件并组装对象
实验任务书中中的题目3:读取文件并组装对象
给出关键代码(需出现你的学号)
- 本题容易出现的异常:首先是文件的读取,是否有该文件,故try-catch(FileNotFoundException e),再者,是读取的信息的完整性,代码实现的是读入人的信息,包括姓名,身份证号,性别,年龄和地址5个属性,若是读入的line中没有全部(5个属性)的信息,将会因此报错,此时需要捕获try-catch(Exception e),还有可能是读入的信息是空或是不符合属性要求(例如读入性别的信息是“男”或“女”,但却出现其他的字符串,出错),也需要报错
try{
in = new Scanner(new File("身份证号.txt"));//为myfile.txt这个File创建一个扫描器in
while(in.hasNextLine()){
String line = in.nextLine();//读出myfile.txt的下一行
Scanner lineScanner = new Scanner(line);//为每一行建立一个扫描器
lineScanner.useDelimiter(" ");//使用空格作为分隔符
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);
try {
if (a1.length()==0) {
throw new Exception("姓名的信息为空");
}
if (a2.length()!=18) {
throw new Exception("身份证号的信息不完整或为空");
}
if (!a3.equals("男") && !a3.equals("女")) {
throw new Exception("性别的信息不是男或女");
}
if(a4.length()<0){
throw new Exception("年龄的信息出错");
}
if(a5.length()==0){
throw new Exception("地址的信息为空");
}
} catch (Exception e) {
System.out.println(e);
}
}catch(Exception e){
System.out.println(e);
}
}
}catch(FileNotFoundException e){
System.out.println(e);
}finally{
if(in!=null){
try{
in.close();
}catch(NullPointerException e){
System.out.println(e);
}
}
}
Q5.学会使用Eclipse进行调试
观看相关调试视频
5.1 简述使用Eclipse进行调试需要几步?
5.2 调试时F5, F6, F7快键键各有什么不同?什么情况该使用哪个快捷键?
5.3 除了Eclipse的调试器,你还使用什么方法调试程序?
5.3 选做:实验任务书中的题目5:使用Eclipse进行调试中的选做
5.1 步骤:
- 设置断点
- 打开Debug,进入Debug界面
- 使用快捷键F5 F6 F7进行所要进行的调试操作,观看右上界面数值的变化(数值界面一般在右上)
- 找出问题,去掉断点,返回JAVA界面
5.2 F5(step into):进入当前行的方法内部,一步一步执行;F6(step over,跳过):执行当前行,但不进入执行细节;F7 (step return,跳出):返回上一步执行的方法(相对应F5)
5.3 自己在代码设置一些属性的输出来看代码有无出错或是有无达到自己所要的结果,若在某处不符合,则在此处进行代码改写找出错误,方法比较累
Q6.题集多线程
6.1 程序填空3-1、3-2。(截图提交结果,出现你的学号)
6.2 函数4-1(Thread)、4-2(Runnable)(截图提交结果,出现你的学号)
6.3 函数4-3(Runnable与匿名内部类)(截图提交结果,出现你的学号),并使用Labmda表达式改写。
6.4 实验总结
6.1 截图
6.2 截图
函数4-1(Thread)
函数4-2(Runnable)
6.3 截图
Labmda表达式改写
Thread t1 = new Thread(()->{
System.out.println(mainThreadName);
System.out.println(Thread.currentThread().getName());
System.out.println(Arrays.toString(Thread.class.getInterfaces()));
}
6.4 实验总结:创建线程不推荐继承Thread类,采取实现Runnable接口,创建实现Runnable接口的对象,再将此对象作为Thread构造函数的参数,创建Thread的实例;关闭线程,可以调用Thread类的方法中的yield()方法,可以暂停当前线程(即关闭线程,放弃CPU);使用匿名内部类写Thread类,只要的格式是new Thread(new Runnable(){...}),故在{}中编写run()方法,输出主线程名,线程t1的线程名,线程t1所实现的所有接口,与之前匿名内部类的编写没太大区别,Labmda表达式改写,主要有三部分,参数,箭头和方法体(实现的功能),这次的改写主要是参数为无,只要()即可,箭头和方法体的编写与之前Labmda表达编写类似,无太大却别
Q7.源代码阅读:多线程程序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退出线程(退出系统)
Q8.购物车系统中的多线程
8.1 购物车系统中可能存在哪些多线程问题?
- 一个顾客相当于一个线程,在出现多个顾客抢购一个物品时,有时会因物品数量为0而导致其他顾客无法购买
3. 码云上代码提交记录及PTA实验总结
3.1. 码云代码提交记录
- 在码云的项目中,依次选择“统计-Commits历史-设置时间段”, 然后搜索并截图
异常PTA实验提交
多线程PTA实验提交