package com.csl.bps.util;
import java.awt.Event;
import java.io.BufferedReader;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.util.HashMap;
import javax.servlet.ServletContextEvent;
public class Reloader implements Runnable{
private boolean firstLoad = true;
private ServletContextEvent eventCopy = null;
private File configFile = null;
private String configFilePath = null;
private HashMap map = null;
private BufferedReader reader = null;
private long lastModifiedTime = 0;
public Reloader(ServletContextEvent event) {
eventCopy = event;
//event.getServletContext().setAttribute("i", new Integer(2));
}
public void run() {
configFilePath = (String)eventCopy.getServletContext().getInitParameter("billRunDetailConfig");
if(configFilePath == null)
{
eventCopy.getServletContext().log("Warning: No bill run detail config file found. Please check the file and restart.");
}
configFile = new File(configFilePath);
if(firstLoad == true)
{
map = createMap(configFile);
lastModifiedTime = configFile.lastModified();
eventCopy.getServletContext().setAttribute("BunRunDetail", map);
eventCopy.getServletContext().log("\n\nFirst load of bill run detail config file. HashMap loaded.\n");
firstLoad = false;
}
else
{
eventCopy.getServletContext().log("\n\nAnother load of bill run detail config file. Checking for the file's last modified time...\n");
if(configFile.lastModified() != lastModifiedTime)
{
map = createMap(configFile);
lastModifiedTime = configFile.lastModified();
eventCopy.getServletContext().setAttribute("BunRunDetail", map);
eventCopy.getServletContext().log("Config file changed. HashMap is hashed again.");
}else
{
eventCopy.getServletContext().log("Config file is not changed.");
}
}
}
private HashMap createMap(File configFile){
HashMap map = null;
try{
reader = new BufferedReader(new FileReader(configFile));
}catch(FileNotFoundException ex){
ex.printStackTrace();
}
return map;
}
}
我想向任何方法的调用者抛出任何异常,但我不能,例如: 我可以这样做:
private HashMap createMap(File configFile) throws FileNotFoundException{
HashMap map = null;
try{
reader = new BufferedReader(new FileReader(configFile));
}catch(FileNotFoundException ex){
//ex.printStackTrace();
throw ex;
}
return map;
}
但在上面:
if(firstLoad == true)
{
map = createMap(configFile);
lastModifiedTime = configFile.lastModified();
eventCopy.getServletContext().setAttribute("BunRunDetail", map);
eventCopy.getServletContext().log("\n\nFirst load of bill run detail config file. HashMap loaded.\n");
firstLoad = false;
}
在map = createMap(configFile)
的行中,我在eclipse中遇到了一个未处理异常的提示错误,但我只能为它添加一个try catch子句。
我希望它将异常抛给它的调用者,并让调用者处理异常,因为如果我在这里返回,我不确定是否所有资源都是关闭的。
为什么它的签名不包含throws子句?是否假设没有产生任何例外?
如果出现异常,并且我用try / catch子句包装它,那么线程会停止并通知父级吗?
答案 0 :(得分:1)
无法在run()方法中添加“throws”子句的原因是runnable接口中定义了run(),并且其签名不包含throws子句。
答案 1 :(得分:1)
当您覆盖方法,实现接口方法或实现抽象方法时,您可以使用包含名称,参数类型和顺序,抛出(完全签名的方法覆盖它。如maaartinus所指出的强>编辑,这仅与已检查的异常相关)(如果存在)和返回类型。如果要实现Runnable,则必须实现run
接口的方法Runnable
。此方法的签名不包含任何throw
,因此您不能使用您的方法覆盖它。
此外,虽然您可以声明两个具有相同名称但具有不同参数的方法,例如:
public int foo(int i);
和
public int foo(String s);
你不能声明两个具有相同名称和参数的方法,这两个方法的区别仅在于它们抛出的内容(maartartin指出的 EDIT ,这仅与已检查的异常相关)或它们返回的内容。例如,你不能同时声明三种方法中的两种:
public int foo();
public boolean foo();
public boolean foo() throws FileNotFoundException;
public boolean foo()抛出FileNotFoundException;
自您实施Runnable
以来,您必须实施public void run()
,而无法实施public void run() throws FileNotFoundException
。
答案 2 :(得分:1)
您不得在声明中添加任何已检查的例外。原因很简单,没有声明异常 promises 的Runnable接口不会被任何Runnable抛出。
我希望它将异常抛给它的调用者,并让调用者处理异常,因为如果我在这里返回,我不确定是否所有资源都是关闭的。
您需要捕获异常,但您可能会抛出另一个未经检查的异常。
try {
...
} catch (FileNotFoundException e) {
throw new MyRuntimeFileNotFoundException(e);
}
这样你就有可能忘记以后再抓住它(因为它没有被声明)。但有时你需要这个。当然,您只能使用throw new RuntimeException(e)
而不是您自己的。{/ p>