我需要在openLog方法之外声明PrintWriter,所以我可以从多个方法访问它,因为这样我只能在一个方法内部访问PrintWriter,但是我无法从其他方法访问它!
package com.donemanuel.DSDK;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogKit {
void openLog() throws IOException{
Date ltm = new Date( );
SimpleDateFormat lt = new SimpleDateFormat ("'['dd.MM hh:mm:ss a']: '");
final String logtm = lt.format(ltm);
PrintWriter logd = new PrintWriter("res/LOGTIME_"+logtm, "UTF-8");
String prefix = "[Logger]:";
logd.println(prefix + "DSDK Logger opened!");
logd.println("----------xXx----------");
logd.flush();
}
void custommessage(String logmsg){
logd.println(logmsg); //I want to print custom messages with my API, but log is declared in another void so thats the problem.
//If i would declare logd (printwriter) outside a void it would give me an error!
}
}
答案 0 :(得分:0)
在java中,您可以用这种方式声明类的“变量”(称为“属性”或“字段”):
public class YourClass {
PrintWriter logd = new PrintWriter("path/file", "UTF-8");
void openLog() throws IOException{
//your code that uses "logd" here
}
void custommessage(String logmsg){
//your other code that uses "logd" here
}
}
有关类的属性初始化以及类构造函数的更多信息,请尝试将google与这些关键字一起使用。
问候。
答案 1 :(得分:0)
你对“虚空”有什么意思?
在上面的代码中,您无法从“custommessage(String)”方法访问logd变量,因为范围中没有此名称的变量。 如果您遇到的问题是访问与您在“openLog()”方法中定义的名称相同的变量,只需创建一个新属性即可。使用logd变量引用的对象设置此属性,然后将此属性用于“custommessage(String)”。
样品:
public class AttributeSample {
private Object myAttribute = null;
public void init() {
myAttribute = new Object();
}
public void doSomething() {
if (myAttribute != null) {
System.out.println(myAttribute);
} else {
throw new RuntimException("Oups ! You must call init() before.");
}
}
}
答案 2 :(得分:0)
在您的情况下,问题是您尝试以可能引发异常的方式初始化字段。并且您需要提供有关如何处理此异常的一些上下文。
如果不是例外,您可以简单地初始化字段,例如:
public class LogKit {
private int i = 0; // this initialises fine
void openLog() {
...
}
}
但是,PrintWriter
的构造函数会抛出异常。因此运行它的代码必须捕获异常,或声明它被抛出。目前,您正在openLog
方法中创建PrintWriter,此方法声明throws IOException
,因此编译器很高兴。但当你把它移出时,没有这样的条款。
具有初始化程序的字段实际上是在(自动生成的)构造函数中运行的。我上面给出的例子实际上与:
相同public class LogKit {
private int i;
public LogKit() {
i = 0;
}
void openLog() {
...
}
}
所以解决这个问题的一种方法是自己声明构造函数,这允许你指定它可能抛出异常:
public class LogKit {
PrintWriter logd;
public LogKit() throws IOException {
Date ltm = new Date( );
SimpleDateFormat lt = new SimpleDateFormat ("'['dd.MM hh:mm:ss a']: '");
logd = new PrintWriter("res/LOGTIME_"+logtm, "UTF-8");
}
}
这可能是最好的方法 - 通过在构造函数中创建writer,可以保证在类的整个生命周期内定义它。
如果由于某种原因,你无法处理抛出异常的构造函数,那么你需要将该字段的创建推迟到以后。在这种情况下,引用logd
的每一段代码都必须记住,如果尚未分配它,它可能是null
。如果在custommessage
之前调用它,openLog
会怎么做?你需要考虑班级的不同状态,这就是为什么这更复杂。但在某些情况下,这种“生命周期”方法是唯一可行的方法。
答案 3 :(得分:-1)
在代码中进行如下更改
package com.donemanuel.DSDK;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;
import java.text.SimpleDateFormat;
import java.util.Date;
public class LogKit {
PrintWriter logd ;
void openLog() throws IOException{
Date ltm = new Date( );
SimpleDateFormat lt = new SimpleDateFormat ("'['dd.MM hh:mm:ss a']: '");
final String logtm = lt.format(ltm);
logd = new PrintWriter("res/LOGTIME_"+logtm, "UTF-8");
String prefix = "[Logger]:";
logd.println(prefix + "DSDK Logger opened!");
logd.println("----------xXx----------");
logd.flush();
}
void custommessage(String logmsg) throws IOException{
logd.println(logmsg); //I want to print custom messages with my API, but log is declared in another void so thats the problem.
//If i would declare logd (printwriter) outside a void it would give me an error!
}
}