2017-12-09 6 views
1

Wie weit ich in Java weiß Fehler können auf zwei Arten gemeldet werden: Rückgabewerte und Ausnahmen. Zum Beispiel folgenden Code:Methode Rücksendeanweisung vs Try-Catch

int methodName(int i, int j) {
int result;
try {
result = i/j;
return result;// in the case of j = 0, ArtithmeticException() will be thrown
}
catch (Exception e) {
System.out.println("Some message");
}
//return result;
}

Bei j = 0 Ausnahme wird (fangen) geworfen und gefangen werden. Und die Nachricht wird gedruckt. Die Frage ist: Wenn ich kein Ergebnis von dieser Methode im Fall der Division durch Null zurückgeben MUSS ich einen Wert zurückgeben oder es gibt einen anderen Weg? Verwendung von 'werfen' aus Fangklausel?

Und eine weitere Beobachtung:
Variable Ergebnis initialisiert möglicherweise nicht haben
Und wenn ich kommentieren letzte ‚return result‘ ich: Wenn ich die Auskommentierung ‚return result‘ Aussage, die ich Nachricht erhielt eine Störung dauern bekam eine Fehlermeldung:

fehlt return-Anweisung

Aber ich habe die Rückgabeanweisung bereits in die try-Klausel aufgenommen.

Danke.

+0

es ist wegen der Rückgabetyp, in Ihrem Fall Rückgabetyp ist Int. wenn es ungültig ist, brauchst du nichts zurückzugeben –

Antwort

2

Im Falle von j = 0 wird eine Ausnahme ausgelöst und gefangen (durch Fangen). Und die Nachricht wird gedruckt. Die Frage ist: Wenn ich bei der Division durch Null kein Ergebnis aus dieser Methode zurückgeben möchte, MUSS ich trotzdem einen Wert zurückgeben oder es gibt einen anderen Weg? Verwendung von 'werfen' aus Fangklausel?

Sie müssen entweder einen Wert zurückgeben die Signatur (int in diesem Beispiel) oder throw etwas, sonst wird das Programm nicht kompiliert übereinstimmen.

Und eine weitere Beobachtung: Wenn ich return result Aussage dauern die Auskommentierung bekam ich eine Fehlermeldung: Variable Ergebnis könnte

Die result Variable wird in einem try Block zugewiesen nicht initialisiert wurden. Der Compiler weiß nicht, an welchem ​​Punkt die Ausnahme auftreten könnte. Wenn eine Ausnahme auftritt, bevor die Zuweisung abgeschlossen ist, , dann an der Stelle der return result Anweisung, die Variable result möglicherweise keinen Wert haben. Die Lösung ist, einen Wert vor dem try Block zu setzen.

Und wenn ich das letzte Mal ‚return result‘ Kommentar bekam ich eine Fehlermeldung: fehlt return-Anweisung Aber ich habe bereits return-Anweisung in try-Klausel enthalten.

In diesem Beispiel, wenn eine Ausnahme in dem Block try auftritt, dann der catch Block und der Rest des Körpers der Funktion ausgeführt wird, und es gibt keine andere return Anweisung, um die Unterschrift des Übereinstimmen Methode. Sie müssen einen Wert int für alle Ausführungspfade zurückgeben.

+0

@ RickSanch3z Ich habe diesen Satz neu formuliert, um ihn genauer zu machen. Sie müssen entweder eine Ausnahme auslösen oder ein 'int' zurückgeben. Es gibt keinen anderen Weg. So einfach ist das. – janos

+0

_italic_Sie müssen entweder einen Wert zurückgeben, der zu der Signatur passt (int in diesem Beispiel) oder etwas werfen, sonst wird das Programm nicht kompiliert._italic_ also, auch wenn ich kein 'int' zurückgebe, kann ich etwas werfen? Ja. Das Werfen von 'catch' -Klausel löste teilweise das Problem, einen Wert nicht zurückzugeben, wenn ich ein beschädigtes Ergebnis erhalte. Aber ich muss immer noch 'result' Variable initialisieren. – RickSanch3z

+0

@ RickSanch3z Wenn Sie den Block 'catch' einwerfen, ohne die Variable' result' zu verwenden, müssen Sie 'result' nicht initialisieren. – janos

1

, was Sie erreichen wollen, kann von unten Beispielcode

Als ArithmeticException erreicht werden, Runtime und im Fall von j = 0 Ausnahmen an CLIP-Funktion weitergegeben werden.

int methodName(int i, int j) { 
        return i/j; 
       } 
+0

Nur um zu verstehen, wie Try-Catch funktioniert. Vielen Dank. – RickSanch3z

+0

beziehen Sie sich auf Java Doc für das https://docs.oracle.com/javase/tutorial/essential/exceptions/handling.html –

1

Vielleicht so etwas wie folgt aus:

static int methodName(int i, int j) { 
    if (j == 0) throw new ArithmeticException(); 
    return i/j; 
    } 

Sie auch Integer-Typ für Ergebnis verwenden könnte und es initialisieren würde auf null und Ihren Code kompilieren:

Integer result = null; 

So oder so, Der aufrufende Code muss die Ausnahme oder den möglichen Nullwert behandeln.

+0

Dies sollte auch funktionieren, weil es keine "try-catch" -Klausel gibt und einige Ausnahmen loswerden direkt zur aufrufenden Routine. – RickSanch3z

+0

Und mit der 'Integer' Objektreferenz funktioniert wahrscheinlich auch. Wenn ich 'null' zurückgebe, bekomme ich NullPointerException, die durch Aufrufen der Routine abgefangen werden konnte. – RickSanch3z

0

Eine Sache, die Sie wahrscheinlich beobachten, ist die scope der Variablen.

Wenn man eine void Methode anrufen möchte, so dass seine return ing nichts; Dennoch können Sie die Werte einer Variablen ändern, indem Sie die Variable, die sie ändern möchten, in den globalen Bereich einfügen.

Ein Beispiel dafür, wie diese aussieht, ist Demo unter:

public class MyClassName{ 
    //global scope int 
    public static int result; 
    //main method 
    public static void main(String[] args){ 
     //Let's see what we start at 
     System.out.println("By default im at: " + result); 
     //Attempt to set global variable as the result of a 0 division 
     methodName(1,0); 
     System.out.println("I tried to divide by zero but I'm still at: "+result); 
     //Attempt to perform normal calculation 25/5 
     methodName(25, 5); 
     System.out.println("25 divided by 5 is: "+result); 
    } 
    //method that changes global variable - void means it returns nothing 
    public static void methodName(int i, int j) { 
      try { 
       //try 1/0 
       result = i/j; 
      } 
      catch (Exception e) { 
       System.out.println("CATCH:I failed to divide by zero."); 
      } 
     } 
} 

Ausgang:

By default im at: 0 
CATCH:I failed to divide by zero. 
I tried to divide by zero but I'm still at: 0 
25 divided by 5 is: 5 

Bitte beachten Sie die Positionierung der globalen Variablen, außerhalb des Hauptverfahrens. In diesem Beispiel wird der Wert der Variablen result noch geändert, ist aber nicht unbedingt return ed.