`

java解惑(谜题41到谜题)

阅读更多
谜题41:域和流
下面的方法实现将一个文件拷贝到另一个文件,但它并非总是能够做到这一点,为什么不能呢?如何修改?
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);
    		}
    	}
    	finally{
    		if(in!=null) in.close();
    		if(out!=null)out.close();
    	}
    }

问题在于finally自身,close方法也可能抛出IOException异常。如果正好发生在in.close()调用之时,就会阻止out.close 的调用,从而使输出流保持在开放状态。注意,该程序违反了谜题36的建议:对close的调用可能会导致finally语句块意外结束。解决方式 是将每一个close都包含在一个嵌套的try语句块中。
谜题42:异常为循环而抛
public class Loop {
	public static void main(String[] args) {
           int[][] tests = {{6,5,4,3,2,1},{1,2},{1,2,3},{1,2,3,4},{1}};
           int count = 0;
           try{
        	   int i =0;
        	   while(true){
        		   if(thirdElemIsThree(tests[i++])) count ++;
        	   }
           }catch(ArrayIndexOutOfBoundsException e){
           }
           
           System.out.println(count);
	}
	private static boolean thirdElemIsThree(int[] a) {

		return a.length>=3 & a[2] ==3;
	}
}

打印出0
这个程序犯了两个错误,第1个错误是该程序使用了一种可怕的循环惯用法。不要使用异常控制循环;应该只为异常条件而使用异常。
为纠正这个错误,将整个try-finally语句块替换为循环遍历数组的标准惯用法:
for(int i = 0;i<tests.length;i++){
  if(thirdElemIsThree(tests[i]))count++;
}
再次运行,会出现java.lang.ArrayIndexOutOfBoundsException异常,因为&运算符要计算两个操作数,改用短路的&&运算符。return a.length>=3 && a[2] ==3;
谜题43:异常的危险
在jdk1.2中,Thread.stop、Thread.suspend以及其他许多线程相关的方法都因为不安全而不推荐使用了。
谜题44:删除类
要想编写一个能够探测类丢失的程序,请使用反射来引用类而不是使用通常的语言结构。如下程序展示了这种技巧:
try{
			Object m = Class.forName("Missing").newInstance();
		}catch(NoClassDefFoundError ex){
			System.err.println("got it!");
		}

总之,不要对捕捉NoClassDefFoundError形成依赖。更一般地讲,捕获Error及其子类型几乎是完全不恰当的。
谜题45:令人疲惫不堪的测试

本谜题测试你对递归的了解程度,下面的程序将做些什么呢?
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异常。但这个程序一直的在循环。因为一般VM将栈的深度限制为1024,因此,调用的数量就是1+2+4+。。。=2^1025-1,而抛出异常的数量是2^1024,没人能看到这个程序终止的时刻。
分享到:
评论

相关推荐

    java解惑 java 表达式谜题 java 字符谜题 java 循环谜题 java 异常谜题

    总结,Java编程中的谜题涵盖了许多方面,从基础语法到高级特性,每一个谜题都是提升编程技巧的机会。通过深入学习和实践,你可以逐一解开这些谜题,成为一名更优秀的Java开发者。不断探索和理解Java的内在机制,将使...

    Java解惑/Java谜题(CHM)

    我整理出来的Java解惑/谜题的CHM版本,包括目录、全文搜索和收藏夹。比目前Word/PDF版本的多个目录,比TXT版本的多一些格式。-- 如果不能打开CHM,请按下面方法解决:-- 右键点击chm文档,查看属性,可以看到...

    java解惑(java谜题)中文版的

    《Java解惑》是一本专为Java程序员设计的书籍,旨在揭示编程中常见的陷阱、误解和易犯的错误。这本书的中文版使得更多的中国开发者能够深入理解这些“谜题”,提高编程技能。Java Puzzlers是由Java之父James Gosling...

    JAVA解惑(JAVA谜题) 中文版(PDF)

    ### JAVA解惑中的关键知识点解析 #### 谜题1:奇数性的判断 在《JAVA解惑》一书中,作者通过一系列实例介绍了Java编程语言中的一些不易掌握的知识点。其中一个例子是关于如何正确判断一个整数是否为奇数。 **原始...

    java解惑 PDF版

    文档《java解惑 PDF版》中列举了95个这样的谜题,每个谜题都旨在帮助开发者理解并纠正一些常见的错误理解。以下是根据提供的部分内容解析的几个相关知识点。 ### 表达式谜题与取余操作符(%)的行为 在Java中,...

    java谜题解惑 中文chm

    在每个谜题之后都有详细的解惑方案,这些方案在给出那些实际行为与表面上迥异的程序行为的简单解释的同时,更向读者展示了如何一劳永逸地避免底层的陷阱与缺陷。 本书以轻松诙谐的语言,寓教于乐的方式,由浅入深、...

    Java解惑(谜题)CHM中英文双版本

    谜题41:域和流 谜题42:异常为循环而抛 谜题43:异常地危险 谜题44:切掉类 谜题45:令人疲惫不堪的测验 Java谜题5——类谜题 谜题46:令人混淆的构造器案例 谜题47:啊呀!我的猫变成狗了 谜题48:我所...

    java解惑 书籍类 谜题

    ### Java解惑 书籍类 谜题 #### Java谜题1——表达式谜题 **谜题1:奇数性** 本节讨论了一个看似简单的Java方法,旨在判断一个整数是否为奇数: ```java public static boolean isOdd(int i) { return i % 2 ==...

    JAVA面试谜题解惑.pdf

    ### JAVA面试谜题解惑知识点解析 #### 表达式谜题:奇数性检查方法的缺陷 **题目背景:** 题目中提到的谜题旨在检验面试者对Java中的基本数学运算符及其行为的理解程度。具体来说,是针对取余运算符`%`在处理整数...

    《Java Pazzlers》Java解惑.pdf 书签齐全

    该书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...

    java解惑(+Java 解惑你知多少)

    本书特写了95个有关Java或其类库的陷阱和缺陷的谜题,其中大多数谜题都采用了短程序的方式,这些程序的行为与其看似的大相径庭。在每个谜题之后都给出了详细的解惑方案,这些解惑方案超越了对程序行为的简单解释,向...

    java谜题解惑 中文版.rar

    java谜题解惑This Fifth Edition is completely revised and expanded to cover JavaScript as it is used in today's Web 2.0 applications. This book is both an example-driven programmer's guide and a keep-...

    java解惑95个谜题.doc

    以下是对这两个Java谜题的深入解析: 谜题1:奇数性 在这个问题中,我们有一个方法`isOdd(int i)`,它通过检查`i % 2`是否等于1来判断一个整数是否为奇数。然而,这个方法在处理负数时会出现问题,因为Java中的取余...

    Javapuzzler+JAVA解惑 中英双语 完整源代码

    《Javapuzzler+JAVA解惑 中英双语 完整源代码》是一份集学习与实践于一体的Java编程资源,包含《Java Puzzlers》和《JAVA解惑》两部分,以及对应的完整源代码。这份资料对于深入理解Java语言的特性和陷阱,提升编程...

    java解惑(源代码+教程)

    《Java解惑》是一本由Google工程师编写的经典教材,旨在帮助开发者解决在实际编程过程中遇到的困惑和误解。这本书通过一系列精心设计的“Java谜题”,揭示了语言中的一些不直观特性和陷阱,从而提升读者对Java深层...

    Java谜题解惑 中文版CHM格式

    Java谜题1——表达式谜题 谜题1:奇数性 下面的方法意图确定它那唯一的参数是否是一个奇数。这个方法能够正确运转吗? public static boolean isOdd(int i){ return i % 2 == 1; } 奇数可以被定义为被2整除余数为...

Global site tag (gtag.js) - Google Analytics