printStackTrace a java.util.logging.Logger
nullpointerexception throwable (8)
¿Cómo imprimo todo el seguimiento de la pila usando java.util.Logger? (sin molestos Netbeans).
La pregunta debería haber especificado originalmente permanecer en Java SE. Omitir ese requerimiento fue un error de mi parte.
-do-compile:
[mkdir] Created dir: /home/thufir/NetBeansProjects/rainmaker/build/empty
[mkdir] Created dir: /home/thufir/NetBeansProjects/rainmaker/build/generated-sources/ap-source-output
[javac] Compiling 13 source files to /home/thufir/NetBeansProjects/rainmaker/build/classes
[javac] /home/thufir/NetBeansProjects/rainmaker/src/model/TelnetEventProcessor.java:44: error: ''void'' type not allowed here
[javac] log.severe(npe.printStackTrace(System.out));
[javac] ^
[javac] 1 error
BUILD FAILED
código con el error:
package model;
import java.util.Observable;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
public class TelnetEventProcessor extends Observable {
private static Logger log = Logger.getLogger(TelnetEventProcessor.class.getName());
private String string = null;
public TelnetEventProcessor() {
}
private void stripAnsiColors() {
Pattern regex = Pattern.compile("//e//[[0-9;]*m");
Matcher regexMatcher = regex.matcher(string);
string = regexMatcher.replaceAll(""); // *3 ??
}
public void parse(String string) {
this.string = string;
ifs();
}
// [/w]+(?=/.)
private void ifs() {
log.fine("checking..");
if (string.contains("confusing the hell out of")) {
Pattern pattern = Pattern.compile("[//w]+(?=//.)"); //(/w+)/.
Matcher matcher = pattern.matcher(string);
String enemy = null;
GameData data = null;
while (matcher.find()) {
enemy = matcher.group();
}
try {
data = new GameData.Builder().enemy(enemy).build();
log.fine("new data object/t/t" + data.getEnemy());
setChanged();
notifyObservers(data);
} catch (NullPointerException npe) {
log.severe(npe.printStackTrace(System.out));
}
} else if (string.contains("Enter 3-letter city code:")) {
log.fine("found enter city code");
} else {
}
}
}
ver también:
https://stackoverflow.com/a/7100975/262852
¿Por qué no pones la excepción en el registrador?
Puedes usar este método:
logger.log(Level level, String msg, Throwable thrown)
Debería redirigir el System.err al registrador, el proceso no es demasiado simple, pero puede usar este código:
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
public class LogOutputStream extends ByteArrayOutputStream {//java.io.OutputStream {
private String lineSeparator;
private Logger logger;
private Level level;
public LogOutputStream(Logger logger, Level level) {
super();
this.logger = logger;
this.level = level;
this.lineSeparator = System.getProperty("line.separator");
}
@Override
public void flush() throws IOException {
String record;
synchronized (this) {
super.flush();
record = this.toString();
super.reset();
if ((record.length() == 0) || record.equals(this.lineSeparator)) {
// avoid empty records
return;
}
this.logger.logp(this.level, "", "", record);
}
}
}
Y el código para establecer esto (que debería llamarse cuando crea el registrador por primera vez
Logger logger = Logger.getLogger("Exception");
LogOutputStream los = new LogOutputStream(logger, Level.SEVERE);
System.setErr(new PrintStream(los, true));
Esto redirigirá la secuencia System.err al registrador.
El método severe
solo se usa para registrar mensajes severos sin información arrojadiza asociada. Si necesita registrar información arrojable, entonces debe usar el método de log
lugar:
try {
data = new GameData.Builder().enemy(enemy).build();
log.fine("new data object/t/t" + data.getEnemy());
setChanged();
notifyObservers(data);
} catch (NullPointerException npe) {
log.log(Level.SEVERE, npe.getMessage(), npe);
}
Usted no imprime explícitamente el seguimiento de la pila; Throwable
s tiene restos de pila unidos a ellos, y puedes pasar un Throwable
a los métodos de registro:
log(Level level, String msg, Throwable thrown)
La excepción se debe a que el método printstacktrace
es void
, lo que significa que no devuelve nada. Estás tratando de hacer:
log.severe(npe.printStackTrace(System.out));
Mi suposición es que el método severe
necesita una String
y no es void
.
También puede intentar usar ExceptionUtils de apache commons
¿Tal vez una pregunta duplicada? Java: necesita un paquete de registro que registre el stacktrace
Debajo de la explicación de la url dada
Usando log4j esto se hace con:
logger.error("An error occurred", exception);
El primer argumento es un mensaje para mostrar, el segundo es la excepción (throwable) cuya stacktrace se registra.
Otra opción es el registro de uso común, donde es lo mismo:
log.error("Message", exception);
Con
java.util.logging
esto se puede hacer a través de:
logger.log(Level.SEVERE, "Message", exception);
Podría usar Apache ExceptionUtils. En tu caso
try {
data = new GameData.Builder().enemy(enemy).build();
log.fine("new data object/t/t" + data.getEnemy());
setChanged();
notifyObservers(data);
} catch (NullPointerException npe) {
logger.info(**ExceptionUtils.getFullStackTrace(npe)**);
}