Java 格式错误的PDF打印不';无法捕获运行时异常

Java 格式错误的PDF打印不';无法捕获运行时异常,java,android,android-print-manager,Java,Android,Android Print Manager,我试着打印一个PDF文件,它工作正常,直到我试着打印一个格式错误的PDF文件。 我不知道为什么应用程序会崩溃,尽管我使用了try/catch来防止崩溃。我检查并发现PrintManager.java:1101抛出RuntimeException: case MSG_ON_KILL: { if (DEBUG) { Log.i(LOG_TAG, "onKill()"); } String reason = (String) message.obj;

我试着打印一个PDF文件,它工作正常,直到我试着打印一个格式错误的PDF文件。 我不知道为什么应用程序会崩溃,尽管我使用了
try/catch
来防止崩溃。我检查并发现
PrintManager.java:1101
抛出
RuntimeException

 case MSG_ON_KILL: {
     if (DEBUG) {
         Log.i(LOG_TAG, "onKill()");
     }

     String reason = (String) message.obj;
     throw new RuntimeException(reason);
 }
所以下面的代码不应该导致崩溃:

public static void startPdfPrintProcedure(@NonNull Context context, @NonNull String filePath, @Nullable String jobName) {
    try {
        PrintManager printManager = (PrintManager) context.getSystemService(Context.PRINT_SERVICE);
        String jobName = formatDefaultJobName(context.getResources(), jobName);
        PrintDocumentAdapter pda = new SimplePrintDocumentAdapter(new File(filePath));
        if (printManager != null) {
            try {
                printManager.print(jobName, pda, null); // <- crash here even though there is a try/catch
            } catch (RuntimeException e) {
                showUnknownError();
            }
        } else {
            showUnknownError();
        }
    } catch (RuntimeException e) {
        showUnknownError();
    }
}
为什么
try/catch
code无法捕获此异常?如何确保这段代码不会崩溃?

之所以会发生这种情况,是因为一些“天才”谷歌开发人员想出了一个“好”主意,在主线程中抛出一个异常,导致应用程序关闭。 我尝试使用反射来解决这个问题,但是实现太封闭了。 不幸的是,如果出现不正确的文件,您必须使用它来假设应用程序即将关闭,除非您希望在调用API之前实现一个库来检查PDF格式。 谷歌从来没有失败过,你总是要搞乱它的实现

辅助线程最终调用此处理程序

    private final class MyHandler extends Handler {

            public static final int MSG_ON_KILL = 5;
            ...

            @Override
            public void handleMessage(Message message) {
                switch (message.what) {
                    ...
                    
                    case MSG_ON_KILL: {
                        if (DEBUG) {
                            Log.i(LOG_TAG, "onKill()");
                        }

                        String reason = (String) message.obj;
                        throw new RuntimeException(reason);<---------
                    }

                    default: {
                        throw new IllegalArgumentException("Unknown message: "
                                + message.what);
                    }
                }
            }
        }
私有最终类MyHandler扩展了Handler{
公共静态最终int MSG_ON_KILL=5;
...
@凌驾
公共无效handleMessage(消息消息){
开关(消息。什么){
...
案例消息\u关于\u KILL:{
如果(调试){
Log.i(Log_标记,“onKill()”);
}
字符串原因=(字符串)message.obj;

抛出新运行时异常(原因);我看这些捕获没有理由不出现异常。在两个捕获中首先放一个
系统。out
,看看它们是否打印了什么。或者使用调试器在2中放一个断点catchs@Bentaye我放了日志,两个捕获都不起作用。但令人惊讶的是,日志显示在
printManager.print()之前和之后
这样该行就不会抛出任何RuntimeException。你能在stacktrace中看到多远?为什么你认为
printManager.print(…)
是该行抛出了异常?@Bentaye你是对的。我以为崩溃发生在
printManager.print(…)
行,但我选中了,调用了
try/catch
块之后的代码。然后出现打印对话框,应用程序崩溃。
    private final class MyHandler extends Handler {

            public static final int MSG_ON_KILL = 5;
            ...

            @Override
            public void handleMessage(Message message) {
                switch (message.what) {
                    ...
                    
                    case MSG_ON_KILL: {
                        if (DEBUG) {
                            Log.i(LOG_TAG, "onKill()");
                        }

                        String reason = (String) message.obj;
                        throw new RuntimeException(reason);<---------
                    }

                    default: {
                        throw new IllegalArgumentException("Unknown message: "
                                + message.what);
                    }
                }
            }
        }