java nullpointerexception java.util.logging throwable printstacktrace

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 .



¿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)**); }