在方法外声明PrintWriter

时间:2013-06-17 09:26:45

标签: java

我需要在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!
}
}

4 个答案:

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