我正在使用一个创建线程的Java库,并且该线程内部有一个未捕获的Exception,该异常会传到stdout。
try {
Socket socket = server.accept();
Thread t = new Thread(...);
t.start();
} catch (IOException e) {
// Do noting
}
这个异常最终被输出到stdout是否有意义? 因为在测试中使用库时,我将错误打印到控制台。
我尝试使用以下方式重定向标准输出:
PrintStream original = System.out;
System.setOut(new PrintStream(new OutputStream() {
public void write(int b) {
//DO NOTHING
}
}));
它没有用。我认为这与从库中运行的线程抛出的异常有关。
如何禁止它进入控制台?或将其重定向到其他地方?
编辑:
因此显然打印了异常,因为它们进入了System.err,我在junit类中做了类似的事情
static {
System.setErr(new PrintStream(new OutputStream() {
public void write(int b) {
}
}));
}
它停止了将异常打印到控制台的操作。
我想要的是仅从特定程序包中禁用仅 System.err。
有可能吗?也许使用log4j2.xml?
答案 0 :(得分:0)
为什么不使用log4j,slf4j等?您可以按级别配置基于程序包的日志,然后将其写入所需或忽略的位置。您可以在上面定义任何配置
即使您从一开始就覆盖stdout和stderr(在主目录之上),也应该阻止它们进入控制台
PrintStream printStream4StoppingStdOutAndErr = new PrintStream(new OutputStream() {
@Override
public void write(int b) throws IOException {
//I am stopper for any out writer
}
});
System.setOut(printStream4StoppingStdOutAndErr);
System.setErr(printStream4StoppingStdOutAndErr);
答案 1 :(得分:0)
JUnit的行为是打印未捕获的异常。必须在传递到线程的Runnable.run()
中或使用Thread.setUncaughtExceptionHandler()
我是否认为您通过JUnit运行此代码时看到此行为是正确的?因为这篇文章带有junit标记,但是您在问题中没有提到它。