簡體   English   中英

Java 中的錯誤消息是否會像在類 Unix 操作系統中一樣自動發送到標准錯誤流?

[英]Is an error message in Java automatically sent to the standard error stream like in Unix-like operating Systems?

在類 Unix 操作系統中,標准錯誤是來自命令行程序的錯誤消息的目的地,標准錯誤的默認目的地是顯示屏。 我假設就像在類 Unix 操作系統中一樣,Java 中的每個命令都分配了三個數據流(即通道):標准輸入、標准輸出和標准錯誤

  1. 在 Java 中也是如此嗎? 也就是說,在 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);
}
  1. 命令middleLine.add(lines[middleIndex]); 拋出異常。 由於 Java 非常慣用,Java 關鍵字throws暗示異常不會自動發送到標准錯誤流,或者throws指示異常在標准錯誤輸出數據流中的運動?
  2. 是命令middleLine.add(lines[middleIndex]);拋出的異常middleLine.add(lines[middleIndex]); 在到達標准錯誤流之前被捕獲?
  3. 或者是命令middleLine.add(lines[middleIndex]);拋出的異常middleLine.add(lines[middleIndex]); 當它已經在標准錯誤流中時被捕獲?

靜態變量err的 javadoc 說:

“標准”錯誤輸出流。 此流已打開並准備好接受輸出數據

  1. javadoc 的err摘錄是否意味着命令System.err.println(e)將使用catch命令捕獲的異常 e 發送到標准錯誤流? 那么因為標准錯誤流的目的地默認是顯示屏幕,所以方法println將錯誤輸出數據發送到標准錯誤流,然后它會自動發送到顯示屏幕?

  2. 當我們將錯誤消息作為參數提供給標准錯誤 PrintStream 對象的方法println時,我們是否必須捕獲錯誤消息(即異常)以便將錯誤消息發送到標准錯誤輸出流? 這意味着當我們使用System.err.println(e)打印發送到標准錯誤輸出流的錯誤消息時,該消息會顯示在計算機屏幕上,因為標准錯誤流的目的地是顯示屏

  3. 如果catch命令在標准錯誤輸出流中捕捉到錯誤是不是錯誤信息不再在錯誤流中?
  4. 如果catch命令在錯誤信息進入標准錯誤流之前捕捉到錯誤信息,錯誤信息是否仍然發送到標准錯誤流?
  5. 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM