W C # i Javie (i być może także w innych językach) zmienne zadeklarowane w bloku „try” nie znajdują się w zakresie w odpowiednich blokach „catch” lub „final”. Na przykład poniższy kod nie jest kompilowany:
try {
String s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
W tym kodzie błąd kompilacji występuje w odwołaniu do s w bloku catch, ponieważ s znajduje się tylko w zakresie w bloku try. (W Javie błąd kompilacji to „s nie można rozwiązać”; w C # to „nazwa„ s ”nie istnieje w bieżącym kontekście”).
Wydaje się, że ogólnym rozwiązaniem tego problemu jest deklarowanie zmiennych tuż przed blokiem try, a nie w bloku try:
String s;
try {
s = "test";
// (more code...)
}
catch {
Console.Out.WriteLine(s); //Java fans: think "System.out.println" here instead
}
Jednak przynajmniej dla mnie (1) wydaje się to niezgrabnym rozwiązaniem i (2) skutkuje tym, że zmienne mają większy zakres niż zamierzał programista (cała pozostała część metody, a nie tylko w kontekście spróbuj złapać wreszcie).
Moje pytanie brzmi: jakie były / są uzasadnienie (y) tej decyzji dotyczącej projektu języka (w Javie, w C # i / lub w innych odpowiednich językach)?