Po pierwsze polecam to przemyśleć 1000x, bo taki kod jest naturalnym środowiskiem niebezpiecznych żyjątek zwanych Nieskończonymi Pętlami (tm).
Nie znam kontekstu i całego pomysłu, więc mogę się mylić, ale... Radziłbym nie używać tego typu bezwarunkowej rekurencji w bloku catch. Zamiast tego może spróbuj odświeżać połączenie co jakiś czas? A może już tak robisz? synchronized może sugerować użycie do tego osobnego wątku, tyle że w środku warto rozważyć jakiegoś sleepa. Albo zrobić ogranicznik w postaci licznika wywołań -- po np. 10 czy choćby 100 próbach ponownego połączenia niech funkcja się podda i rzuci ten wyjątek.
A jak sobie poradzić z tymi zwracanymi wartościami? Np. tak:
public synchronized String metodaB(String wartosc){
String result = null;
try {
//jakies zapytanie do bazy ze zwracaną wartością
result = ...; // przypisanie wartości zwróconej przez zapytanie
}catch (Exception e ) {
S_konsola.komunikat_Ex(e);
e.printStackTrace();
installConnect(); //zerwanie i nawiazanie polaczenia
result = metodaB(wartosc);
}
return result;
}
Zamiast zmiennej result można użyć dwóch return.
Naprawdę, naprawdę zastanów się jednak nad tym wszystkim. Szczególnie jeśli chcesz zrobić z tego szablon dla wielu funkcji. Takie ubijanie wyjątków i -- potencjalnie -- wywoływanie z lasu nieskończonych rekurencji jest niebezpieczne.
PS. A tak w ogóle, jeśli chcesz to robić w ten sposób, to może lepiej użyć pętli z blokiem try-catch, a nie rekurencji? Łatwiej wprowadzić licznik wywołań, a kod będzie pewnie szybszy (prawdopodobnie nieistotne). W stylu:
public synchronized String metodaB(String wartosc){
String result = null;
while (true) {
try {
result = metodaB(wartosc);
} catch (Exception e) {
S_konsola.komunikat_Ex(e);
e.printStackTrace();
installConnect(); //zerwanie i nawiazanie polaczenia
}
}
return result;
}
Zauważ proszę, że tutaj mamy nieeleganckie while (true), co obnaża nieskończoną pętlę i sugeruję, że z kodem prawdopodobnie jest coś nie tak. Maskowanie tego w rekurencji wcale nie pomoże ;).