[英]Is an error message in Java automatically sent to the standard error stream like in Unix-like operating Systems?
在類 Unix 操作系統中,標准錯誤是來自命令行程序的錯誤消息的目的地,標准錯誤的默認目的地是顯示屏。 我假設就像在類 Unix 操作系統中一樣,Java 中的每個命令都分配了三個數據流(即通道):標准輸入、標准輸出和標准錯誤
System.err.println(e);
) 將其發送到標准錯誤流?以下面的一段代碼為例:
ArrayList<String> middleLine = new ArrayList<String>();
int beginIndex = 0;
int endIndex = list.size() - 1;
int middleIndex = (beginIndex + endIndex) / 2;
try {
middleLine.add(lines[middleIndex]);
} catch(Exception e) {
System.err.println(e);
}
middleLine.add(lines[middleIndex]);
拋出異常。 由於 Java 非常慣用,Java 關鍵字throws
暗示異常不會自動發送到標准錯誤流,或者throws
指示異常在標准錯誤輸出數據流中的運動?middleLine.add(lines[middleIndex]);
拋出的異常middleLine.add(lines[middleIndex]);
在到達標准錯誤流之前被捕獲?middleLine.add(lines[middleIndex]);
拋出的異常middleLine.add(lines[middleIndex]);
當它已經在標准錯誤流中時被捕獲? 靜態變量err
的 javadoc 說:
“標准”錯誤輸出流。 此流已打開並准備好接受輸出數據
javadoc 的err
摘錄是否意味着命令System.err.println(e)
將使用catch
命令捕獲的異常 e 發送到標准錯誤流? 那么因為標准錯誤流的目的地默認是顯示屏幕,所以方法println
將錯誤輸出數據發送到標准錯誤流,然后它會自動發送到顯示屏幕?
當我們將錯誤消息作為參數提供給標准錯誤 PrintStream 對象的方法println
時,我們是否必須捕獲錯誤消息(即異常)以便將錯誤消息發送到標准錯誤輸出流? 這意味着當我們使用System.err.println(e)
打印發送到標准錯誤輸出流的錯誤消息時,該消息會顯示在計算機屏幕上,因為標准錯誤流的目的地是顯示屏
catch
命令在標准錯誤輸出流中捕捉到錯誤是不是錯誤信息不再在錯誤流中?catch
命令在錯誤信息進入標准錯誤流之前捕捉到錯誤信息,錯誤信息是否仍然發送到標准錯誤流?System.err.println(e)
是表示自動打印與發送到標准錯誤流的異常匹配的異常 e 還是通過方法的參數打印我們發送到標准錯誤流的異常 e println
?異常只會在沒有被捕獲時打印到 stderr,或者您對其調用 printStackTrace() 。 這是一個小演示,它應該展示一些東西:
public class foo {
public static void main(String[] args) {
System.out.println("This prints to stdout");
System.err.println("This prints to stderr");
int x;
try {
x = 1 / 0;
} catch (ArithmeticException e) {
System.err.println("Printing stack trace to stderr");
e.printStackTrace();
System.err.println("Printing message to stderr");
System.err.println(e.getMessage());
}
try {
x = 1 / 0;
} catch (ArithmeticException e) {
// nothing sent to stderr
}
System.out.println("Un-caught exception will kill program and print stack trace to stderr");
x = 1 / 0;
}
}
...
Erics-MacBook-Pro:tmp redekopp$ javac foo.java
Erics-MacBook-Pro:tmp redekopp$ java foo > foo-stdout.txt 2> foo-stderr.txt
Erics-MacBook-Pro:tmp redekopp$ cat foo-stderr.txt
This prints to stderr
Printing stack trace to stderr
java.lang.ArithmeticException: / by zero
at foo.main(foo.java:8)
Printing message to stderr
/ by zero
Exception in thread "main" java.lang.ArithmeticException: / by zero
at foo.main(foo.java:16)
Erics-MacBook-Pro:tmp redekopp$ cat foo-stdout.txt
This prints to stdout
Un-caught exception will kill program and print stack trace to stderr
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.