argon bulletin board
Факултети => Факултет по математика и информатика => Темата е започната от: Nikolay Manchev в 29.09.2005, 08:27:19
-
Няколко пъти до сега ми се е случвало да карам колеги да публикуват собствен код и да ми отказват, защото някак се чувстват неуверени и се притесняват, че някой може да намери грешки в програмите им.
Честно казано аз принципно съм на мнение, че е по-добре да ти посочат грешката и да ти свият малко перките, отколкото да продължиш да я правиш. Така или иначе, тези дни попаднах на следния код, който описва свързването към релационна база през Java:
try {
Connection con = ds.getConnection("user", "secret");
// . . . code to do the application's work
} catch {
// . . . code to handle an SQLException
} finally {
if (con != null) con.close();
}
Хайде да видим за тези няколко реда код колко грешки са допуснати. И за да е по-забавно, ще подчертая че кодът е от Universal Data Access for the Java от сайта на Sun (точно така!). Да не говорим, че целта на този код е да учи начинаещите програмисти как да пишат. Така че, не се впрягайте - всички пишат глупости от време на време :-)
Поздрави,
Николай Манчев
-
Референцията con трябва да бъде декларирана преди try блока,защото не е видима във finally блока и този код изобщо няма да компилира. Интересно ми е обаче как може да се избегне проверката if (con != null) във finally блока.
-
Е, то да беше само това... Виж че catch-ът изобщо няма тип на изключението, което е недопустимо съгласно синтаксиса.
На всичкото отгоре в сигнатурата на Connection.close() има throws SQLException, което също е изпуснато да се прихване.
На 5 реда - три грешки, които спират компилацията. Да им имам и образователния пример. :-)
-
Интересно ми е обаче как може да се избегне проверката if (con != null) във finally блока.
Оф, забравих да отговоря на това. Защо ти е да я избягваш като начало? Иначе принципно вместо
} finally {
if (con != null) con.close();
}
ако не ти е фатално ресурса да се освободи точно на това място, с чиста съвест можеш да кажеш просто
} finally {
con = null;
}
и да си щракаш с пръсти :-D
-
Преди време на едно интервю ми зададоха този въпрос - как мога да избегна проверката и в същото време да съм сигурен, че ресурса е освободен. Ставаше въпрос за един pool с конекции към някаква база и трябваше да съм сигурен, че ресурса е освободен за да не се стигне до недостиг и хабене на конекции, които не се използват.
-
Ми най малоумния начин е вместо SQLException (който хронично се игнорва и още не мога да разбера защо са го напраили тоя exception checked) да фащаш просто Exception - тогава си ОК, щото ще хванеш null pointera.
Другия по човешки начин е да си направиш един адаптер на Connection интерфейса с празни методи, да го направиш като singleton. Полсе всеки път като дефинираш референцията con вместо да я инициализираш на null я сетваш на singleton а и така си сигурен че във finally метода тя никога няма да е null.
Ама тфа са глупости... всеки който използва JDBC без да си е написал (или да е взел от някъде) един-два дебели слоя над него си е жив мазохист и си заслужава гърча...
-
Ми най малоумния начин е вместо SQLException (който хронично се игнорва и още не мога да разбера защо са го напраили тоя exception checked) да фащаш просто Exception - тогава си ОК, щото ще хванеш null pointera.
Това е адски неправилно! Ясно, че и ти не го препоръчваш щом го наричаш "малоумен" но аз даже едно време в BYTE четох статия, в която кретените обясняваха че при обход на масив, може да се направи оптимизация за избягване на if-а на всяка итерация и вместо това директно да се обработва ArrayIndexOutOfBoundsException.
От това по-голяма простотия никога не бях чел! Дори да оставим на страна това exploit-ване на синтаксиса, подобна глупост може да напише само някой дето си няма идея как работи един JIT и какво е safe reference.
А пък между другото, времето за хвърляне на Exception е пропорционално на дълбочината на execution point-a в стека. Така че като цяло такъв тип хитруване е пълна глупост.
Поздрави,
Николай Манчев
-
За съжаление аз също доста често срещам грешки във туториалите на Java.Sun и не мога да си обясня как е възможно да допускат подобни неща ??? Това е недопустимо, понеже в повечето случаи грешките са очевидни и могат да се предвидят без дори кода да е компилиран.
-
Ами много просто. Грешките се правят умишлено, за да може начинаещите програмисти, които ги четат, да си купят книжка написана от някой от Сън.
;)
-
То поне в книгите да нямаше :), но и там има доста, особено тези за по-начинаещи. А и туториалите в повечето случаи са написани много по-синтезирано и ясно от книга 700 стр. и са за предпочитане когато искаш да научиш нещо бързо:)
-
Ами много просто. Грешките се правят умишлено, за да може начинаещите програмисти, които ги четат, да си купят книжка написана от някой от Сън.
;)
Ако не беше усмивката отдолу, тоя бисер направо си го вкарвах в колекцията.
-
... Или да се запишат на курс по Джава при Николай Манчев ;)
поздрави:
а.