为什么不能声明抛出异常类?

时间:2011-04-28 01:58:44

标签: java

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子句包装它,那么线程会停止并通知父级吗?

3 个答案:

答案 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>