java解惑中的—異常,簡單程序,但容易錯
下面三個程序每一個都會打印些什么? 不要假設(shè)他們都可以編譯通過:
第一個程序:
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!");
}
}
}
第二個程序:
第三個程序:
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();
}
}
分析第一個程序:
看起來應(yīng)該會打印出hello lsbwahaha,這個程序不能編譯,因為pringln犯法沒有會拋出任何受檢查異常,
而IOException 卻正是一個受檢查異常。
語言規(guī)范中描述:如果一個catch子句要捕獲一個類型為E的受檢查異常,而其相對應(yīng)的try子句不能拋出E的某種子類型的異常,
那么這就是一個編譯期錯誤。
分析第二個程序:
基于第一個程序,那么第二個程序應(yīng)該不可以編譯,但是它卻可以。它之所以可以編譯,是因為它唯一的catch子句檢查了Exception
捕獲Exception或Throwable的catch子句是合法的,不管于其相對應(yīng)的try子句的內(nèi)容為何。 這個程序什么都不會打印。
分析第三個程序:
看起來它也不能編譯。 如果它能編譯,那是為什么呢?
結(jié)果居然能編譯通過。。。。 這個到底是為什么呢?、、、、、、、
Type3 中 因為每一個接口都限制了方法f可以拋出的受檢查異常集合。一個方法可以拋出的受檢查異常集合是它所適用的所有類型聲明
要拋出的受檢查異常交集,而不是并集。
第一個程序:











第二個程序:
1
public 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
}

2

3

4

5

6

7

8

9

第三個程序:



















分析第一個程序:
看起來應(yīng)該會打印出hello lsbwahaha,這個程序不能編譯,因為pringln犯法沒有會拋出任何受檢查異常,
而IOException 卻正是一個受檢查異常。
語言規(guī)范中描述:如果一個catch子句要捕獲一個類型為E的受檢查異常,而其相對應(yīng)的try子句不能拋出E的某種子類型的異常,
那么這就是一個編譯期錯誤。
分析第二個程序:
基于第一個程序,那么第二個程序應(yīng)該不可以編譯,但是它卻可以。它之所以可以編譯,是因為它唯一的catch子句檢查了Exception
捕獲Exception或Throwable的catch子句是合法的,不管于其相對應(yīng)的try子句的內(nèi)容為何。 這個程序什么都不會打印。
分析第三個程序:
看起來它也不能編譯。 如果它能編譯,那是為什么呢?
結(jié)果居然能編譯通過。。。。 這個到底是為什么呢?、、、、、、、
Type3 中 因為每一個接口都限制了方法f可以拋出的受檢查異常集合。一個方法可以拋出的受檢查異常集合是它所適用的所有類型聲明
要拋出的受檢查異常交集,而不是并集。
posted on 2009-04-07 20:51 胡鵬 閱讀(200) 評論(0) 編輯 收藏 所屬分類: java基礎(chǔ)