0

菜鸟问题。

坚持以下代码。获取“默认构造函数无法处理由隐式超级构造函数抛出的异常类型 IOException。必须定义显式构造函数”粗体行错误

私有 FileWriter fileWriter = new FileWriter(file); 具体来说,我的问题是.....我如何为文件编写器创建一个显式构造函数?

第二个问题:我知道 appendtoLog 方法不正确。我只希望此方法执行 bufferWriter.write(logInfo) 但为此我需要调用已创建的 bufferWriter 对象。但是如您所见,我已在另一种方法中对其进行了实例化,以防止其可用于 appendtolog 方法。请在我的方法中提出解决方案或错误。

有什么帮助吗?谢谢。

import java.text.DateFormat;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.io.File;
import java.io.FileWriter;
import java.io.BufferedWriter;
import java.io.IOException;

 public class Logging {


private DateFormat dateFormat = new SimpleDateFormat("MM-dd-yyyy");
private Date date = new Date();
private File file = new File("c:\\view\\" + dateFormat.format(date) + "\\"
        +"\\SmokesLog.txt");
private FileWriter fileWriter = **new FileWriter(file);**

public void createLogFile() throws Exception {
try{
if(!file.exists()){
    file.createNewFile();
    System.out.println("file name is "+ file.getName());
      BufferedWriter bufferWriter = new BufferedWriter(new     
  FileWriter(file.getName(),true));
       bufferWriter.write("Log Started for Test");
}
    } catch (IOException e) {
            System.out.println("code failed in creating logfile");
    }

}

public void appendToLog(String logInfo) throws IOException {
    System.out.println("code got to appendToLog method");
    // below does not append.need to find better method.
    if (file.exists()) {
        BufferedWriter bufferWriter = new BufferedWriter(fileWriter);
        bufferWriter.write(logInfo);
        System.out.println("Done");
    }
}
}
4

3 回答 3

1

正如人们所说,这是因为创建 FileWriter 会引发异常。虽然我确实建议使用 Logger 包,但这里有一种方法可以克服这个问题:

使用显式构造函数,捕获异常,并很可能将其重新抛出并包装在 RuntimeException 中。

private FileWriter fileWriter;

public Logging() {
    super();
    try {
       fileWriter = new FileWriter(file);
    }
    catch (IOException e) {
       throw new RuntimeException(e);
    }
}

或者使用实例初始化程序块,它在构造函数中对 super() 的任何调用之后执行,但在构造函数中的任何其他代码之前执行。在您的情况下,如果您没有构造函数,则会调用隐式 super() ,这没关系,因为您正在扩展 Object. 因此初始化程序块在此之后立即执行。所以下面的代码在功能上几乎等同于上面的代码。

private FileWriter fileWriter;
{
    try {
       fileWriter = new FileWriter(file);
    }
    catch (IOException e) {
       throw new RuntimeException(e);
    }
}

正如我所说,我不建议这样做,真正的日志记录包(slf4j + log4j)会更合适。

于 2012-08-16T03:14:39.583 回答
1

由于该行可能会导致异常,因此您必须在类的构造函数中对其进行初始化Logging执行正确的异常处理,而不是FileWriter

您不能在可能导致异常的隐式构造函数中使用代码。

重新考虑何时创建日志文件。例如,当文件尚未打开时调用 createLogFile。

于 2012-08-16T01:23:35.983 回答
0

看起来您只是为您的应用程序制作了一个记录器,但我建议您使用开源日志库,例如Log4j或 propper 日志库,而不是重新创建已经存在的东西(并且经常支持)。

log4j 简介:Ceki Gülcü,2002 年 3 月

用法:

BasicConfigurator.configure();

Logger logger = Logger.getLogger("Foo");

logger.debug("Hello World");
logger.warn("it's me");

输出:Thread Number Logging Option Class Output

0 [main] DEBUG Foo  - Hello World
1 [main] WARN Foo  - it's me

下载:这里

于 2012-08-16T01:30:25.810 回答