2013-06-17 2 views
-7

Мне нужно объявить PrintWriter вне метода 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! 
} 
} 
+1

переменные класса google java – JIV

+0

Да, что именно вы хотите от SO? – NINCOMPOOP

+1

Вы имеете в виду 'метод' от 'void'? – Sorin

ответ

-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! 
} 
} 
+0

То, что я посоветовал бы мне помочь, но он выдает ошибку Исключение в теме "main" java.lang .Error: Неразрешенные проблемы компиляции: \t Конструктор по умолчанию не может обрабатывать тип исключения FileNotFoundException, созданный неявным супер-конструктором. Должен определить явный конструктор \t Конструктор по умолчанию не может обрабатывать тип исключения UnsupportedEncodingException, созданный неявным супер-конструктором. Должен определить явный конструктор \t at com.donemanuel.DSDK.LogKit. (LogKit.java:15) \t at com.donemanuel.DSDK.Console. (Console.java:13) \t at com.donemanuel.DSDK.Launcher.main (Launcher.java:9) – donemanuel

+0

wait, я внесу изменения и попробую. –

+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 с этим ключевым словом.

С уважением.

0

Что вы подразумеваете под «пустотой»?

В приведенном выше коде вы не можете получить доступ к переменной logd из метода «custommessage (String)», поскольку в этой области нет переменной с этим именем. Если у вас есть проблема с доступом к переменной с тем же именем, которое вы определили в метод 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."); 
    } 
    } 
} 
0

Проблема в вашем случае, является то, что вы пытаетесь инициализировать поле таким образом, что может бросить исключение , И вам нужно предоставить некоторый контекст о том, как можно обрабатывать это исключение.

Если бы не было, за исключением, вы можете инициализировать поля просто, например:

public class LogKit { 
    private int i = 0; // this initialises fine 

    void openLog() { 
     ... 
    } 
} 

Однако конструктор PrintWriter бросает исключение. И поэтому код, который запускает это, должен либо поймать исключение, либо объявить его брошенным. В настоящее время вы создаете PrintWriter в своем методе openLog, и этот метод объявляет 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"); 
    } 
} 

Это вероятно, лучший подход - создав автора в конструкторе, он гарантированно будет определен для всего жизненного цикла класса.

Если по какой-либо причине вы не можете иметь дело с конструктором, бросающим исключение, тогда вам нужно отложить создание поля до конца. В этом случае каждый бит кода, который ссылается на logd, должен иметь в виду, что он может быть null, если он еще не назначен.Что должно делать custommessage, если оно вызвано до openLog? Вам нужно подумать о разных состояниях класса, поэтому это сложнее. Но в некоторых случаях этот подход «жизненного цикла» является единственным жизнеспособным.

+0

'custommessage' не может быть вызван до' openlog', потому что 'openlog' вызывается в основном классе при запуске программы! Если он будет вызван до того, как у меня появится ErrorKit, который выведет ошибку со всеми подробностями, мне нужно будет исправить эту проблему! Также этот 'ErrorKit''LogKit''SoundKit' является лишь частью моего SDK, я делаю это, чтобы помочь моим друзьям изучать Java и упрощать их вызов звуками, ошибками, журналами, консолью ... и такими – donemanuel

+0

@donemanuel - Конечно, 'custommessage' не может быть вызван до' openlog' * в данный момент *. Но через год, когда ваш «LogKit» будет использоваться в разных местах разными битами кода, и вы используете какой-то абстрактный механизм настройки, будет ли это все еще верно? Всегда возможно, чтобы звонящие использовали ваши классы в «неправильном» способе, и вам нужно подумать о том, что делать в этих случаях, даже если это так же просто, как «Я добавлю документацию, в которой говорится, что вы не должны этого делать , и пусть это сбой с «NullPointerException», если кто-то делает ». –

Смежные вопросы