0

似乎System.setOut()在这个测试用例中不起作用。

这里是问题描述。

  1. test0执行System.setOut(new PrintStream(byteBuffer))以便它存储标准输出。
  2. test0调用AddChild1_wy_v1.main.
  3. 在 中AddChild1_wy_v1.mainxml.addChild(null)生成异常消息。
  4. 异常消息应该存储在 中byteBuffer,但似乎不是。一旦异常消息弹出,JVM 就会停止运行测试用例。并且之后的剩余代码AddChild1_wy_v1.main不会执行。

jvm有没有办法执行剩余的代码test0

NanoAddChild1_wy_v1Tests.java

package tests;

import junit.framework.TestCase;
import java.io.ByteArrayOutputStream;
import java.io.PrintStream;
import net.n3.nanoxml.*;

public class NanoAddChild1_wy_v1Tests extends TestCase {

    public void test0() throws Exception {      //addchild1.out
        String result;
        ByteArrayOutputStream byteBuffer;

        byteBuffer = new ByteArrayOutputStream();
        System.setOut(new PrintStream(byteBuffer));
        AddChild1_wy_v1.main(new String[] {"/home/junghyun/Dev/nanoxml/inputs/simple.xml"});
        result = new String(byteBuffer.toByteArray());
        assertEquals(result, "Exception in thread \"main\" java.lang.IllegalArgumentException: child must not be null\n\tat net.n3.nanoxml.XMLElement.addChild(XMLElement.java:165)\n\tat AddChild1_wy_v1.main(AddChild1_wy_v1.java:47)\n");
    }
}

AddChild1_wy_v1.java

package tests;

import net.n3.nanoxml.IXMLParser;
import net.n3.nanoxml.IXMLReader;
import net.n3.nanoxml.StdXMLReader;
import net.n3.nanoxml.XMLElement;
import net.n3.nanoxml.XMLParserFactory;
import net.n3.nanoxml.XMLWriter;

public class AddChild1_wy_v1
{

    public static void main(String args[])
        throws Exception
    {
        if (args.length == 0) {
            System.err.println("Usage: java DumpXML file.xml");
            Runtime.getRuntime().exit(1);
        }

        IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
        IXMLReader reader = StdXMLReader.fileReader(args[0]);
        parser.setReader(reader);
        XMLElement xml = (XMLElement) parser.parse();

    xml.addChild (null);
    (new XMLWriter(System.out)).write(xml); 
    }

}

在此处输入图像描述

4

3 回答 3

3

有 3 个默认流:

System.in : InputStream
System.out :PrintStream
System.err :PrintStream

因此,要设置每一个,有 3 种方法:

public static void setIn(InputStream in) {...}
public static void setOut(PrintStream out) {...}
public static void setErr(PrintStream err) {...}

要设置System.err你必须使用System.setErr(yourStream);

对于另一个问题:您只需要使用

try {
    //throwing exception
} catch (Exception e) { 
    //act on exception
}
于 2013-11-01T14:26:46.360 回答
2

将您的方法调用包装在 atry-catch中以继续通过异常:

try {
    AddChild1_wy_v1.main(...);
} catch(Throwable t) {
    t.printStackTrace();
}
// the rest of your code will execute

异常打印到标准错误,而不是标准输出。试试System.setErr

永远不要发布代码的图像。

于 2013-11-01T14:05:46.650 回答
2

在我看来,你根本就没有写过那个异常。

你只要把它往上扔。尝试抓住它并使用 ex.printStackTrace();

除非您另有说明,否则这也会导致标准错误。

根据您的要求,我将保持该test0方法不变,您可以按原样使用它。

AddChild1_wy_v1.java

public class AddChild1_wy_v1    {
    public static void main(String args[]) // note that I don't throw the Exception.
    {
      try {
        if (args.length == 0) {
            System.err.println("Usage: java DumpXML file.xml");
            Runtime.getRuntime().exit(1);
        }

        IXMLParser parser = XMLParserFactory.createDefaultXMLParser();
        IXMLReader reader = StdXMLReader.fileReader(args[0]);
        parser.setReader(reader);
        XMLElement xml = (XMLElement) parser.parse();

        xml.addChild (null);
        (new XMLWriter(System.out)).write(xml); 
      } catch (Exception any) {
        any.printStackTrace(System.out); // note that I send the Stack Trace to standard out here.
      }
    }
}
于 2013-11-01T14:07:29.677 回答