我正在为一个名为Max/MSP的封闭源代码应用程序编写插件。要使用Max/MSP,我的代码需要扩展供应商提供的一个类(com.cycling74.max.MaxObject)。此类覆盖了System.err,因此对System.err.println的调用可以将消息定向到应用程序提供的特殊错误日志。
这种行为在部署中很好,但在测试过程中就会出现问题。我目前正在尝试编写一个测试套件,以便在宿主应用程序之外运行我的代码。当我这样做时,调用System.err会引发异常,因为应用程序的错误日志不可用。
有没有人知道我如何“撤销”Max/MSP的错误重定向,这样在测试期间,对System.err.println的调用就会出现在java控制台中?
编辑
我尝试了@MadProgrammer的建议,在创建Max对象之前缓存对错误PrintStream的引用。
import com.cycling74.max.*;
public class MyMaxObject extends MaxObject{
public MyMaxObject(){}
public static void main(String[] args){
PrintStream oldError = System.err;
MyMaxObject o = new MyMaxObject();
System.setErr(oldError);
}我不能让这个起作用。当我在调试器中运行这段代码时,我发现System.err在我的main方法的第一行有com.cycling74.io.ErrorStream类型。因此,到那时,重定向似乎已经发生了。如果是这种情况,我如何在错误流被重定向之前获得对它的引用?(如果不是放在Main的顶部,我到底该把代码放在哪里呢?)
编辑2
好了,我想通了。我只需要将我的测试代码(例如上面的Main方法)移到一个单独的类中。一旦我这样做了,@MadProgrammer的解决方案就完美地工作了。
发布于 2012-09-16 05:56:46
首先,您需要在重定向之前引用System.err。
PrintStream oldError = System.err;一旦你初始化了MaxObject (或者系统的任何部分覆盖了System.err,你需要重新分配引用...
System.setErr(oldError);https://stackoverflow.com/questions/12442731
复制相似问题