当我的程序进入关闭挂钩并尝试将设置文件写入文本文档时,会发生此错误。奇怪的是,每次都不会抛出异常。
Exception in thread "Thread-4" java.lang.IllegalStateException: zip file closed
at java.util.zip.ZipFile.ensureOpen(Unknown Source)
at java.util.zip.ZipFile.getEntry(Unknown Source)
at java.util.jar.JarFile.getEntry(Unknown Source)
at java.util.jar.JarFile.getJarEntry(Unknown Source)
at com.crimson.server.JarClassLoader.findJarEntry(JarClassLoader.java:514)
at com.crimson.server.JarClassLoader.findJarClass(JarClassLoader.java:584)
at com.crimson.server.JarClassLoader.loadClass(JarClassLoader.java:956)
at java.lang.ClassLoader.loadClass(Unknown Source)
at com.crimson.universalUtils.Datastore.store(Datastore.java:66)
at com.crimson.server.ServerShutdownHook.run(ServerShutdownHook.java:38)
这是Datastore.store(设置):
public static File set = new File("settings.properties");
public static void store(Settings settings){
set.delete();
try {
set.createNewFile();
PrintWriter pw = new PrintWriter(set);//line 66
pw.println(ObjectTransfer.toString(settings));
pw.close();
} catch (FileNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
我不知道为什么创建PrintWriter调用ClassLoader.loadClass,但这可能是问题所在,因为我正在使用JarClassLoader:http://www.jdotsoft.com/JarClassLoader.php
答案 0 :(得分:1)
我检查了JarClassLoader
的{{3}},问题是JarClassLoader还有一个关闭钩子来关闭jar文件。正如source code所说,它们可以按任何顺序调用,甚至可以并行调用。所以,当你的钩子进入"在JarClassLoader
之前,您的代码有效。如果有点太晚了,你会遇到这个例外。
解决这个问题的方法是确保在调用shutdown hook之前加载PrintWriter
类。