2016-03-22 3 views
0

私はprintln()メソッドのコンセプトで少し疑問に思っています。PrintStream.println()の動作 - Java/Python/Any言語

私は、次のコードを試してみました:予想される出力であり、実際に、私は時々これを取得

Object one = 1; 
System.out.println(one); 

one = "String"; 
System.out.println(one); 

one = null; 

System.out.println(one.toString()); // To explicitly throw an Exception 

を:しかし、複数回実行している

1 
String 
Exception in thread "main" java.lang.NullPointerException 
    at MainClass.main(MainClass.java:18) <5 internal calls> 

、我々としても、次の出力を見ることができます:

1 
Exception in thread "main" java.lang.NullPointerException 
    at MainClass.main(MainClass.java:18) <5 internal calls> 
String 

または

Exception in thread "main" java.lang.NullPointerException 
    at MainClass.main(MainClass.java:18) <5 internal calls> 
1 
String 

次に、私はPythonで同様の操作を行うことを考えました。以下はスニペットです:

var = 'Hello'; 
print var; 
var = 6; 
print var; 
del var; 
print var; 

はい、同様の動作です。トレースバックメッセージの出力プリファレンスを特定できません。場合によっては、上部に、時には中央に、時には下部に印刷されます。

​​バッファ出力に関するものでなければならないと思います。確かに、それは可能性があります。

誰でもこのコンセプトを手に入れることができますか?

答えて

1

これは、2つの出力ストリームSystem.outSystem.errがあり、それらが調整されていないか、常に順番になっているためです。

あなたは何をすべき

Object one = 1; 
System.err.println(one); 

Object one = "String"; 
System.err.println(one); 

one = null; 

System.out.println(one.toString()); 

または

Object one = 1; 
System.out.println(one); 

Object one = "String"; 
System.out.println(one); 

one = null; 

try { 
    System.out.println(one.toString()); 
} catch (Exception e) { 
    e.printStackTrace(System.out); 
} 

を行うことができますロガーを使用しています。ロガーはSystem.outまたはSystem.errのいずれかにすべてを書き込むように設定されているので、予測可能な出力を得ることができます。

私はそれが同期バッファ出力に関係するものでなければならないと思う。

System.outSystem.errの両方が同期しています。同じオブジェクトではないので、同じロックを使用しませんが、2つのストリームに書き込むストリームを任意の順序で読み取ることができるため、これは問題にはなりません。

+0

しかし、それは 'out'ストリームから' err'ストリームにジャンプしますか?明示的に 'System.out.println'を使用しました。 – cprakashagr

+0

'try catch'ブロックを適用すると、' out'ストリームから 'err'ストリームに移動できなくなりますか? – cprakashagr

+0

@cprakashagr 'out'と' err'は2つの別々のストリームであり、一方は他方にジャンプしません。これらは両方ともコンソールに表示されます。私はあなたが 'System.out.println'を使っているのを見ることができます。私は最初の例で' System.err.println'を使っています。 –

関連する問題