java解惑中的—异常,简单程序,但容易错

 下面三个程序每一个都会打印些什么? 不要假设他们都可以编译通过:

第一个程序:
import java.io.IOException;

public class Arcane1 {
    
public static void main(String[] args) {
        
try{
            System.out.println(
"hello lsbwahaha");
        }
catch(IOException e){
            System.out.println(
"I've never seen println fail!");
        }

    }

}


第二个程序:
1public class Arcane2 {
2    public static void main(String[] args) {
3        try{
4            //you have noting nice to say
5        }
catch(Exception e){
6            System.out.println("this can't happen");
7        }

8    }

9}


第三个程序:

interface Type1{
    
void f() throws CloneNotSupportedException;
}


interface Type2{
    
void f() throws InterruptedException;
}


interface Type3 extends Type2,Type1{}

public class Arcane3 implements Type3 {
    
public void f(){
        System.out.println(
"hello lsbwahaha");
    }

    
public static void main(String[] args) {
        Type3 t3 
= new Arcane3();
        t3.f();
    }

}


分析第一个程序:
        看起来应该会打印出hello lsbwahaha,这个程序不能编译,因为pringln犯法没有会抛出任何受检查异常,
而IOException 却正是一个受检查异常。
语言规范中描述:如果一个catch子句要捕获一个类型为E的受检查异常,而其相对应的try子句不能抛出E的某种子类型的异常,
那么这就是一个编译期错误。


分析第二个程序:
    基于第一个程序,那么第二个程序应该不可以编译,但是它却可以。它之所以可以编译,是因为它唯一的catch子句检查了Exception
   捕获Exception或Throwable的catch子句是合法的,不管于其相对应的try子句的内容为何。  这个程序什么都不会打印。


分析第三个程序:
   看起来它也不能编译。 如果它能编译,那是为什么呢?
 结果居然能编译通过。。。。  这个到底是为什么呢?、、、、、、、
     Type3 中 因为每一个接口都限制了方法f可以抛出的受检查异常集合。一个方法可以抛出的受检查异常集合是它所适用的所有类型声明
要抛出的受检查异常交集,而不是并集。




posted on 2009-04-07 20:51 胡鹏 阅读(184) 评论(0)  编辑  收藏 所属分类: java基础


只有注册用户登录后才能发表评论。


网站导航:
 

导航

<2009年4月>
2930311234
567891011
12131415161718
19202122232425
262728293012
3456789

统计

常用链接

留言簿(3)

随笔分类

随笔档案

agile

搜索

最新评论

阅读排行榜

评论排行榜