Java 格式错误的PDF打印不';无法捕获运行时异常
我试着打印一个PDF文件,它工作正常,直到我试着打印一个格式错误的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;
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);
}
}
}
}