`
菜鸟2号
  • 浏览: 6881 次
  • 性别: Icon_minigender_1
  • 来自: 西安
最近访客 更多访客>>
社区版块
存档分类
最新评论

彩击机的Practical Java读后小记(一)

阅读更多

 

    1.关于”equals()”方法,String可以随便用一用,JDK貌似很多类都没有覆写equals()方法,慎重使用。顺便一说,Objectequals()方法相当于==。自己覆写equals()方法,步骤三:<1>索引是否相等<2>是否是此类型<3>成员判断。覆写equals()方法,要覆写hashcode()方法。相等的对象必须具有相等的散列码。有些集合类都是基于散列值的,如HashMapHashSetHashtable等,是根据对象的散列值将其映射到相应的散列桶。最后,当对有父类的类重写equals()方法时,注意调用super.equals()方法。

    2.在把异常向上抛出时要注意,如果在catchfinallly中执行会产生异常的语句时,有可能会覆盖根源异常。

 

Public class Hidden
{
  public void foo() throws Exception
  {
    try {
      throw new Exception("First Exception");                 //1
    }
    catch (Exception e) {
      throw new Exception("Second Exception");                //2
    }
    finally {
      throw new Exception("Third Exception");                 //3
    }
  }
}

    3.关于throws,写清每一个异常比写一个他们的父类要好,因为捕获异常的函数也许需要针对不同的异常进行操作。

比如void f() throws FileNotFoundException, EOFException, UnsupportedEncodingException

就比void f() throws IOException 要好很多。

当调用f()的函数处理异常时,碰到第二种情况就只有去看f()的源码了。。。

这也没神马好总结的,JDK就是这么做的,大抵就是这个原因吧。

    4.关于继承关于throws

 

interface A {
void f() throws IOException;
}
class B {
	@Override
	void f() …
}
 

此时f()有三种选择,<1>不抛出任何异常<2>抛出IOException<3>抛出IOException的子类异常<4>有非IOException的子类异常怎么办?自己内部抓住解决之。

原因是,要是不这样,调用f()的上层方法不知道要改成神马样子,面向接口编程还怎么搞。这些其实编译器都会帮你检查的,之所以还要说是因为注意到这个问题,了解了些许原因,感觉对异常处理突然产生些许感悟。

    5.关于finally,老问题随便写两句,用finally确保你的资源释放。当有finally块存在时,最好不要从try块中return,否则勿必检查finally块不会影响程序的正常返回。下面代码必须悲剧的。

 

int f() {
	try {
		return 1;
	   } finally {
		return 2;
	   }
}
 

补一点,怎么才能不执行finally块中语句呢?在try块中执行到System.exit(0);语句-.-

    6.关于“不要用异常控制流程”,印象中有点争议? 关键在于“流程”二字,这个流程指什么。这个流程指的是正常的程序流程,比如《Practical Java》实践24里面这个,但是异常的程序流程是可以处理的,比如网络程序socket连接连着由于网络不稳定等原因断了,捕获这个异常,进行重新连接或者连接服务镜像神马的,这个流程就是异常流程,这个不用异常控制不好处理了吧。

    7.在构造函数中抛出异常,咋一看,有点怪。稍微一回忆,JDK中的Stream系列构造函数可不都是这样的么。Why?构造函数没有返回值,不能从构造函数获得传统的错误报告,一旦构造函数失败,无法从中返回错误码。这么做的好处:如果构造函数产生异常,调用段也忽略了这个异常,那么变量的索引就会指向null,使用时就会抛出NullPointerException。如:

 

A a = null;
try {
a = new A();
} catch(XXExcption e) {…}
// 调用a
… …
 

还有一种办法叫做二段构造法,构造函数只处理不会有异常的部分,会产生异常的部分抽离出去由另一个函数进行处理。此时就必须设置一个标志位来显示该类是否被成功的初始化,但是这造成了在调用其它函数的时候或之前必须检查此标志位(调用其它函数的时候是指检查标志位的工作在每一个“其它函数”的内部最开始的部分)。

对了,以上讨论的类像这种:

 

class MyFileInputStream {
	String name;
	FileInputStream fis;
}
 

初始化name时候不会错,而初始化fis时候会有FileNotFoundException异常,不管的话会产生name有值,fis没值是null的未完全初始化的情况,导致其它成员方法的一些错误。

    8.抛出异常前先将对象恢复成有效状态,嗯,理解的不够深刻。说点别的,捕获异常并且没有继续向上抛,此时程序必须能够运行在已知的流程上,必须要正常的运行,并且不能影响下一次运行。简单说就是捕获异常需要处理,至少也要日志,对于处理不了的还是继续向上抛吧。

分享到:
评论

相关推荐

    Practical Java一书及代码

    《Practical Java》是侯捷老师的一本关于Java编程实践的书籍,旨在帮助读者深入理解Java语言,并通过实际代码示例提升编程技能。这本书涵盖了Java的基础到进阶内容,是学习和提升Java技术的重要资源。 1. **Java...

    Practical Java全书源码.rar

    《Practical Java全书源码》是一份宝贵的资源,它涵盖了J2ME(Java 2 Micro Edition)平台上的手机游戏开发。J2ME是Oracle公司为小型设备和嵌入式系统设计的一种Java平台,广泛应用于早期的移动设备,如功能手机和...

    Practical Java(简体中文)

    《Practical Java》和《Effective Java》正是这样两部著作,它们对Java的重要而基础的技术细节进行了详尽、深刻的介绍和剖析,每个主题独立成章,既方便读者根据需求选择性阅读,又能彼此呼应,形成一个完整的学习...

    practical java(中文版)

    《实用Java(中文版)》是一本由资深Java编程专家撰写的指南,旨在提供实际、高效且具有针对性的Java编程实践经验。这本书经过侯捷的翻译,确保了内容的准确性和可读性,对于中文读者来说,是学习和提升Java技能的...

    Practical Java(含源码)

    《实用Java编程(含源码)》是一本专注于解决Java编程实际问题的书籍,它针对的是Java程序员在日常开发过程中可能会遇到的各种困扰和难题。这本书的目的是为了解答那些经常出现但又容易让人迷惑的问题,从而提升Java...

    《Practical Java》中文版随书源码

    《Practical Java》中文版随书源码是一个包含与J2ME手机游戏开发相关的实践教程资源。这本书通过实例深入浅出地介绍了Java编程语言在移动平台上的应用,特别是针对Java Micro Edition (J2ME)环境。J2ME是Java的一个...

    Practical Java

    ### 实践1:Java中的参数传递机制 #### 参数传递方式:值传递 vs 引用传递 在Java中,参数是以**值传递**(by value)的方式传递给方法的,而不是很多人误解的**引用传递**(by reference)。这种误解往往来源于Java...

    practical_java.zip_practical java

    《Practical Java》是由著名程序员侯捷编写的关于Java编程实践的一部著作,该书深入浅出地探讨了Java编程的各个方面,旨在帮助开发者提升实际编程能力。在压缩包"practical_java.zip"中,包含了两个主要文件:...

    Practical.Java简体中文版

    《Practical Java》是一本由资深Java专家编写的实践性指南,旨在帮助读者深入理解Java编程语言,并提供改进代码质量的实用策略。这本书的核心在于68个关键主题,每个主题都针对一个特定的编程问题或最佳实践,旨在...

    Practical Java(中文版(繁体+简体))

    Practical Java viii 2 對象與相等性(Objects and Equality) 25 實踐8:區分reference type 和primitive type 25 實踐9:區分== 和 equals() 29 實踐10:不要倚賴equals()的缺省實現33 實踐11:實現equals()時必須...

    Deep Learning: Practical Neural Networks with Java 完整高清英文azw3版

    Deep Learning: Practical Neural Networks with Java by Yusuke Sugomori English | 8 Jun. 2017 | ASIN: B071GC77N9 | 1057 Pages | AZW3 | 20.28 MB Build and run intelligent applications by leveraging key ...

    Practical Java(海格尔经典之作)

    《Practical Java》是Java编程领域的一部经典之作,作者为(美)海格尔,它与《Effective Java》齐名,都是程序员提升编程技能的重要参考资料。本书深入浅出地介绍了如何编写高质量、高效的Java程序,旨在帮助开发者...

    Practical Java Game Programming

    Practical Java Game Programming Chapter 1 - Java as a Game Platform Chapter 2 - Fundamentals of Game Programming Chapter 3 - 2D Graphics Programming Chapter 4 - Creating Game Audio Using Java...

    Optimizing Java Practical Techniques for Improved

    Optimizing Java Practical Techniques for Improved 完整版,不是early release

    Practical database programming with Java

    标题《Practical database programming with Java》和描述《Practical database programming with Java》提到了关于Java数据库编程的实际应用,但给出的内容部分并非直接相关的知识说明,而是涉及书籍信息、版权声明...

    Practical Java Programming with ChatGPT

    内容概要:本书《Practical Java Programming with ChatGPT》由Alan S. Bluck撰写,旨在帮助Java程序员通过集成OpenAI的API并利用生成式AI和大型语言模型(LLMs)来开发、原型化和验证Java应用程序。书中详细介绍了...

    Practical Java[含源码][PDF]

    《Practical Java》是Java编程领域的一本经典教程,由著名技术翻译家侯捷先生翻译。这本书深入浅出地介绍了Java编程语言的核心概念和技术,旨在帮助读者从实践角度理解和掌握Java编程。书中涵盖的内容广泛,从基本...

    Practical Java2

    《Practical Java2》是一本专注于深入探讨Java语言核心特性的书籍,适合中高阶的Java程序员阅读。本书主要关注Java语言的面向对象特性、语言关键字、文件组织、类型系统、多线程、异常处理等关键领域,旨在帮助读者...

Global site tag (gtag.js) - Google Analytics