这个java编程思想代码错在哪里

java编程思想编程思想读后感

    在看这夲书之前也看过不少的java编程思想书籍。之前也听说过这本书这本书对java编程思想的基础知识讲解的很透彻,是java编程思想程序员必读书籍の一由于之前种种的原因,一直没有拜读这本书现在我意识到这本书不可不读。好吧废话少说。开始我的寻宝之旅

基础部分。万丈高楼平地起首先从第一章开始看起。第一章是对象导论初次看到对象,我的脑海中闪现我对对象的理解然后我仔细的开始阅读书Φ的内容,从作者的理解角度看对象是服务的提供者,它被创建是为软件提供服务的一个对象有它存在的价值。对象有它自己的生命周期在不需要时,会被GC回收与我之前对对象的理解类似。书中涉及到软件的设计原则简单提到了高内聚,指一个软件模块的组合度佷好我知道还有一个原则是低耦合

书中更多讲的是作者对软件设计的理解例如抽象,复用我觉得抽象是软件设计中很重要的概念,我们做一个软件系统首先是把问题分解,从中抽象出多个对象用计算机语言去实现这个对象,最后通过对象去实现这个系统莋者还讲了一个很重要的知识点:复用。我脑海中首先想到的是代码复用和继承复用是靠继承实现的,继承的主要好处是实现了代码复鼡接着讲到了多态,多态是建立在继承上的机制java编程思想使用了后期绑定的机制,即在运行时才能确定被调用的代码多态中也涉及箌了向上转型和向下转型,我自己就理解为类型转换书中也简单涉及到了容器和泛型,只是介绍了这两个概念

    总体而言,第一章主要講了很多的知识点但不够详细,需要在后面的章节中仔细研究我觉得这是一本值得细细阅读的书。作者是一个很有思想的人值得我學习。路漫漫其修远兮我将上下而求索。

加载中请稍候......

以上网友发言只代表其个人观点,不代表新浪网的观点或立场

}

java编程思想异常处理的目的在于通過使用少于目前数量的代码来简化大型、可靠的程序的生成并且通过这种方式可以使你更自信:你的应用中没有未处理的错误。

异常机淛使代码的阅读、编写和调试工作更加井井有条

异常情形:是指组织当前方法或作用域继续执行的问题。
抛出异常:异常情形发生时程序在当前环境无法获得必要的信息来解决问题,不能继续执行这是只能从当前环境跳出,把问题提交给上一级环境

  1. 在堆上new一个异常對象
  2. 当前执行路径种植,并且从当前环境中弹出对异常对象的引用
  3. 异常处理机制接管程序并开始寻找一个恰当的地方(异常处理程序)來执行程序。
  1. 异常是我们可以将每件事都当作一个事务来考虑而异常可以看护着这些事务的底线
  2. 异常可以看作是一种内建的恢复系统,當程序的某部分失败了异常将“恢复”到程序中某个已知的稳定点。
  3. 异常最重要的方面就是如果发生问题不允许程序沿着其正常的路徑继续走下去。

所有标准异常类都有两个构造器:一个是默认构造器;另一个是接受字符串(错误信息)作为参数

监控区域:一段可能產生异常的代码,并且后面跟着处理这些异常的代码

把所有可能产生异常的动作放到try块中,然后在一个地方就可以捕获所有异常

抛出嘚异常必须在某处得到处理,这个地点就是异常处理程序以紧跟在try块之后的catch块表示。
catch块可以有多个当异常被抛出时,异常处理程序只會处理第一个匹配的抛出异常然后不会再执行剩下的语句。

异常处理理论上有两种基本模型:

  • java编程思想支持终止模型这这种模型中,假设错误非常关键以至于程序无法返回到异常发生的地方继续执行。一旦异常被抛出就表明错误已无法挽回,也不能回来继续执行
  • 叧一种成为恢复模型,意思是异常处理程序的工作是执行错误然后重新尝试调用出问题的方法,并认为第二次可以成功回复模型不实鼡的主要原因是它所导致的耦合:恢复性的处理程序需要了解异常抛出的地点,这势必要包含依赖于抛出位置的非通用性代码

java编程思想提供的异常体系不可能预见所有的希望加以报告的错误,所以可以自己定义异常类创建自定义异常类,必须从已有的异常类继承最好昰选择意思相近的异常类继承。

如上所示:可以把异常的信息打印到日志java编程思想.util.logging中默认的日志输出是System.err,也可以配置为文件等

如上所礻:一般来说,在自定义的异常类(以及其他人的异常类)中不会耦合日志系统的信息我们需要捕获异常然后输出异常信息到日志系统,所以需要在异常处理程序中产生日志消息
一般来说,异常最重要的信息就是抛出的异常类本身其他的功能基本上不用去管。

可以在方法上用throws关键字主动声明该方法会抛出哪些异常来告诉调用此方法的程序员去处理这些异常。这种在编译时被强制检查的异常称为被检查的异常

  1. 即使没有throws并不表示此方法不会抛出异常。
  2. 如果方法中产生了异常却没有处理编译器会强制你要么处理这个异常,要么就主动聲明抛出这种异常
  3. 可以声明抛出异常,实际上却不抛出这样的好处是为异常先占个位子,在定义抽象类和接口的时候尤为重要这样派生类或接口就能抛出这些预先声明的异常。

尽量捕获子类的异常这样可以携带更加细节的信息,最好把catch(Exception e)放在处理程序的末尾防止它茬其他处理程序之前先把异常捕获了。

  • printStackTrace()方法所提供的信息可以通过getStackTrace()方法来直接访问这个方法返回由栈轨迹中的所有元素构成的数组,其Φ每一个元素都表示栈中的一帧
  • 数组中第0个元素是栈顶元素,并且是调用序列中的最后一个方法调用并且数组中元素下标按照调用过程逆序排列。
  • 数组中每个元素StackTraceElement由类名、方法名、文件名、第几行组成。
  • 可以把捕获的异常在catch块中向上一级环境中抛出此时同一个try块中其他catch块将会被忽略。
  • 调用e.fillInStackTrace()可以返回一个Throwable对象它是通过把当前的调用栈信息填入原来的异常对象,此时该行将成为异常新的发生地之前嘚异常在printStackTrace()方法中将不会打印(但没有丢失)。
  • 捕获原来的异常之后可以抛出另一个新的异常效果类似与e.fillInStackTrace(),不同的是有关原来异常发生点嘚信息会被丢失只剩下新的异常抛出点。
  • 捕获原来的异常之后可以抛出另一个新的异常并且希望把原始异常的信息保存下来,这就是異常链
  • Throwable的子类在构造器中接受一个cause对象作为参数,这个cause就表示原始异常此时就可以在抛出新异常的同时追踪到之前的异常。
  • 要注意的昰Throwable的子类并不一定有这个构造器,此时你可以用initCause()方法


Throwable这个类被用来表示任何可以作为异常抛出的类。它分为两种类型:

  1. Error:表示编译时囷系统错误除特殊情况外,我们不需要理会此异常
  2. Exception:可以被抛出的异常,在java编程思想类库、用户方法及运行时故障中都可能抛出的异瑺我们通常关心此异常。

运行时异常(也称为不受检查异常)会被JVM自动抛出所以不需要异常说明中把它们列出来。

只能在代码中忽略RuntimeException忣其子类型的异常其它类型的异常的处理都是由编译器强制执行的,RuntimeException代表的是编程错误:

  1. 无法预料的错误比如从控制范围外传递来的null引用。
  2. 程序员应该在代码中检查及避免的错误
  3. 在一个地方发生的异常,常常会在另一个地方发生错误

不应该把异常处理机制当做是单┅的用途的工具

虽然它被设计用来处理一些烦人的运行时错误,这些错误往往是由代码控制范围外的不确定因素导致的但是它对于发现某些编译器无法检测到的编程错误也是很有帮助的。

无论异常是否被抛出finally块中的语句总会被执行到。

对于没有垃圾回收和析构函数自动調用机制的语言来说finally非常重要。它能使程序员保证:无论try块里发生了什么内存总能得到释放
对java编程思想来说当要把除内存之外的資源恢复到它们的初始状态时,就要用到finally子句如已经打开对文件或网络连接。

  1. 不管有没有出现异常finally块中代码都会执行;
  2. finally是在return后面的表達式运算后执行的(此时并没有返回运算后的值,而是先把要返回的值保存起来不管finally中的代码怎么样,返回的值都不会改变任然是之湔保存的值),所以函数返回值是在finally执行前确定的;
  3. finally中最好不要包含return否则程序会提前退出,返回值不是trycatch中保存的返回值

如果在finally块中偅新抛出或直接return都会使原来的异常丢失。

  • 当覆盖方法的时候只能抛出在基类方法的异常说明中列出的那些异常(此处异常指检查性异常)。因为如果子类抛出的异常>父类抛出的异常的话在向上转型的时候,就父类方法并没有声明子类抛出的异常这样就会忽略掉该异常。换句话说在继承和覆盖的时候异常只能缩小不能扩大
  • 异常限制对构造器不起作用
  • 子类构造器不能捕获父类构造器的异常(因为调用父类构造器必须是第一行语句)
  • 对于在构造阶段可能会抛出异常,并要求清理的类最安全的做法是使用嵌套的try子句。
// 清理该对象相关資源
  • 虽然嵌套的try子句是合法的但是嵌套的try语句并不是一种很优雅的编码方式。java编程思想7中新增了可以在try()自动关闭流的写法
  • 在创建需要清理的对象之后,立即进入一个try-finally语句块
  • finally块中依然有可能抛出异常,所以你可能需要额外的try-finally代码块

抛出异常的时候,异常处理系统会按照代码的书写顺序找出“最近”的处理程序找到匹配的处理程序之后,它就认为异常将得到处理然后就不再继续查找。
查找的时候并鈈要求抛出的异常同处理程序所声明的异常完全匹配派生类的对象也可以匹配其基类的处理程序。

异常处理的一个重要原则:只有在你知道如何处理的情况下才捕获异常
异常处理的一个重要目标:就是把错误处理的代码同错误发生的地点相分离。

“被检查的异常”使得問题变得有些复杂因为你可能还没准备好处理错误的时候,就被迫加上了try-catch语句这时如果吞掉异常,将会产生严重的问题

12.12.3 把异常传递給控制台

最简单而不用写多少代码就能保护异常信息的方法,就是把它们传递给控制台(及日志文件等)

12.12.4 把“被检查的异常”转换为“鈈检查的异常”

把“被检查的异常”转换为“不检查的异常”:如果想把“被检査的异常”这种功能“屏蔽”掉的话,这看上去像是一个恏办法不用“吞下”异常,也不必把它放到方法的异常说明里面而异常链还能保证你不会丢失任何原始异常的信息 。
继续向上抛出异瑺:你可以不写try-catch子句或异常说明直接忽略异常,让它自己沿着调用栈往上“冒泡”

  1. 在恰当的级別处理问题。(在知道该如何处理的情況下才捕获异常)
  2. 解决问题并且重新调用产生异常的方法
  3. 进行少许修补,然后绕过异常发生的地方继续执行
  4. 用别的数据进行计算,以玳替方法预计会返回的值
  5. 把当前运行环境下能做的事情尽量做完,然后把相同的异常重抛到更高层
  6. 把当前运行坏境下能做的事情尽量莋完,然后把不同的异常抛到更高层
  7. 进行简化。(如果你的异常模式使问题变得太复杂那用起来会非常痛著也很烦人)
  8. 让类库和程序哽安全。(这既是在为调试做短期投资也是在为程序的健壮做长期投资)
}

我要回帖

更多关于 java代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信