Java中的错误消息是否会像Unix操作系统一样自动发送到标准错误流?
在类Unix操作系统中,标准错误是来自命令行程序的错误消息的目标,而标准错误的默认目标是显示屏。我假设,就像在类Unix操作系统中一样,Java中的每个命令都被分配了三个数据流(即通道):标准输入、标准输出和标准错误Java中的错误消息是否会像Unix操作系统一样自动发送到标准错误流?,java,unix,stream,operating-system,outputstream,Java,Unix,Stream,Operating System,Outputstream,在类Unix操作系统中,标准错误是来自命令行程序的错误消息的目标,而标准错误的默认目标是显示屏。我假设,就像在类Unix操作系统中一样,Java中的每个命令都被分配了三个数据流(即通道):标准输入、标准输出和标准错误 在Java中也是这样吗?也就是说,在Java中,是来自命令的错误消息立即发送到标准错误流,还是来自命令的错误消息没有目的地(即,来自命令的错误消息不会去任何地方,除非我们在变量中捕获它,然后使用System.err.println(e);)将其发送到标准错误流) 以下面的代码为例:
System.err.println(e);
)将其发送到标准错误流)ArrayList middleLine=new ArrayList();
int beginIndex=0;
int endIndex=list.size()-1;
int middleIndex=(beginIndex+endIndex)/2;
试一试{
添加(行[中间索引]);
}捕获(例外e){
系统错误println(e);
}
middleLine.add(行[middleIndex])代码>引发异常。由于Java非常惯用,Java关键字throws
是否意味着异常不会自动发送到标准错误流,或者throws
是否指示异常在标准错误输出数据流中的运动
err
的javadoc表示:
“标准”错误输出流。此流已打开并准备接受输出数据
err
是否意味着命令System.err.println(e)
将使用catch
命令捕获的异常e发送到标准错误流?然后,由于默认情况下标准错误流的目的地是显示屏,因此方法println
将错误输出数据发送到标准错误流,并自动发送到显示屏println
的参数时,我们是否必须捕获错误消息(即异常),以便将错误消息发送到标准错误输出流?这意味着,当我们使用System.err.println(e)
打印发送到标准错误输出流的错误消息时,该消息会显示在计算机屏幕上,因为标准错误流的目标是显示屏catch
命令捕捉到标准错误输出流中的错误,错误消息是否不再出现在错误流中catch
命令在错误消息进入标准错误流之前捕获了错误消息,那么错误消息是否仍然发送到标准错误流System.err.println(e)
是指自动打印与发送到标准错误流的异常匹配的异常e,还是指打印我们通过方法println
的参数发送到标准错误流的异常e只有在未捕获异常或对其调用printStackTrace()时,才会将异常打印到stderr。这里有一个小演示,可以演示一些事情:
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;
}
}
每个问题你应该问一个问题,而不是9个或10个。你也有很多误解。当您调用println时,您实际上会打印e.toString(),并且该字符串只会发送到您发送到的任何控制台。当您不执行任何操作时,jvm会将异常消息和堆栈跟踪打印到system.err(也称为stderr)并停止。不,默认情况下,抛出和捕获不会打印任何内容。让我们。@Slaw您创建的聊天室似乎已被删除。有可能获得您在聊天室中提供的链接吗?| | | | |。你在回答他的哪一个问题?#1和7,8,9的程度较轻:旨在证明在明确告知打印或遇到未捕获的异常之前,不会向stderr发送任何内容。只是确认一下,当你说“打印到stdout”和“打印到stderr”时,你的意思是将数据写入stdout并将数据写入stderr,对吗?您可以更正,如果未捕获异常,则会将异常打印到stderr,这意味着捕获异常会截获异常,从而防止stderr将异常从程序写入显示器。再补充一点,我认为声明方法抛出异常也会阻止stderr将数据写入显示
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