2013-11-01 2 views
0

Похоже, что System.setOut() не работает в этом тестовом примере.Java - System.setOut не сохраняет сообщение об ошибке

Описание проблемы.

  1. test0 выполняет System.setOut(new PrintStream(byteBuffer)), так что он сохраняет стандартный выход.
  2. test0 вызывает AddChild1_wy_v1.main.
  3. В AddChild1_wy_v1.main, xml.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); 
    } 

} 

enter image description here

+1

пожалуйста Почтовый код в виде текста, таким образом можно скопировать и вставить его в ответ. Изображение не так хорошо. –

+0

Прошу прощения. Я закончил редактирование. –

+1

отлично! Теперь я использовал ваш код в своем ответе. Я также отредактировал ваш вопрос так, как ожидается здесь, на SO. –

ответ

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. 
     } 
    } 
} 
+0

Фактически, этот тестовый пример сделан другими людьми в 2005 году. Я хотел бы оставить коды неизменными. Как вы думаете, любая старая версия jvm может запустить этот тестовый пример без ошибок? –

+1

@Junghyun Да, никаких проблем. См. Мое редактирование. –

+1

@Junghyun Это не имеет никакого отношения к jvm. Этот код будет действовать одинаково во всех версиях Java с самого начала. –

1

Оберните вызов метода в try-catch продолжить прошлое, за исключением:

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

Исключения печатаются по стандартной ошибке, а не по стандартным выводам. Попробуйте System.setErr.

Никогда не размещайте изображения своего кода.

+0

Не могли бы вы ответить на вопрос, который я написал в ответ Анджело, если вы знаете что-нибудь об этом? Благодарю. –

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 
} 
Смежные вопросы