Noob问题。
坚持以下代码。获取“默认构造函数无法处理由隐式超级构造函数抛出的异常类型IOException。必须为粗体行定义显式构造函数”错误
私有FileWriter fileWriter = 新FileWriter(文件); 具体来说,我的问题是.....我如何为文件编写者创建一个显式的构造函数?
第二期:我知道方法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");
}
}
}
答案 0 :(得分:1)
由于行可能导致异常,您必须在您的类(Logging
)的构造函数中初始化它,并且执行正确的异常处理,而不是FileWriter
!
您不能在可能导致异常的隐式构造函数中使用代码。
重新考虑何时创建日志文件。例如,在文件尚未打开时调用createLogFile。
答案 1 :(得分: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)会更合适。
答案 2 :(得分:0)
看起来你只是为你的应用程序制作一个记录器,但我建议使用像Log4j
这样的开源日志记录库或者一个propper日志库,而不是重新创建已经存在的东西(并且经常受支持)。
Short introduction to log4j: Ceki Gülcü, March 2002
用法:
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
下载:here