Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Lokale Variablen müssen immer mit irgend nem Wert initialisiert werden, in nem try-catch kanns sein dass ne Variable mal nicht mit nem Wert belegt wird, da müsstest du die dann explizit mit nem Wert füllen, also null z.b.
Oder Wenn du auf biegen und brechen ein Objekt dem GC zum Fraß vorwerfen willst.
Klasse ref=null;
try {
// tu was..
// als ergebnis oder zwischendrin wird ref bekannt
ref=new Klasse();
} catch(MostFatalExceptionPossible) {
// debug-output
return;
}
// hier geschieht irgendwas mit ref
Der Compiler jammer dann, wenn in Zeile 1 kein [c]=null[/c] steht, obwohl nach dem try-catch statement ref einen Wert haben muss, da, wenn das nicht der fall wäre, im catch-block die methode abgebrochen wird. Aber der Compiler ist zu blöd dazu. Kann man ihm miener Meinung nach auch nicht übel nehmen.
Ich finde es ist ein herber Design-Fehler von Java, dass im try-Block initialisierte Variablen in catch und finally nicht sichtbar sind (natürlich müsste man dann damit rechnen, dass sie null sind, wenn ein Fehler vor der Initialisierung flog).
Ich finde es ist ein herber Design-Fehler von Java, dass im try-Block initialisierte Variablen in catch und finally nicht sichtbar sind (natürlich müsste man dann damit rechnen, dass sie null sind, wenn ein Fehler vor der Initialisierung flog).
public static void main(String[] args) {
String string = null;
try {
string = "Hallo aus dem try-Block";
throw new RuntimeException();
} catch (Exception e) {
System.out.println(string);
} finally {
System.out.println(string);
}
}
Code:
String string = null;
ist die Deklaration und Initialisierung von
Code:
string
. In Java muss man
Code:
string
vor dem catch/finally-Block initialisieren, damit kann man leben finde ich, das einzige was jetzt nicht mehr geht ist
Code:
string
final zu setzten. Wenn jetzt ein Wert zugewiesen wird und danach eine Exception fliegt, kann man auf den Wert im catch/finally-Block zugreifen.
Ich könnte mir jetzt vorstellen, dass dich stört, dass
Code:
string
vor dem try-Block deklariert werden muss, um im catch/finally-Block sichtbar zu sein. Die drei Blöcke haben halt einen unterschiedlichen Scope, das finde ich jetzt auch nicht so schlimm.
Den finally-Block nutze ich eigentlich nur um Ressourcen zu schließen oder aufzuräumen, die Lösung "try mit Ressourcen" aus Java 7 finde ich da eigentlich eine schöne Lösung.
Im catch-Block brauche ich auch nichts aus dem try-Block, interessant sind da Eingabewerte für Logging, sollte man da in die Verlegenheit kommen, irgendwelche Zwischenergebnisse loggen zu wollen, macht man meiner Meinung nach zu viel im try-Block.
Ich finde auch, der try-catch-finally code soltle wirklich nur das ausführen und im falle einer Exception das behandeln dieser übernehmen, sonst nichts. Und ich finde, da passt es wunderbar, dass die Variable davor deklariert werden muss:
Es wird platz für die Variable geschaffen.
Dann wird der kritische Code ausgeführt, der sich um den wert kümmert.
Danach wird dieser weiter verarbeitet.
Leben ja, aber unschön ist es alle mal. Mir geht es weniger um die eine zusätzliche Zeile. Das eigentliche Problem ist, dass die Variable einen größeren Scope hat als notwendig, und final machen (was ja zumindest bei immutablen Klassen helfen würde) kann man sie auch nicht.
Ein pathologisches Beispiel, das sehr schwer zu entdecken ist:
Java:
Date date = null;
try {
date = getDateFromSomewhere();
Order order = findOrder(id);
checkDate(date, order); //kann Exception werden
order.setPayDate(date);
} catch (InvalidDateException ex) {
log.error("Pay date " + date + " is before create date ");
return false;
}
...
//in einem anderen Kontext
Date createDate = new Date();
Order splittedOrder = new Order(getOrderId(), date, ...);
Dein Beispiel wäre aber auch schwer zu durchschauen, wenn es keinen try/catch-Block gäbe. Das Problem ist ja dass
Code:
date
und
Code:
createDate
vertauscht werden. Das eigentliche Problem ist, dass die eine Methode zu viel macht und zu unübersichtlich ist.
Im Übrigen müsste man date nicht vor dem try-Block deklarieren, wenn man entweder in der Message der InvalideDateException das Datum hätte, oder date an die InvalideDateException übergeben würde.
Ist ja nur ein Beispiel. In vielen Fällen muss man die Variable vor dem try deklarieren, z.B. wenn man im finally ein close oder so aufrufen muss (was ja nun endlich mit den ARM-Blöcken behoben worden ist, so man denn den Luxus von Java 7 hat).