04 marca 2008

Moje własne WTF

W medycynie istnieje takie pojęcie jak "ból przeniesiony". Polega to na tym, że możecie odczuwać ból w ramieniu albo nadgarstku, a tak naprawdę coś nie tak może być z łokciem. Tylko po prostu nerwy nie reagują jak należy.
Podobne pojęcie figuruje w filmie (w scenariopisarstwie albo montażu) - gdy masz odczucie, że coś nie gra, że coś zgrzyta albo nie pasuje, to często problem nie występuje w scenie, która wydaje się być błędna, tylko gdzieś wcześniej.

Ci, co pisali kiedyś jakikolwiek, nawet najprostszy program komputerowy, wiedzą, że coś takiego istnieje także w informatyce. Im prostszego używa się kompilatora, tym bardziej nie-wprost podawane są błędy - informacje o nieoczekiwanym identyfikatorze albo niezadeklarowanej zmiennej w Visual C++ oznaczają najczęściej, że w poprzedniej linijce zapomnieliśmy średnika. Informacje o zakazie deklarowania funkcji wewnątrz innych funkcji albo poza klasą oznaczają, że gdzieś jest o jedną klamrę za dużo albo za mało. Zazwyczaj krótkie poszukiwania pozwalają prędko zlokalizować taki drobny błąd, ale nie zmienia to faktu, że kompilatory mogłyby być nieco mądrzejsze i poprawnie rozpoznawać przyczyny błędów.

Eclipse jest fajny, bo lepiej takie rzeczy rozpoznaje. Ale pracuję ostatnio w JBossie i to, co mnie przed chwilą spotkało, przeszło już wszelkie pojęcie.

Błąd zlokalizowałem w sumie przypadkiem, a polegał on na tym, że w pliku .xhtml napisałem takie coś:

<h:commandButton id="login" value="zaloguj" onclick="alertModal('login-modal','login-modal-msg');return false;\"/>

Błąd to prosta literówka - ostatni cudzysłów poprzedzony jest wtyłciachem (ang. backslash), co - jak wiadomo - neguję jego funkcję jako cudzysłowiu zamykającego ciąg znaków, sprawiając, że zostanie on odczytany jako zwykły znak cudzysłowiu w tymże ciągu znaków.

Ale komunikat błędu w tym miejscu w życiu by nikogo na niego nie naprowadził (abstrahując już od faktu, że JBoss nie poinformował mnie o miejscu jego wystąpienia - ani o linii, ani nawet o pliku). Bo nie było to nic w stylu "nieznany identyfikator" czy "niedozwolony znak". Wyjątek, który został w tym miejscu zwymiotowany, brzmiał:

java.lang.ArrayIndexOutOfBoundsException: 58

Gdzie? Jak? Skąd? Gdzie ja używam jakiejkolwiek tablicy w tej aplikacji??? Zniechęcony błędem postanowiłem cofnąć ostatnie zmiany, jakie wprowadziłem, i po usunięciu cytowanego taga w xhtml-u błąd zniknął. Wprowadziłem go więc ostrożnie jeszcze raz, zlokalizowałem literówkę i - tknięty przeczuciem - ręcznie policzyłem długość ciągu znaków w onclick. Zgodnie z przewidywaniami - naliczyłem 57 znaków.

To się nazywa ból przeniesiony...

Brak komentarzy: