2017-12-13 3 views
-2

habe ich diese Methode:Handle Exception in der aufgerufenen Methode/Funktion Java/Android?

public void foo(){ 
    int test = 5/0; 
} 

Und ich nenne es wie folgt aus:

try { 
    foo(); 
} catch (Exception e){ 
    e.printStackTrace(); 
} 

Dies fängt die ArithmeticException, aber ich habe Fälle gesehen, wo ich eine Methode innerhalb try-catch nennen, aber es doesn‘ t die Ausnahme fangen. Gibt es eine bestimmte Situation, in der die exception nicht gefangen werden kann?

Hier ist ein Beispiel zur Klärung der Frage: Fängt der try-catch-Block in ActivityA die Ausnahme in ActivityB? Ich weiß, dass die Antwort negativ ist. Aber ich möchte die Logik dahinter wissen.

public class ActivityA extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     try { 
      super.onCreate(savedInstanceState); 
      setContentView(R.layout.activity_a); 
      startActivity(new Intent(this, ActivityB.class)); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

Und ActivityB:

public class ActivityB extends Activity { 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.activity_b); 
     int x = 5/0  
    } 
} 

An allen coolen Typen, die glauben, das eine doppelte Frage ist, mir bitte einen Link auf eine Frage auf Stackoverflow geben, die zu dieser sehr klaren Frage beantwortet: Hat einen Versuch -catch erfasst Ausnahmen, die in einer Methode auftreten, die darin aufgerufen wird?

+0

Mögliches Duplikat von [Best Practices im Umgang mit Java-Ausnahmen] (https://stackoverflow.com/questions/7803110/best-practices-in-handling-java-exceptions) –

+0

Versuchen Sie, die Ausnahme wie 'IllegalArgumentException' anzugeben. – F0XS

+0

Bitte bearbeiten Sie Ihre Frage und erklären Sie, welche Fälle Sie gesehen haben, wo die Ausnahme ausgelöst, aber nicht abgefangen wurde. Welche Methode hast du angerufen? Was macht die Methode? Sind Sie sicher, dass es eine Ausnahme auslöst? Woher weißt du das? – RealSkeptic

Antwort

0

Möglicherweise haben Sie versucht, eine Ausnahme einzufangen, die nicht ausgelöst wurde. Im Fall ArithmeticException, wenn Sie einen auslösen, zum Beispiel NumberFormatException, hält es nicht die Exception und stoppt Ihre Anwendung.

0

Wenn Sie Exception, Exception selbst fangen und alle Ausnahmen, die ein Subtyp von Exception sind, werden von diesem Block abgefangen. In Java sind dies die so genannten "checked exceptions".

Sie werden jedoch nicht diese "Ausnahmen" fangen, die nur ein Subtyp von Throwable sind. Um genau zu sein, sind dies keine Ausnahmen. Sie sind Fehler. Es ist auch möglich, sie in einer Try-Catch-Anweisung zu fangen.

Nicht, dass weder Fangen Exception noch Throwable ist eine gute Praxis. Achten Sie immer auf die spezifischen Ausnahmen und Fehler, die Sie erwarten. wenn geworfen

+0

Also, wenn ich eine Methode innerhalb try-catch aufrufen, die ihrerseits eine andere Methode aufruft, kann ich sagen, dass der try-catch alle Ausnahmen fängt, selbst wenn es innerhalb der am weitesten genannten Methoden passiert? – saraX

+0

@saraX grundsätzlich ja. Es fängt Ausnahmen von allen Aufrufen innerhalb des 'try' Blocks ab. Wenn eine Ausnahme nicht abgefangen wird, wird die Aufrufhierachie hochgejagt, bis sie irgendwo gefangen wird (oder das Programm abstürzt, wenn es nirgends abgefangen wird). –

+0

Also, wenn ich den ganzen Code in meine 'onCreate()' Methode einfüge, fängt es alle Ausnahmen in meiner App ab, weil es der Startpunkt in meiner App ist und alle anderen Sachen von innen her aufgerufen werden? – saraX

0

Wenn Sie eine Ausnahme angeben, gefangen werden, z

public void foo(numb, divisor) throws ArithmeticException { 
    if (divisor == 0) throw new ArithmeticException(); 
    int ans = num/divisor; 
} 

@Test 
public void tesfooWithZeroDivisor() { 
    try { 
     foo(5, 0); 
    } catch (ArithmeticException e) { 
     System.out.println("Can't divide by zero"); 
    } 

} 

In diesem Fall Sie angeben, dass Sie eine ArithmeticException gefangen werden soll. Wenn keine ArithmeticException ausgelöst wird, jedoch eine andere Ausnahme wie IllegalArgumentException, wird keine IllegalArgumentException abgefangen, da Sie nur ArithmeticException angeben.

In Ihrem Fall verwendeten Sie catch (Exception e), was bedeutet, dass Sie keine Ausnahme angegeben haben, so dass es jede Ausnahme fangen wird, die trotzdem ausgelöst wurde.

0

Gibt es eine bestimmte Situation, in der die Ausnahme nicht gefangen werden kann?

Einige Situationen in den Sinn:

  • Der Code (zum Beispiel den Aufruf von foo()) wurde nicht ausgeführt. Also wurde die Ausnahme nicht ausgelöst.
  • Die Ausnahme wurde von anderem Code ausgelöst; z.B. In Ihrem Beispiel wird die Methode foo() von woanders aufgerufen. z.B. auf einem anderen Thread-Stack.
  • Die Ausnahme wurde weiter oben in der Anrufkette abgefangen.
  • Sie haben eine eigene Ausnahme (z my.pkg.ArithmeticException) erklärt, und Sie sind eine andere Ausnahme des als Ergebnis
  • Wenn Sie mit Classloader abgefahrene Dinge tun geworfen man fangen, ist es möglich, die gleiche Klasse mehr als einmal zu laden. Wenn Sie das tun, werden Sie Typen haben, die den gleichen Namen haben, aber in Wirklichkeit anders sind. Wenn Sie dies mit einer Ausnahmeklasse getan haben, kann der Test instanceof, den der Handler ausführt, möglicherweise nicht übereinstimmen.

funktioniert ein try-catch Ausnahmen abfängt, die in einem Verfahren geschieht das innerhalb sie genannt wird?

Ja. Wenn Sie es richtig implementiert haben; siehe oben.

Wenn Sie Kapitel und Vers lesen möchten, lesen Sie JLS 14.20.


In Bezug auf die aktualisierte Beispiel würde ich nicht erwarten die Exception-Handler für ActivityA Ausnahmen in ActivityB.onCreate geworfen zu sehen. Ich würde erwarten, dass onCreate() von einem anderen Thread aufgerufen wird.

Sie können dies bestätigen, indem Sie die Ausnahme in ActivityB.onCreate abfangen und den StackTrace betrachten.

+0

Laut einer der Antworten, wenn ich den gesamten Code in meine 'onCreate()' Methode, fängt es alle Ausnahmen in meiner App, weil es der Startpunkt in meiner App ist und alle andere Sachen werden von innen genannt. Ja? Was ist, wenn ich eine Absicht für eine andere Aktivität in einem try-catch-Block verwende? Bedeutet das, dass alle Ausnahmen innerhalb der neuen "Aktivität" abgefangen werden? @ stephen-c – saraX

+0

Gib uns ein konkretes Beispiel. Aber im Allgemeinen ist die Antwort nein. Die Tatsache, dass Code lexikalisch "innerhalb" Ihres "onCreate()" steht, bedeutet nicht notwendigerweise, dass er von dem Thread ausgeführt wird, der Ihre 'onCreate()' Methode aufruft. Es gibt verschiedene Möglichkeiten, um Code auf einem anderen Stack in Android auszuführen. –

+0

Nun, ich habe die Frage bearbeitet und einen Codeblock hinzugefügt, um Ihnen ein konkretes Beispiel zu geben. Ich würde mich freuen, wenn Sie mich dabei unterstützen. @ stephen-c – saraX

Verwandte Themen