2015-01-07 107 views
4

當我們有一個自定義例外,比如SkillRequiredException,我們檢查一些條件,比如檢查員工的技能,如果條件失敗,我們會拋出SkillRequiredException。直到這我很好,清楚。如何將Exceptional對象轉換爲Java checked Exception之一?

但是讓FileInputStream類。它拋出FileNotFound檢查異常。當我看到FileInputStream源代碼時,我看不到任何地方 - 檢查某些條件(和)throw FileNotFoundException

我的問題是,JVM如何知道該文件不存在以及由JVM創建的Exceptional Object如何識別爲FileNotFoundException而不使用throw FileNotFoundExceptionFileInputStream類中?

回答

7

好吧,如果你檢查哪些方法是由FileInputStream構造函數調用時,你會看到,它最終調用:

private native void open(String name) throws FileNotFoundException; 

這是一個本地方法,這意味着它不是用Java編寫的,你不能看到它的代碼,但它仍然可以拋出一個FileNotFoundException異常。

+0

我現在能理解葉蘭。謝謝 – Sanjeevan

0

在的FileInputStream你會發現這樣的代碼:

public FileInputStream(File file) throws FileNotFoundException { 
     ... 
     open(name); 
} 

和開放的定義:

/* 
* Opens the specified file for reading. 
* @param name the name of the file 
*/ 
private native void open(String name) throws FileNotFoundException; 

你可以很容易地檢查你的JDK如何使用JNI根據您的操作系統來執行此操作, Windows使用OpenJdk的例子,你可以在io_util_md.c中找到這段代碼(complete source):

if (h == INVALID_HANDLE_VALUE) { 
    int error = GetLastError(); 
    if (error == ERROR_TOO_MANY_OPEN_FILES) { 
     JNU_ThrowByName(env, JNU_JAVAIOPKG "IOException", 
         "Too many open files"); 
     return -1; 
    } 
    throwFileNotFoundException(env, path); 
    return -1; 
} 

你可以檢查throwFileNotFoundException的io_util.c(complete code)執行:

void 
throwFileNotFoundException(JNIEnv *env, jstring path) 
{ 
    char buf[256]; 
    jint n; 
    jobject x; 
    jstring why = NULL; 

    n = JVM_GetLastErrorString(buf, sizeof(buf)); 
    if (n > 0) { 
     why = JNU_NewStringPlatform(env, buf); 
    } 
    x = JNU_NewObjectByName(env, 
          "java/io/FileNotFoundException", 
          "(Ljava/lang/String;Ljava/lang/String;)V", 
          path, why); 
    if (x != NULL) { 
     (*env)->Throw(env, x); 
    } 
} 
+0

非常感謝帕特里克的解釋 – Sanjeevan