Pominięcie warunku, jeśli wystąpi błąd

0

Witam,
mam tablicę dwuwymiarową z pewnymi danymi.
Teraz potrzebuję odczytać liczbę z tablicy położną 1 i 2 wiersze niżej lub wyżej.
Jednak może zdarzyć się sytuacja, gdy pod uwagę będzie brana część tablicy o współrzędnych 0 lub 1. Wtedy wyskakuje błąd: arrayindexoutofboundsexception.
Dla przykładu zrobiłem taki warunek:

if(tab[y-1][x] == 0 && tab[y-2][x] == 0)

No i załóżmy że wartość y to 1. Wywali błąd. Co prawda mógłbym się zabezpieczyć przed taką sytuacją stawiając jeszcze wcześniej odpowidni warunek, ale oznaczałoby to niepotrzebne kopiowanie 2 razy tego samego kodu.
Więc mam pytanie: czy da się tak zrobić, żeby jeśli chcę wywołać część tablicy która nie istnieje, to zamiast zatrzymania aplikacji, program zwróci false na przykład?
Z góry dziękuję.

0

o_O? Lekcja na dziś: try catch finally
Złap wyjątek po prostu...

0

Sprawdzanie zakresów, to psi obowiązek Javy, który tak naprawdę ratuje Ci tyłek (inaczej w ogóle byś tego nie zauważył). Takie bugi w C/C++ prowadziły do CTD lub wycieków pamięci.
Powinieneś zrobić tak:

if( (y >= 1 && tab[y - 1][x] == 0) && (y >= 2 && tab[y - 2][x] == 0) )
{
	//...
}

Jeżeli y będzie mniejsze niż należy, to wartość komórek tablic w ogóle nie zostanie policzona (a tym samym nie będzie również sprawdzania zakresu tablicy przez Javę) bo wartość pierwszego operandu && będzie już false. Podobnie w || nie oblicza się drugiego operandu kiedy pierwszy ma wartość true.

0

@Olamagato pytanie czy faktycznie warto robić tyle warunków jeśli to jest sytuacja marginalna, tym bardziej ze Java i tak sama te warunki sprawdzi. Dla duzej tablicy moze się okazać że wydajniej jest łapać wyjątki ;)

0

Pytanie czy naprawdę jest marginalna... Bo jeżeli nie, to może sensowniej jest zrobić sparametryzowany warunkami dostęp do tablic (-y). Podobno nie powinno się używać obsługi wyjątków do przepływu sterowania, szczególnie że RuntimeException (a tym jest IndexOutOfBoundsException) może pojawić się właściwie wszędzie.
Jednak sam pomysł użycia try/catch/finally jest atrakcyjny bo zwięzły, prosty i w zasadzie działa.
Tyle, że na "w zasadzie działa" można się (w kodzie produkcyjnym) trochę przejechać. Wystarczy wziąć 1. tablice wielowymiarowe, 2. inne obiekty, dla których złe wejście wygeneruje ten sam wyjątek, tylko głębiej. I pozamiatane. Może nie koniecznie od razu, może dopiero w n-tej generacji zmian kodu robionej przez m-tego programistę ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1