20172303 2017-2018-2 《程序设计与数据结构》第9周学习总结
教材学习内容总结
第十一章 异常
1.异常
- 异常处理
- 异常处理的常用方法有三种:
- 根本不处理
- 当异常发生时处理异常
- 在程序的某个位置集中处理异常
- 处理异常的主要方法是捕获异常
- 异常处理的常用方法有三种:
- 异常捕获——try-catch语句
- 格式:
try{语句块}catch(异常名称 exception){处理异常的语句}finally{语句块}
- try语句之后必须有一条或多条catch子句,但可以没有finally子句,在finally子句存在使,无论try语句块执行时是否发生异常,finally子句都将执行。
- 异常的传递
- 例:假设一个程序执行时,它要调用一个类的Method1方法,但Method1方法要调用Method2方法,但Method2方法中发生了异常,如果没有处理这个异常的话,它就会传递到Method1中,使Method1方法也产生异常。
- 在遇到传递的异常时,要仔细考虑实际情况,寻找合适的地方来处理异常。
- 异常类层次结构
- 见图:
- 自定义异常
- throw:抛出异常
- throws:用于方法名的后面,做一个声明,表示下面可能会有这个异常,但是具体还是要用throw来抛出异常。
- 在自定义异常中throws和throw必须是成对出现的,除非用try-each语句解决,但是已经定义好的异常是不用的。
- I/O异常
- I/O类执行时产生的异常成为IOEexception异常
- 标准输入/输出/错误流
标准I/O流 | 名称 | 说明 |
---|---|---|
System.in | 标准输入流 | 从键盘输入信息 |
System.out | 标准输出流 | 在显示器上显示信息 |
System.err | 标准错误流 | 在显示器上输出错误信息 |
2.文件读写(虽然此部分不是书上内容,但是是老师上课讲的重点内容)
- 文件创建(使用File类)
- 格式
File file = new File(文件保存路径 文件名称)if (!file.exists()){file.createNewFile(); }
- 主要方法截图:
- 文件夹创建(使用File类)
- mkdir:只能创建一个新文件夹。
- mkdirs:可以创建一个新文件夹的同时在这个文件夹下再创建一个新的文件夹。
- 文件读写
- 字节操作流(使用FileOutputStream和FileInputStream类)
- 格式:
//文件写入OutputStream outputStream = new FileOutputStream(file);byte[] hello = {'H','e','l','l','o',',','W','o','r','l','d','!'};outputStream.write(hello);
- 主要方法截图:
//文件读取InputStream inputStream = new FileInputStream(file);while (inputStream.available()> 0){ System.out.print((char) inputStream.read()+" ");}inputStream.close();
- 主要方法截图:
- 字节缓冲流(使用BufferedOutputStream和BufferedInputStream类)
- 格式:
//文件读取byte[] buffer = new byte[1024];String content = "";int flag = 0;InputStream inputStream = new FileInputStream(file);BufferedInputStream bufferedInputStream = new BufferedInputStream(inputStream);while ((flag = bufferedInputStream.read(buffer))!=-1){ content += new String(buffer,0,flag);}bufferedInputStream.close();
- 主要方法截图:
//文件写入OutputStream outputStream = new FileOutputStream(file);BufferedOutputStream bufferedOutputStream = new BufferedOutputStream(outputStream);String content1 = "写入文件的缓冲区内容";bufferedOutputStream.write(content1.getBytes(),0,content.getBytes().length);bufferedOutputStream.flush();bufferedOutputStream.close();
- 主要方法截图:
- 字符操作流(使用FileWriter类和FileReader类)
- 格式:
//文件读取Writer writer = new FileWriter(file);writer.write("Hello, World!");writer.flush();writer.append("Hello,Java"); // 在文件中续写writer.flush();
- 主要方法截图:
//文件写入Reader reader = new FileReader(file);System.out.println();char[] temp = new char[100];reader.read(temp);
- 主要方法截图:
- 字符缓冲流(使用BufferedOutputStream类和BufferedInputStream类)
- 格式:
//文件读取BufferedWriter bufferedWriter = new BufferedWriter(writer);String content = "使用bufferedWriter写入";bufferedWriter.write(cont.length());bufferedWriter.flush();bufferedWriter.close();
- 主要方法截图:
//文件写入BufferedReader bufferedReader = new BufferedReader(reader2);while ((content =bufferedReader.readLine())!= null){ System.out.println(content);}
- 主要方法截图:
- 字节操作流(使用FileOutputStream和FileInputStream类)
第十二章 递归
- 递归是一种允许一个方法调用自己以达到最终目的的技术。
- 例:
//计算n的阶乘factorial(n){ if(n==1) return 1; else return factorial(n-1)*n;}
- 递归的种类
- 无穷递归:只有递归定义的部分而没有非递归定义部分的递归
- 直接递归:方法调用自己的递归
- 简介递归:一个方法调用其他方法,最终再调用自己的递归。
- 递归的应用
教材学习中的问题和解决过程
- 问题1:为什么书上的所有例题中,为什么在catch的括号内的类型名后有个exception?它是固定的吗?
- 问题1解决方案:书上说这个东西叫做标识符,但苦逼的是我还是没想起来标识符是什么,翻书终于在第一章的1.4.3找到了它,但书上没有写清楚标识符究竟是干什么的所以我有点懵,去查了一下恍然大悟:标识符是用来给类、对象、方法、变量、接口和自定义数据类型命名的。所以说类型名后的exception只是一个常用的命名方法,它可以换成其他任何合法的其他标识符。
- 那么再来复习一下标识符的命名规范吧:
- (1) 标识符由字母、数字、下划线“_”、美元符号“$”或者人民币符号“¥”组成,并且首字母不能是数字。
- (2) 不能把关键字和保留字作为标识符。
- (3) 标识符没有长度限制。
- (4) 标识符对大小写敏感。
代码调试中的问题和解决过程
- 问题1:做PP11.1的时候不知道为什么不能用break
- 问题1解决方案:这是一个概念没搞清楚的问题。一开始我用使用
Alt+Enter
找不到解决方法,后来查了一下break的用法想起来它必须用在循环里面,同样的continue也是。 - 问题2:做PP12.1时,产生了字符串越界错误
- 问题2解决方案:使用单步调试和try-each语句捕获异常都没有解决问题,询问了结对的张昊然同学他说我的这段代码没有非递归定义部分,所以成为了一个无限递归。新代码的逻辑是:首先判断字符串长度是否等于1,等于1则一定为回文;然后判断长度是否等于2,等于2时判断对应字符是否相等,这里就定义了非递归部分;最后如果字符串长度大于2的话,使用递归依次判断对应字符是否相等。
- 问题3:文件读写中如何分行?
- 问题3解决方案:使用
writer.write(10)
来分行,但不知道为什么如果把文件放到IDEA里就可以分行,但是放到计算机里就不可以了。所以上网上查了一下java中文件读写如何实现分行,发现大部分的回答都建议并使用了BufferedReader流的形式。找到了一个过程比较详细的代码例子:
public class TestC { public static void main(String[] args){ //获取要读取的文件 File readFile=new File("D://home/a.txt"); //输入IO流声明 InputStream in=null; InputStreamReader ir=null; BufferedReader br=null; try { //用流读取文件 in=new BufferedInputStream(new FileInputStream(readFile)); //如果你文件已utf-8编码的就按这个编码来读取,不然又中文会读取到乱码 ir=new InputStreamReader(in,"utf-8"); //字符输入流中读取文本,这样可以一行一行读取 br=new BufferedReader(ir); String line=""; //一行一行读取 while((line=br.readLine())!=null){ System.out.println(line); } } catch (Exception e) { e.printStackTrace(); } finally{ //一定要关闭流,倒序关闭 } try { if(br!=null){ br.close(); } else if(ir!=null){ ir.close(); } else if(in!=null){ in.close(); } } catch (Exception e2) { } } }}
上周考试错题总结(正确为绿色,错误为红色)
- 错题1:An interface name can be used to declare an object reference variable.
- A . true
- B . false
- 原因及理解情况:用于声明引用的既可以是类名也可以是接口名。
结对及互评
点评模板
- 博客中值得学习的或问题:
- 优点:增加了目录
- 问题:老问题又犯了,感觉从博客内容看不出有过多的深入思考
- 代码中值得学习的或问题:
- 优点:注释一针见血,看的时候能清楚的明白代码的作用是什么
- 问题:PP12.9没有使用数组
点评过的同学博客和代码
- 本周结对学习情况
- 结对学习内容
- 在张昊然同学做IO测试做得快要癫狂的时候给他提供了思路,讲解了一下文件读写的相关内容。
- 张昊然同学在这周的教材学习中给我提供了大量帮助,因为把大部分精力花在文件读写上了所以这一块学的有点不扎实,之后会再次复习的。
- 结对学习内容
其他(感悟、思考等,可选)
- 本周最难的部分我觉得是文件读写这部分,虽然感觉上课听懂了,但是老师留的实践作业花了整整一天才实现,但是又被学长否定了说实践的不合理所以又推到重来了一遍,但是没想到重新改的一遍只用了一晚上时间。所以说,前期漫长难熬的艰苦岁月是必要的,因为它在为你之后能走的捷径铺路。
- 教材复习情况
- 复习进度(页数):101/310
- 重要成长:
- 复习了String类、Random类、NumberFormat类、DecimalFormat类的相关内容。
- 感想:这周最大的收获就是把那些常用类都标记下来了,这样以后就不用来回翻书了。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 120/120 | 1/1 | 9/9 | |
第二周 | 246/366 | 1/2 | 9/18 | |
第三周 | 785/1121 | 2/4 | 15/33 | |
第四周 | 615/1736 | 1/5 | 20/53 | |
第五周 | 1409/2645 | 1/6 | 24/77 | |
第六周 | 561/3206 | 1/7 | 20/97 | 再次搞清了一些自己有点含糊不清的概念 |
第七周 | 63/3269 | 1/8 | 15/112 | |
第八周 | 2476/5745 | 3/11 | 90/201 | |
第九周 | 824/6595 | 1/12 | 20/221 |
- 计划学习时间:15小时
- 实际学习时间:20小时
- 改进情况:相比而言可能在异常那一章用的时间更多,尤其是IO异常那一部分。