Der Compiler legt fest, welche Methode zu nennen, anstatt die VM. Die von Ihnen beschriebene Klasse löst das Problem also nur, wenn Sie instanceof zuerst überprüfen und den Parameter in den richtigen Typ umwandeln. Sonst wirst du jedes Mal handleError (Exception e) bekommen.
Aber ich wollte nicht aus diesem Grund eine Antwort erstellen, sondern argumentieren, dass es in vielen Fällen tatsächlich vorzuziehen ist, nur einen Fehlerbehandler zu haben, keine Haftung. Oft in Java enden wir in schreckliche Situationen wie diese auf:
catch (NoSuchAlgorithmException e) {
throw new IllegalStateException("No such algorithm: RSA?", e);
}
catch (NoSuchProviderException e) {
throw new IllegalStateException("No such provider: " + ANDROID_KEYSTORE_ID, e);
}
catch (InvalidAlgorithmParameterException e) {
throw new IllegalStateException("Bug setting up encryption key for user credentials: ", e);
}
catch (KeyStoreException e) {
throw new IllegalStateException("Bug setting up encryption key for user credentials: ", e);
}
catch (IOException e) {
Log.w(TAG, "Exception setting up keystore for user creds. They won't be stored.", e);
}
catch (CertificateException e) {
Log.w(TAG, "Exception setting up keystore for user creds. They won't be stored.", e);
}
mit nur einem Fehler-Handler gibt uns die Möglichkeit, zusammen viele Arten von Ausnahmen einen Topf zu werfen. Sie können in diesem Code sehen, dass es Ausnahmen gibt, die niemals ausgelöst werden sollten, Ausnahmen, die wirklich nur das Ergebnis eines Fehlers im Code sein können, und legitime Ausnahmezustände, die wir behandeln müssen. Ich finde diese chaotisch, und würde lieber sagen:
if (e instanceof NoSuchAlgorithmException || e instanceof NoSuchProviderException) {
Log.wtf(TAG, "What the heck is this?", e);
throw new IllegalStateException("This is some kind of weird bug", e);
}
else if (e instanceof IOException || e instanceof CertificateException) {
// This can happen sometimes, track event in analytics and perhaps
// try some alternative means of credential storage.
}
else {
// At least here the app won't crash if some unexpected exception occurs,
// since we're trapping everything.
}
Ich glaube nicht, dass es so eine schlechte Sache der Lage sein, unerwartete Ausfälle zusammen einen Topf zu werfen und sie in einer benutzerfreundlichen Art und Weise handhaben als die App abstürzt. Auch wenn es nur ein Bug ist, ist es besser, ihn hinter den Kulissen in Ihrem Analytics-Framework zu verfolgen, als den Nutzer aus der App zu bombardieren. So viele Abstürze in Android-Apps sind tatsächlich vollständig wiederherstellbar, aber wir gehen nicht herum und fangen Throwable in jeder try/catch-Anweisung ein, weil es viel zusätzlichen Code ist.
das fällt immer in die 'handleError (Exception e)' Implementierung – mihail
hmmm, ich schrieb Test dafür und es hat nicht versagt ... aber es ist irrelevant: P –
Ich schrieb auch einen Test in Java 1.8 (u60) und es fällt immer in Exception-Methode – mihail