1.关于”equals()”方法,String可以随便用一用,JDK貌似很多类都没有覆写equals()方法,慎重使用。顺便一说,Object的equals()方法相当于==。自己覆写equals()方法,步骤三:<1>索引是否相等<2>是否是此类型<3>成员判断。覆写equals()方法,要覆写hashcode()方法。相等的对象必须具有相等的散列码。有些集合类都是基于散列值的,如HashMap、HashSet、Hashtable等,是根据对象的散列值将其映射到相应的散列桶。最后,当对有父类的类重写equals()方法时,注意调用super.equals()方法。
2.在把异常向上抛出时要注意,如果在catch,finallly中执行会产生异常的语句时,有可能会覆盖根源异常。
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》是侯捷老师的一本关于Java编程实践的书籍,旨在帮助读者深入理解Java语言,并通过实际代码示例提升编程技能。这本书涵盖了Java的基础到进阶内容,是学习和提升Java技术的重要资源。 1. **Java...
《Practical Java全书源码》是一份宝贵的资源,它涵盖了J2ME(Java 2 Micro Edition)平台上的手机游戏开发。J2ME是Oracle公司为小型设备和嵌入式系统设计的一种Java平台,广泛应用于早期的移动设备,如功能手机和...
《Practical Java》和《Effective Java》正是这样两部著作,它们对Java的重要而基础的技术细节进行了详尽、深刻的介绍和剖析,每个主题独立成章,既方便读者根据需求选择性阅读,又能彼此呼应,形成一个完整的学习...
《实用Java(中文版)》是一本由资深Java编程专家撰写的指南,旨在提供实际、高效且具有针对性的Java编程实践经验。这本书经过侯捷的翻译,确保了内容的准确性和可读性,对于中文读者来说,是学习和提升Java技能的...
《实用Java编程(含源码)》是一本专注于解决Java编程实际问题的书籍,它针对的是Java程序员在日常开发过程中可能会遇到的各种困扰和难题。这本书的目的是为了解答那些经常出现但又容易让人迷惑的问题,从而提升Java...
《Practical Java》中文版随书源码是一个包含与J2ME手机游戏开发相关的实践教程资源。这本书通过实例深入浅出地介绍了Java编程语言在移动平台上的应用,特别是针对Java Micro Edition (J2ME)环境。J2ME是Java的一个...
### 实践1:Java中的参数传递机制 #### 参数传递方式:值传递 vs 引用传递 在Java中,参数是以**值传递**(by value)的方式传递给方法的,而不是很多人误解的**引用传递**(by reference)。这种误解往往来源于Java...
《Practical Java》是由著名程序员侯捷编写的关于Java编程实践的一部著作,该书深入浅出地探讨了Java编程的各个方面,旨在帮助开发者提升实际编程能力。在压缩包"practical_java.zip"中,包含了两个主要文件:...
《Practical Java》是一本由资深Java专家编写的实践性指南,旨在帮助读者深入理解Java编程语言,并提供改进代码质量的实用策略。这本书的核心在于68个关键主题,每个主题都针对一个特定的编程问题或最佳实践,旨在...
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 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》是Java编程领域的一部经典之作,作者为(美)海格尔,它与《Effective Java》齐名,都是程序员提升编程技能的重要参考资料。本书深入浅出地介绍了如何编写高质量、高效的Java程序,旨在帮助开发者...
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 完整版,不是early release
标题《Practical database programming with Java》和描述《Practical database programming with Java》提到了关于Java数据库编程的实际应用,但给出的内容部分并非直接相关的知识说明,而是涉及书籍信息、版权声明...
内容概要:本书《Practical Java Programming with ChatGPT》由Alan S. Bluck撰写,旨在帮助Java程序员通过集成OpenAI的API并利用生成式AI和大型语言模型(LLMs)来开发、原型化和验证Java应用程序。书中详细介绍了...
《Practical Java》是Java编程领域的一本经典教程,由著名技术翻译家侯捷先生翻译。这本书深入浅出地介绍了Java编程语言的核心概念和技术,旨在帮助读者从实践角度理解和掌握Java编程。书中涵盖的内容广泛,从基本...
《Practical Java2》是一本专注于深入探讨Java语言核心特性的书籍,适合中高阶的Java程序员阅读。本书主要关注Java语言的面向对象特性、语言关键字、文件组织、类型系统、多线程、异常处理等关键领域,旨在帮助读者...