Javanın IQ-ü neçədir? Javada Unreachable Code

Aytaj Dadashova
Kodera
Published in
3 min readJul 8, 2018

Unreachable code nədir?

Kompüter proqramlaşdırılmasında “Unreachable code” (Əlçatmaz kod) dedikdə proqram kodunun elə bir hissəsi nəzərdə tutulur ki, o heç vaxt yerinə yetirilə bilmir.

Unreachable code əksər hallarda arzuolunmaz nəticələrə səbəb olduğu üçün lazımsız sayılır:

· Əlavə yaddaş sahəsi zəbt edir

· CPU təlimatlar keşində təlimatların anlamsız saxlanması, hansıki eyni zamanda yaddaş sahəsini azaldır.

· Və s.

Java proqramlaşdırmada hər bir statement proqramın müəyyən axışında heç olmasa bir dəfə yerinə yetirilməlidir. Əgər bunun əksi baş verərsə Unreachable Statement erroru ilə qarşılaşırıq. Javada Unreachable code compile time errordur. Yəni, Java kodu runetmədən belə, hətta bəzən bizim gözümüzdən qaçsa belə, həmin kodun heç vaxt yerinə yetirilməyəcəyini əvvəlcədən biləcək qədər ağıllıdır:) (Və biz bu erroru düzəltmədən kodu runedə bilmərik)

Nümunəyə baxaq:

Bu kodda biz compile time error alırıq. Çünki, bu koda heç bir proqram axışında çatmaq mümkün deyil. Əgər boolean b-nin qiyməti “ true” olarsa, ifşərti yerinə yetiriləcək və returnolunacaq. Əks halda elsehissəsinə keçiləcək və returnediləcək. Yəni, hər iki halda proqram print hissəsini yerinə yetirə bilmir. Beləliklə biz İDE-də “Unreachable Statement” erroru alırıq.

Bəs Dead Code nədir?

Dead Code (Ölü kod) da həmçinin unreachable code sayılır, lakin bu kod compile time error vermir və warning (xəbərdarlıq) etməklə kifayətlənir.

Nümunəyə baxaq:

Burada ifoperatorunun şərt hissəsi həmişəlik trueolaraq qeyd edilib. Beləliklə, biz “ ifşərti hər zaman true-dur.” xəbərdarlığını alırıq.

İndi isə yuxardakı kodda kiçik bir dəyişiklik edək, ifblokunu whiledövrəsi ilə əvəzləyib compile edək.

Bu nümunə bizə compile time error verir: Unreachable code. Bəs niyə compilyator ifəvəzinə while görəndə fikrini dəyişdi?

Buna səbəb, Javada müxtəlif kod blokları ( if, while, try, catchconstructor və s.) üçün Unreachable code induvidial olaraq təyin edilməsidir. Java dilinin spesifikasiyasına əsasən ifbloku üçün bu formatda unreachable kod “dead kod” sayılır və compilyator buna dair error vermir.

Başqa bir maraqlı məqama toxunaq: Bildiyimiz kimi Javada finaldəyişənləri mövcuddur. Belə ki, finalaçar sözü ilə təyin edilmş bu dəyişənlərin initialize edilməsi mütləqdir və yalnız bir dəfə initialize edilə bilər. Yəni, proqramın heç bir yerində biz finaldəyişənə yeni qiymət mənimsədə bilmərik. Bəzən proqram kodlarında final dəyişənlər sayəsində unreachable code-a dair çox maraqlı nümunələr ortaya çıxır.

Nümunəyə nəzər yetirək:

Biz bu nümunədə “Unreachable code” erroru ilə qarşılaşırıq. Lakin, biz əgər final açar sözünü adəyişənindən yığışdırsaq proqram runolacaq. Bəs buna səbəb nədir?

Buna səbəb a dəyişəninin finalolaraq elan edilməsidir. finaldəyişənə bəzən “compile time constant” deyilir. Belə ki, normal dəyişənlərə qiymət mənimsədərkən compile vaxtı onlar üçün yaddaş sahəsi ayrılır. Onlara mənimsətdiyimiz qiymət isə proqramın runedilməsi vaxtı yerinə qoyulur. Lakin, finaldəyişənlərdə elə compile vaxtı mənimsədilən dəyər dəyişən üçün ayrılmış yaddaş sahəsinə yazılır. Bu səbəbdən biz final dəyişəni yalnız bir dəfə initialize edə bilərik.

Yuxarıdakı nümunədə “Unreachable statement” erroru almağımıza səbəb də elə budur. Belə ki, Java final olaraq elan edilmiş dəyişənin proqramın heç bir yerində dəyişdirilə bilməyəcəyini və beləliklə while dövrəsinin şərt hissəsinin hər zaman “true” olacağını öncədən bilir. Və bizə xəta göstərir.

Deyə bilərsiniz ki, biz a dəyişənini final elan etməsək belə a = 2 olduğundan whiledövrəsinin şərt hissəsi hər zaman “true”-dir. Bəli, elədir. Lakin, bu halda dəyişən final elan edilmədiyindən Java dəyişənin qiymətinin proqramın hər hansı bir yerində dəyişdirilə biləcəyini fərz edir və bizə “condition a<5 is always true” xəbərdarlığı verməklə kifayətlənir. Qeyd edək ki, bu kod “Dead code” sayılır:)

Beləliklə, sizcə Javanın İQ-sü neçədir? Java nə qədər ağıllıdır?:)

Mənbələr:

--

--