- 浏览: 128764 次
- 性别:
- 来自: 北京
最新评论
-
C_J:
有必要这么鸡冻咩?
编写自己的ClassLoader知识点 -
jason61719:
你这不是说了等于没说吗……就解析个loadClass(),谁不 ...
编写自己的ClassLoader知识点 -
jiming:
tedeyang 写道很好的改进,不过话说回来,mybatis ...
开源,从关注产品社区做起(ibatis3.x的最近一个issue展示) -
C_J:
独爱Java 写道好像实际用处并不是很大,只是多了解了有这个东 ...
Java内存模型笔记 -
独爱Java:
好像实际用处并不是很大,只是多了解了有这个东西而已。。。
Java内存模型笔记
异常谜题
循环谜题
表达式谜题
字符谜题
类谜题——这个比较熟悉
库谜题——
1,令人疲惫不堪的测验
本谜题将测试你对递归的了解程度。下面的程序将做些什么呢?
public class Workout {
public static void main(String[] args) {
workHard();
System.out.println("It's nap time.");
}
private static void workHard() {
try {
workHard();
} finally {
workHard();
}
}
}
要不是有try-finally 语句,该程序的行为将非常明显:workHard 方法递归地
调用它自身,直到程序抛出StackOverflowError,在此刻它以这个未捕获的异
常而终止。但是,try-finally 语句把事情搞得复杂了。当它试图抛出
StackOverflowError 时,程序将会在finally 语句块的workHard 方法中终止,
这样,它就递归调用了自己。这看起来确实就像是一个无限循环的秘方,但是这
个程序真的会无限循环下去吗?如果你运行它,它似乎确实是这么做的,但是要
想确认的唯一方式就是分析它的行为。
Java 虚拟机对栈的深度限制到了某个预设的水平。当超过这个水平时,VM 就抛
出StackOverflowError。为了让我们能够更方便地考虑程序的行为,我们假设
栈的深度为3,这比它实际的深度要小得多。现在让我们来跟踪其执行过程。
main 方法调用workHard,而它又从其try 语句块中递归地调用了自己,然后它
再一次从其try 语句块中调用了自己。在此时,栈的深度是3。当workHard 方
法试图从其try 语句块中再次调用自己时,该调用立即就会以
StackOverflowError 而失败。这个错误是在最内部的finally 语句块中被捕获
的,在此处栈的深度已经达到了3。在那里,workHard 方法试图递归地调用它自
己,但是该调用却以StackOverflowError 而失败。这个错误将在上一级的
finally 语句块中被捕获,在此处站的深度是2。该finally 中的调用将与相对
应的try 语句块具有相同的行为:最终都会产生一个StackOverflowError。这
似乎形成了一种模式,而事实也确实如此。
2,切掉类
请考虑下面的两个类:
public class Strange1 {
public static void main(String[] args) {
try {
Missing m = new Missing();
} catch (java.lang.NoClassDefFoundError ex) {
System.out.println("Got it!");
}
}
}
public class Strange2 {
public static void main(String[] args) {
Missing m;
try {
m = new Missing();
} catch (java.lang.NoClassDefFoundError ex) {
System.out.println("Got it!");
}
}
}
Strange1 和Strange2 都用到了下面这个类:
class Missing {
Missing() { }
}
如果你编译所有这三个类,然后在运行Strange1 和Strange2 之前删除
Missing.class 文件,你就会发现这两个程序的行为有所不同。其中一个抛出了
一个未被捕获的NoClassDefFoundError 异常,而另一个却打印出了Got it!
3,域的问题
static void copy(String src, String dest) throws IOException {
InputStream in = null;
OutputStream out = null;
try {
in = new FileInputStream(src);
out = new FileOutputStream(dest);
byte[] buf = new byte[1024];
int n;
while ((n = in.read(buf)) > 0)
out.write(buf, 0, n);
} finally {
if (in != null) in.close();
if (out != null) out.close();
}
}
这个程序看起来已经面面俱到了。其流域(in 和out)被初始化为null,并且
新的流一旦被创建,它们马上就被设置为这些流域的新值。对于这些域所引用的
流,如果不为空,则finally 语句块会将其关闭。即便在拷贝操作引发了一个
IOException 的情况下,finally 语句块也会在方法返回之前执行。出什么错了
呢?
问题在finally 语句块自身中。close 方法也可能会抛出IOException 异常。如
果这正好发生在in.close 被调用之时,那么这个异常就会阻止out.close 被调
用,从而使输出流仍保持在开放状态。
4:不情愿的构造器(递归执行异常)
尽管在一个方法声明中看到一个throws 子句是很常见的,但是在构造器的声明
中看到一个throws 子句就很少见了。下面的程序就有这样的一个声明。那么,
它将打印出什么呢?
public class Reluctant {
private Reluctant internalInstance = new Reluctant();
public Reluctant() throws Exception {
throw new Exception("I'm not coming out");
}
public static void main(String[] args) {
try {
Reluctant b = new Reluctant();
System.out.println("Surprise!");
} catch (Exception ex) {
System.out.println("I told you so");
}
}
}
5,优柔寡断(返回false)
下面这个可怜的小程序并不能很好地做出其自己的决定。它的decision 方法将
返回true,但是它还返回了false。那么,它到底打印的是什么呢?甚至,它是
合法的吗?
public class Indecisive {
public static void main(String[] args) {
System.out.println(decision());
}
static boolean decision() {
try {
return true;
} finally {
return false;
}
}
}
6,JAVA不具有目的确定类型的特性
final long MICROS_PER_DAY = 24 * 60 * 60 * 1000 * 1000;
此种计算会以int类型计算且已经“溢出”了。
正确的写法应该是
final long MICROS_PER_DAY=24L*60*60*1000*1000;
7,在处理String和Byte的时候,要特别的小心字符集,尽量做到与平台无关性。
8,混淆的construct
public class Confusing { private Confusing(Object o) { System.out.println("Object"); } private Confusing(double[] dArray) { System.out.println("double array"); } public static void main(String[] args) { new Confusing(null); } }
Java 的重载解析过程是以两阶段运行的。第一阶段选取所有可获得并且可应用
的方法或构造器。第二阶段在第一阶段选取的方法或构造器中选取最精确的一
个。如果一个方法或构造器可以接受传递给另一个方法或构造器的任何参数,那
么我们就说第一个方法比第二个方法缺乏精确性。
所以这里的Confusing(double[] dArray)比Confusing(Object o)更精确。、
9,static都是在编译期确定的。
10,神论
从前有一个人,他认为世上只有一只不寻常的狗,所以他写出了如下的类,将它
作为一个单件(singleton)[Gamma95]:
public class Dog extends Exception {
public static final Dog INSTANCE = new Dog();
private Dog() {}
public String toString(){
return "Woof";
}
}
结果证明这个人的做法是错误的。你能够在这个类的外部不使用反射来创建出第
2 个Dog 实例吗?
这个类可能看起来像一个单件,但它并不是。问题在于,Dog 扩展了Exception,
而Exception 实现了java.io.Serializable。这就意味着Dog 是可序列化的
(serializable),并且解序列(deserialization)会创建一个隐藏的构造器。
正如下面的这段程序所演示的,如果你序列化了Dog.INSTANCE,然后对得到的
字节序列(byte sequence)进行解序列,最后你就会得到另外一个Dog。该程
序打印的是false,表示新的Dog 实例和原来的那个实例是不同的,并且它还打
印了Woof,说明新的Dog 实例也具有相应的功能:
import java.io.*;
public class CopyDog{ // Not to be confused with copycat
public static void main(String[] args){
Dog newDog = (Dog) deepCopy(Dog.INSTANCE);
System.out.println(newDog == Dog.INSTANCE);
System.out.println(newDog);
}
// This method is very slow and generally a bad idea!
static public Object deepCopy(Object obj){
try{
ByteArrayOutputStream bos =
new ByteArrayOutputStream();
new ObjectOutputStream(bos).writeObject(obj);
ByteArrayInputStream bin =
new ByteArrayInputStream(bos.toByteArray());
return new ObjectInputStream(bin).readObject();
} catch(Exception e) {
throw new IllegalArgumentException(e);
}
}
}
要订正这个问题,可在Dog 中添加一个readResolve 方法,它可以将那个隐藏的
构造器转变为一个隐藏的静态工厂(static factory),以返回原来那个的Dog
[EJ Items 2,57]。在Dog 中添加了这个方法之后,CopyDog 将打印true 而不是
false,表示那个“复本”实际上就是原来的那个实例:
private Object readResolve(){
// Accept no substitues!
return INSTANCE;
}
11,不要硬编码目录分隔符 /、\和换行符号 \r\n、\n
12,为了避免实现类的命名冲突而发生覆盖或隐藏,父类尽量用private成员变量。
override:(只对于一个同名的方法而言)
class Base {
public void f() { }
}
class Derived extends Base {
public void f() { } // overrides Base.f()
}
hide:(对于一个同名的成员变量、静态方法而言)
class Base {
public static void f() { }
}
class Derived extends Base {
private static void f() { } // hides Base.f()
}
隐藏后可通过超类来访问父类被隐藏的资源。
如果有final,final 意味着该方法不能被覆写(对实例方法而言)或者隐藏(对静态方法
而言)[JLS 8.4.3.3]。但对于成员变量,final 意味着该域不能被赋值超过一次,却可以被覆盖或隐藏。
13:
public class Twisted {
private final String name;
Twisted(String name) {
this.name = name;
}
private String name() {
return name;
}
private void reproduce() {
new Twisted("reproduce") {
void printName() {
System.out.println(name());
}
}.printName();
}
public static void main(String[] args) {
new Twisted("main").reproduce();
}
}
本例中的Twisted 类,所有的本地的、内部的、嵌
套的和匿名的类都可以毫无限制地访问彼此的成员[JLS 6.6.1]。这是一个欢乐
的大家庭。匿名类中对于printName
方法的调用必须关联到外围(“main”)实例而不是当前(“reproduce”)实例
发表评论
-
iOS入门(ongoing)
2012-09-13 11:32 1315Record it: The overview of ... -
Stuff about Android
2011-07-09 16:15 1082Foreword: long time ... -
JQuery初体验(Demo)
2011-05-22 13:43 1470Demo:Show <meta content ... -
Java内存模型笔记
2011-04-13 15:48 1551题记: 看到C/C++ ... -
Radiant_The Popular Ruby's CMS Demo篇
2011-04-02 14:49 1258题记: 上篇 记录我第一次安装Rodiant经过和 ... -
Radiant_The Popular Ruby’s CMS安装篇
2011-03-28 00:48 1320题记: 今天第一次参加JE的线下活动,robbin等 ... -
关于Azul 并发垃圾回收器
2011-03-26 14:40 1328题记: 总感觉JE讨论的帖子的东西都比较滞后,所以会 ... -
phpCMS & jQuery是我该做的(阉割了)
2011-02-27 23:02 81WD讲究以plugin挂载为结构,我需要构造一个p ... -
我的玩意:J2ME的Criteria初探
2011-01-20 21:59 1032题记: 前几天跟初中同学聊天,他问我能不能做一个GP ... -
编写自己的ClassLoader知识点
2011-01-13 14:41 1879题记: 看到InfoQ关于ClassLoader的文 ... -
周末好玩,用短信控制你的计算机
2011-01-10 16:34 3014Snapshot: 详情 ... -
About Dock Plugin on Mac
2010-11-21 22:47 1475题记: 第一次接触MAC的开发..... ... -
可变hashcode的隐患和序列化安全
2010-10-25 00:55 1384可变hashcode的隐患 为识别对象,JDK ... -
体验OSGi(helloworld.jar)—富app的热拔插
2010-10-18 23:22 2454记得以前工作的时候,有天direct manager问 ... -
MongoDB on DAO with Java Language
2010-08-26 19:17 1441A Quick Tour Using the Java d ... -
Getting Start on Mongodb
2010-08-26 01:29 1528题记: 最近老和同学聊到non-relational ... -
Java Media Framework本地玩转摄像头
2010-08-04 00:57 17541、简介The JavaTM Media Framework ... -
从WeakLogHandler应用看Java的引用、引用队列
2010-06-14 00:58 1512题记: 前几天讨论到WeakHashMap(这个是个弱引用的 ... -
《重构》读书笔记
2010-05-09 00:05 1061Martin Fowler于2003年出版 ... -
RPC之WebServices&RMI&JMS,phprpc框架?(待续)
2010-05-06 22:31 55前段时间写过基本的WebServices,也没再做深入 ...
相关推荐
3. **java解惑.pdf**:这很可能与博客主题相呼应,详细解答了Java编程中的疑惑,比如异常处理、多线程、集合框架、内存管理等复杂话题。 4. **网络安全防护措施百分百.ppt**:网络安全是任何应用开发都不可忽视的...
"JAVA解惑.大全和问题解析"这个资源就是针对这些问题提供的一份详尽的解答指南。它涵盖了Java的基础知识、常见疑惑点以及易错知识点,旨在帮助Java初学者和进阶者解决实际编程中的困扰。 1. **基础概念解析**: - ...
"Java解惑(中文).pdf"是针对Java初学者的答疑解惑指南,它可能包含了一些常见问题和陷阱,以及如何避免和解决这些问题的方法,对初学者来说非常实用。 "Java深度历险.rar"可能是一本深入探讨Java高级特性的书籍,...
JAVA面试题解惑系列.pdf Java面试题(基础).pdf JVM 实用参数系列 - v1.0.pdf JVM与性能优化知识点整理.pdf JVM面试专题.docx JVM面试专题及答案.pdf Linux系统Redis笔记.docx MongoDB学习笔记.docx mybatis原理....
文件"da"可能是资料的目录或者压缩包中的一个组件,其具体内容无法直接得知,但通常在Java培训资料中,这样的文件可能会包含源代码示例、项目文件、笔记或者讲义。通过这些文件,学习者可以动手实践,加深对理论知识...
"Java解惑.pdf"可能是一份专门解答Java开发中常见问题和困惑的文档。开发者在实际工作中可能会遇到各种难题,这份文档可能会提供清晰的解释和解决方案,帮助他们解决实际问题,提高开发效率。 总的来说,《Java葵花...
【狂神说】JavaSE系列.zip 是一个包含Java标准版(Java Standard...但根据他的教学风格,笔记可能会包含清晰的解释、实例代码和解惑答疑,以帮助学习者快速进步。对于想要自学JavaSE的人来说,这样的资源是非常宝贵的。
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,...
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松copy复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全栈开发),有任何使用问题欢迎随时与我联系,我会及时为您解惑,...
项目工程资源经过严格测试可直接运行成功且功能正常的情况才上传,可轻松复刻,拿到资料包后可轻松复现出一样的项目,本人系统开发经验充足(全领域),有任何使用问题欢迎随时与我联系,我会及时为您解惑,提供帮助...
对于有疑问的用户,博主也提供了私聊的方式进行答疑解惑。 总之,这个项目是一个完整的云笔记应用实例,通过SpringBoot、Spring MVC、Spring Data和JSP等技术,实现了文件共享、笔记创建、编辑和检索等功能。它不仅...
这些资料可能包括教程、讲座笔记、演示文稿或视频课程,旨在帮助学习者快速入门并逐步提升技能。 “查找例子分析学习的好教材”意味着这些资源不仅提供了基础知识,还鼓励学习者通过分析和修改现有的代码示例来提高...
【标题】"binus2021"是一个与Java编程相关的学习...此外,它还可能包含了互动环节,如在线测验或论坛讨论,以便学习者之间交流和答疑解惑。对于Java初学者或希望深入理解Java的开发者来说,这是一个非常宝贵的资源。
例如,`.doc`文件可能是教程或笔记,`.zip`文件可能包含了示例工程,可以下载后进行本地实践。 6. **分布式任务调度的优势**:通过分布式任务调度,可以有效地解决单机调度的局限性,提高任务处理能力,同时支持...
3. 在线学习:用户可以观看视频课程,系统可能还包含笔记记录、进度追踪等辅助学习工具。 4. 互动交流:包括课程讨论区、问答环节,促进用户间的知识分享和答疑解惑。 5. 教师管理:教师可以发布课程、更新教学资源...
笔记 经验 习题答案 应用设计 技术资料 电子大赛 开发板 模块 驱动开发 移动开发 加密解密 压缩解压 编译器/仿真器 多媒体处理 图形图像 游戏 音视频 传感器 连接器 软件 Altium Designer Atmel studio CAD CAM ...
在线答疑解惑:系统支持在线答疑解惑功能,用户可以在平台上提出英语学习中遇到的问题,其他用户或专业教师可以给予解答和建议。 学习任务管理:用户可以制定学习任务并记录学习进度,系统提供任务提醒和学习计划...
(2)资源分享:用户可上传考研资料,如笔记、讲义、模拟试题等,并附带描述和分类。 (3)论坛讨论:用户可以在特定板块发起话题,其他用户可以回复,实现在线讨论。 (4)问答求助:用户可以提出疑问,其他用户或...
- **《Java应该怎么学》的讲课宗旨和学习方法**:详细介绍了学习Java编程的最佳路径,包括基础知识、进阶技术和实战经验等。 ### 就业与职业发展 - **杨中科微软面试分享**:通过一位成功通过微软面试的同学的经历...
2. **编程语言**:如Python、Java、C++等初学者常用的编程语言的基本语法、控制结构、函数和数据类型等。 3. **网络技术**:TCP/IP协议、HTTP协议、网络拓扑结构、网络安全和网络设备等基础知识。 4. **数据库管理**...