如何将Exceptional对象转换为Java检查过的Exception之一?

时间:2015-01-07 13:56:46

标签: java exception-handling

当我们有一个自定义异常时,比如SkillRequiredException,我们检查一些条件,比如检查员工的技能,如果条件失败,我们将抛出SkillRequiredException。 直到我,我很清楚。

但是我们可以参加FileInputStream课程。它会抛出FileNotFound已检查的异常。当我看到FileInputStream源代码时,我看不到任何地方 - 检查某些条件(和)throw FileNotFoundException

我的问题是,JVM如何知道该文件不存在以及JVM创建的异常对象如何在FileNotFoundException类中使用throw FileNotFoundException标识为FileInputStream

2 个答案:

答案 0 :(得分:7)

好吧,如果你检查FileInputStream的构造函数调用哪些方法,你会看到它最终调用:

private native void open(String name) throws FileNotFoundException;

这是一种原生方法,这意味着它不是用Java编写的,你无法看到它的代码,但它仍然会抛出FileNotFoundException异常。

答案 1 :(得分:0)

在FileInputStream中,您可以找到以下代码:

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

和open定义:

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

您可以根据您的操作系统轻松检查您的jdk如何使用jni执行此操作,例如对于使用OpenJdk的Windows,您可以在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;
}

你可以在io_util.c(complete code)中检查throwFileNotFoundException的实现:

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);
    }
}