当我们有一个自定义异常时,比如SkillRequiredException
,我们检查一些条件,比如检查员工的技能,如果条件失败,我们将抛出SkillRequiredException
。
直到我,我很清楚。
但是我们可以参加FileInputStream
课程。它会抛出FileNotFound
已检查的异常。当我看到FileInputStream
源代码时,我看不到任何地方 - 检查某些条件(和)throw FileNotFoundException
。
我的问题是,JVM如何知道该文件不存在以及JVM创建的异常对象如何在FileNotFoundException
类中使用throw FileNotFoundException
标识为FileInputStream
?
答案 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);
}
}