Java 是否将侦听器应用于System.err?

Java 是否将侦听器应用于System.err?,java,exception,javafx,error-handling,exception-handling,Java,Exception,Javafx,Error Handling,Exception Handling,我有这样一个想法,即无论何时JavaFX程序中发生未处理的异常,我都可以向用户显示警报,而不是依赖于控制台输出。我在想,也许我可以从System.err获取输出以供使用。以下是我迄今为止所做的尝试 PrintStream myStream = new PrintStream(System.err) { @Override public void println(String s) { super.println(s);

我有这样一个想法,即无论何时JavaFX程序中发生未处理的异常,我都可以向用户显示警报,而不是依赖于控制台输出。我在想,也许我可以从System.err获取输出以供使用。以下是我迄今为止所做的尝试

    PrintStream myStream = new PrintStream(System.err) {
        @Override
        public void println(String s) {
            super.println(s);
            Log.debugLog(s); //this function logs to a file and displays an alert to user
        }
    };
    System.setErr(myStream);

如果我将System.err替换为System.out,并将
System.setErr
替换为
System.setOut
,则此代码段有效。但是,这是捕获System.out,而不是
System.err。
我想更好的问题是,当向控制台显示错误时,System.err调用什么确切的函数?所以这可能会覆盖它。任何提示都将不胜感激

我认为你的方法是错误的。如果要在出现未处理的异常时向用户显示警报,可以通过设置DefaultUncaughtExceptionHandler:

Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
       // show alert to user
       e.printStackTrace();
       // do whatever you want with the Exception e

    });

我认为你的方法是错误的。如果要在出现未处理的异常时向用户显示警报,可以通过设置DefaultUncaughtExceptionHandler:

Thread.setDefaultUncaughtExceptionHandler((t, e) -> {
       // show alert to user
       e.printStackTrace();
       // do whatever you want with the Exception e

    });

您可以创建定制的JavaFX警报,以显示异常堆栈跟踪和简短消息。这显示了下面的代码


您可以创建一个定制的JavaFX警报,以显示异常堆栈跟踪以及一条简短消息。这显示了下面的代码


将方法调用包装在
try catch
中,然后它就完成了。什么使您认为它不起作用?在更改
err
流之后,尝试调用
System.err.println(“foobar”)
,甚至可能是重复的:(您可以扩展
FilterOutputStream
,将输出保存在
System.err
)但是,这样您无法确保在给定时间内完全打印错误。调用的确切顺序是一个不应该依赖的实现细节。当您调用时,您的代码将满足您的需要:
System.err.println(“foobar”)
not
System.out.println(“foobar”)
。将方法调用封装在
try catch
中,并且完成了什么使您认为它不起作用?在更改
err
流之后,尝试调用
System.err.println(“foobar”)
,甚至可能是重复的:(您可以扩展
FilterOutputStream
,将输出保存在
System.err
)但是,这样您无法确保在给定时间内完全打印错误。调用的确切顺序是一个不应该依赖的实现细节。当您调用时,您的代码将满足您的需求:
System.err.println(“foobar”)
而不是
System.out.println(“foobar”)
。太棒了,这正是我想要的。现在,如果我想获取e.printStackTrace()将输出的内容,我应该调用什么方法?具体来说,我想知道哪行代码失败了。我尝试了e.getMessage()、e.fillInStackTrace()、toString(),但我似乎无法理解。请阅读此处了解如何获取行号:如果解决了您的问题,请将我的答案标记为正确。太棒了,这正是我要寻找的。现在,如果我想获取e.printStackTrace()将输出的内容,我应该调用什么方法?具体来说,我想知道哪行代码失败了。我尝试了e.getMessage()、e.fillInStackTrace().toString(),但似乎无法理解。请阅读此处了解如何获取行号:如果解决了您的问题,请将我的答案标记为正确。