错误发生后,我需要将错误消息存储在字符串中。我无法使用 try 和 catch 块,因为运行初始代码后会出现错误。
在我使用以下代码将错误消息存储在出现时的文件之前:
PrintStream printS = new PrintStream("file.txt");
System.setErr(pst);
但是我想存储它和一个字符串,并在发生错误后将这个字符串发送到其他地方。我已经尝试使用字节数组输出流:
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
PrintStream printS = new PrintStream(byteArray);
System.setErr(pst);
String tester = byteArray.toString(StandardCharsets.UTF_8);
但是当我尝试打印字符串时,它是空的并且不包含错误。有谁知道如何在发生错误后运行代码,以便我可以将此错误消息发送到其他地方?
Java 只是在现场运行代码,你并没有为将来定义触发器。您正在创建一个新的空字节数组输出流,将其设置为以后任何System.err
调用的"目标",然后立即将其转换为字符串。当然,此时它仍然是空白的。
你想要的非常复杂 - 你必须编写一个自定义的PrintStream来保存发送给它的任何内容,直到它"看到"一个换行符然后采取行动。像这样:
OutputStream myCustomReportingStream = new OutputStream() {
ByteArrayOutputStream buffer = new ByteArrayOutputStream();
@Override public void write(int b) {
if (b == 'r') continue;
if (b == 'n') {
process(new String(buffer.getBytes(), StandardCharsets.UTF_8));
buffer.reset();
} else {
buffer.write(b);
}
}
private void process(String message) {
// YOUR CODE HERE
}
};
System.setErr(new PrintStream(myCustomreportingStream, true, StandardCharsets.UTF_8));
这里正在发生很多事情:
我们正在定义一个自定义 OutputStream,它会缓冲发送给它的所有内容,直到它看到
n
(在 ASCII、UTF-8 和许多其他编码中是"换行符"),此时它将缓冲区转换为字符串,将该字符串发送到process
方法,并清除缓冲区。它还忽略r
来处理rn
即窗口样式换行符。
然后,我们使用该输出流作为新打印流的基础,然后设置 syserr 以使用此打印流。
此代码不处理将数据发送到 System.err 但不发送换行符的任何内容。
任何人随时随地运行
System.err.println
,您的process()
方法都将运行。