学号 2017-2018-20172309 《程序设计与数据结构》第9周学习总结
学号 2017-2018-20172309 《程序设计与数据结构》第9周学习总结
教材学习内容总结
-
第十一章:
- 异常处理:在 Java 中,所有的异常都有一个共同的祖先 Throwable(可抛出),Throwable 有两个重要的子类:Exception(异常)和 Error(错误)。
①. Exception(异常)是应用程序中可能的可预测、可恢复问题。
②. Error(错误)表示运行应用程序中较严重问题。大多数错误与代码编写者执行的操作无关,而表示代码运行时 JVM(Java 虚拟机)出现的问题。
- 未捕获的异常:
①. 如果程序不处理异常,则将非正常的终止异常,并产生关于描述何处发生什么样的异常的信息。
②. 异常跑出的信息,提供了方法调用堆栈踪迹。
- try-catch语句
①. try语句块可以有多个相关联的catch子句,,每一个catch语句称为一个异常处理器。
②. 如果没有异常抛出,将继续执行try语句后的语句(所有catch子句后的语句)。
- finally子句
①. 用来定义一串必须执行的语句。
②. 常用来关闭资源。
- 异常的传递
如果在一个异常的发生处没有捕获和处理该异常,则该异常将传递给上级调用的方法。直到遇到main方法,将终止程序并产生错误信息。
- 异常类层次结构
①. 自定义异常
②.可检测异常和不可检测异常
- I/O!?
1. IO流对数据的操作是通过流的方式
2. Java对数据的操作是通过流的方式
3. Java用于操作流的对象都在IO包中
4.流按操作分为两种:字节流和字符流
5. 流按流向分为:输入流和输出流 -
第十二章:
- 含义:递归算法是一种直接或间接地调用自身的算法。在计算机编写程序中,递归算法对解决一大类问题是十分有效的,它往往使算法的描述简洁而且易于理解。
- 无穷递归:任何一个递归定义中必须有称为基本情况的非递归部分,才能使递归结束。否则称为无穷递归。
- 每次递归调用都将新增内存空间,因此无穷递归常产生运行时错误,报告内存耗尽的错误信息。
- 注意:递归不是唯一的选择,每种递归都能用循环迭代来完成,但对于某些问题将变得更加简练。
- 直接递归与间接递归:
一个方法调用自己称为直接递归;
一个方法调用其他方法,最终再调用自己,称为间接递归。
- 递归的运用: 1. 迷宫旅行。 2. 汉诺塔问题。
教材学习中的问题和解决过程
- 第十一章:
- 问题一:异常和错误的异同点
- 问题1解决方法:
相关链接:运行时产生的异常与一般异常 - 问题二:使用try-catch语句中的catch中的异常和实际出现的异常是怎么相互匹配的?也就是比如我出现了0作除数的错误,这个ArithmeticException错误怎么和catch()语句相互认识?
- 问题二解决方案:在java中所有的异常都大部分自己已经自己定义好了的,当出现错误时,他们将自动匹配。
- 问题三:书中catch子句调用了getMessage、printStackTrace方法,这两个方法如何使用,使用时应该注意什么?以及getMessage()与toString()方法有什么区别?
- 问题三解决方案:总结:
1. e.toString()获取的信息包括异常类型和异常详细消息,而e.getMessage()只是获取了异常的详细消息字符串。
2. getMessage()和printStackTrace()方法的区别:
3. e.getMessage(); 只会获得具体的异常名称. 比如说NullPoint 空指针,就告诉你说是空指针...
4. e.printStackTrace();会打出详细异常,异常名称,出错位置,便于调试用.. 一般一个异常至少几十行 - 问题四:遇到异常什么时候该捕获。什么时候抛出?
- 问题四解决方案:
简单点说就是能够捕获并处理就捕获处理,不能够就抛出。
相关链接百度知道 - 问题五:如何理解可检测异常和不可检测异常?
- 问题五解决方案:
1. java中异常分为两类:checked exception(检查异常)和nchecked exception(未检查异常)。
2.所有不是RuntimeException派生的Exception都是检查型异常,未检查异常也叫RuntimeException(运行时异常).
3. 对未检查的异常(unchecked exception )的几种处理方式:捕获、继续抛出、不处理。
4. 可检查异常:对于检查的异常必须处理,或者必须捕获或者必须抛出
5. 对于RuntimeException的子类最好也使用异常处理机制。虽然RuntimeException的异常可以不使用try...catch进行处理,但是如果一旦发生异常,则肯定会导致程序中断执行,所以,为了保证程序再出错后依然可以执行,在开发代码时最好使用try...catch的异常处理机制进行处理。
- 第十二章:
- 问题一:递归、迭代各有什么优缺点。哪种情况用递归,哪种情况用迭代?
- 问题一解决方案:
注:当使用迭代法更加简单、易懂并易于编写程序时,应避免使用递归,递归会带来多次调用方法的开销,且经常显得不直观。 - 问题二:递归的格式?
- 问题而解决方案:就举个例子吧:N的阶乘:
n!=n*(n-1)*(n-2)*...*1
- 递归法:
> int factorial (int n) {
> if (n == 1) //非递归部分
> {
> return 1;
> }
> else//递归部分
> {
> return n*factorial(n-1);
> }
> }
原理:在执行以上代码的时候,其实机器是要执行一系列乘法的: factorial(n)
→ factorial(n-1)
→ factorial(n-2)
→ … → factorial(1)
。
2. 迭代法:
> int factorial (int n)
> {
> int product = 1;
>
> for(int i=2; i<n; i++)
> {
> product *= i;![](https://images2018.cnblogs.com/blog/1333063/201805/1333063-20180513172957257-818255889.png)
> }
> return product;
> }
原理:先计算1乘以2,然后用其结果乘以3,再用的到的结果乘以4….一直乘到N。在程序实现时,可以定义一个计数器,每进行一次乘法,计数器都自增一次,直到计数器的值等于N截至。
代码调试中的问题和解决过程
- PP11.1中出现的问题:如何达到题目要求“直到输入“DONE”为止”?
- 解决方案:这个问题出现是因为我理解题目出现了问题,我以为是一下子输入一大串字符串,然后从中读取,读到“DONE”就停止。其实不是的,而是检测到输入得单词为“DONE”就停止,然后判断总输入字符串是否超过长度20个,如果是,就抛出异常。
代码链接 - PP12.1中出现的问题:如何使用递归实现代码?基本情况与递归情况应该怎么确定?
- 解决方案:
代码链接 - PP12.9中出现的问题:应该如何排版,实现输出后呈现塔的形状?
- 解决方案:每行前的空格是有规律的,第1行有n-1个空格、第2行有n-2个空格·····第n行有0个空格,用循环即可实现!
代码链接
代码托管
(statistics.sh脚本的运行结果截图)
上周考试错题总结
- 第十章测试错题:
- 错题1:
- 错误原因:没有看到这一组元素中的最小数2。另外选出最小数后应该与最前面一个数换位置。
- 错题2:
- 错误原因:选择时是准备选覆盖的,但是不知道怎么就是选了A!!
- 错题3:
- 错误原因:没有了解到排序的实质,这两种排序都是对一组数据的重新组合,不需要额外的空间内存。
- 错题4:
- 错误原因:虽然继承和接口支持多态,但只有在有后期绑定时才会这样做。但是,重载是多态性一(方法)名的一种形式,多个主体,只要程序使用重载,多态就在使用中。
- 错题5:
- 错误原因:这是一种用于完成多态引用的技术,它的精确解释将在执行过程中发生变化,这取决于变量在遇到时所引用的精确对象。 - 第十一章测试错题:
- 错题1:
- 理解情况:抛出异常是被当前的代码如果代码包含在一个try语句和适当的catch语句实现,否则是传播的方法调用的方法引起的异常,在一个合适的声明,否则继续传播通过相反的顺序的方法,这些方法被调用。然而,一旦达到了主要的方法,这个过程就停止了。如果没有被捕获,异常会导致程序终止(这将是应答a,例外被忽略)。然而,异常不会被抛出异常类。
- 错题2:
- 理解情况:这两个例外都是RuntimeException的子节点,它本身就是一个例外的子节点。错误是一个可抛出的对象,它与异常不同,而非法访问异常和CheckedException是异常的子元素,而不是RuntimeException。
- 错题3:
- 理解情况:保留的单词投掷用于在检测异常时抛出异常,如:如果(得分<0)抛出新的非法测试分数异常(“输入分数”+分数+“为负”);
- 错题4:
- 理解情况:B、C和D的答案都是正确的,runtimeexception是可抛出的对象,并且不是错误类的一部分,而且两种类型的runtimeexception都是算术异常和NullPointerException。不是runtimeexception异常的例外包括各种检查异常,但是runtimeexception不是检查异常。
- 错题5:
-理解情况:输入到Java程序是很困难的,因为它需要大量的开销。扫描器类实现了所有的开销,这样程序员就不必看到它了。因此,扫描器是在没有细节的情况下执行输入操作的抽象。这些细节包括导入java。io类,以某种方式处理ioexception,从标准输入流中输入,将输入划分为单个令牌,并根据需要将每个令牌转换成请求表单。
点评模板:
点评情况
-
博客中值得学习的或问题:
- 课本知识点总结充分。
- 不懂得积极通过网络解决
- 这是不是排版出现点问题了啊
-
基于评分标准,我给本博客打分:14分。
点评过的同学博客和代码
其他(感悟、思考等,可选)
总的来说,这两章很难。都很难理解,在第十章中难点是IO流,其中有的部分直到现在还没完全理解。o(╥﹏╥)o~~看来只能在后面自己看视频慢慢的补上去了。对于第十二章,虽然课本上的知识点很少,但是道理我都懂,就是代码看不懂······ 这个还得接下来问同学了。
学习进度条
代码行数(新增/累积) | 博客量(新增/累积) | 学习时间(新增/累积) | 重要成长 | |
---|---|---|---|---|
目标 | 5000行 | 30篇 | 400小时 | |
第一周 | 075/200 | 1/1 | 05/20 | |
第二周 | 560/500 | 1/2 | 13/38 | |
第三周 | 972/1000 | 1/4 | 21/60 | |
第四周 | 694/1666 | 1/5 | 21/90 | |
第五周 | 1544/3095 | 1/6 | 30/90 | |
第六周 | 600/3627 | 1/7 | 30/120 | |
第七周 | 544/4200 | 2/9 | 20/140 | |
第八周 | 907/5107 | 2/10 | 20/160 | |
第九周 | 700/5807 | 1/11 | 20/180 |