printStackTrace到java.util.logging.Logger

Thu*_*fir 32 java nullpointerexception throwable java.util.logging printstacktrace

如何使用 java.util.Logger 打印整个堆栈跟踪?(没有恼人的Netbeans).

该问题应该最初指定保留 Java SE中.省略这个要求对我来说是一个错误.

-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
Run Code Online (Sandbox Code Playgroud)

代码有错误:

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 {
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

也可以看看:

/sf/answers/497068281/

M. *_*bas 50

severe方法仅用于记录严重消息而没有相关的可抛出信息.如果您需要记录throwable信息,那么您应该使用该log方法:

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);
}
Run Code Online (Sandbox Code Playgroud)

  • 这个答案的唯一问题是它相当冗长 - 但这对你来说就是Java! (2认同)

Mic*_*gue 10

你为什么不把这个例外放在记录器中?

您可以使用此方法:

logger.log(Level level, String msg, Throwable thrown) 
Run Code Online (Sandbox Code Playgroud)


小智 9

也许一个重复的问题?Java - 需要一个记录堆栈跟踪的日志包

下面是给定网址的解释

使用log4j,这可以通过以下方式完成:

logger.error("An error occurred", exception);
Run Code Online (Sandbox Code Playgroud)

第一个参数是要显示的消息,第二个参数是异常(throwable),其堆栈跟踪被记录.

另一个选项是commons-logging,它是相同的:

log.error("Message", exception);
Run Code Online (Sandbox Code Playgroud)

有了java.util.logging 这可以通过这样做:

logger.log(Level.SEVERE, "Message", exception);
Run Code Online (Sandbox Code Playgroud)


chr*_*ke- 7

您没有显式打印堆栈跟踪; Throwables附加了堆栈跟踪,您可以传递Throwable给日志方法:

log(Level level, String msg, Throwable thrown)
Run Code Online (Sandbox Code Playgroud)