

ስሕተቶችና አስተራረማቸው
9.1 ምዕላደ-ቃላት
9.2 ስህተቶች
ተቀበልነውም አልተቀበልነውም፥ ፕሮግራም ስንጽፍ ስህተቶች እንሠራለን። ይኸን የሚቃወም ሰው ካለ ራሱ ስህተት መሆን አለበት። ምክንያቱም፥ አንድ ፕሮግራም ከስህተት ወይም ከግድፈት መቶ በመቶ ነጻ መሆኑን ማረጋገጫ መንገድ የለም። የኮምፕዩተር ፕሮግራም ስህተቶች ከድርሰት ጽሑፍ ስህተቶች ጋር ይመሳሰላሉ። የአንድ ጽሑፍ ዐርፍተ-ነገር የሰዋሰውን ሕግ ከጣሰ፥ ትርጕሙ ይዛባል። እንዲሁም ከመዝገበ-ቃላት ውጭ ወይም ተስምቶ የማይታወቅ ቃል ቢያስገባ ጽሑፉ የታሰበውን ሀሳብ ከመግለጽ ይሰናከል ይሆናል። አብዛኛውን ጊዜ ግን፥ አንባቢያን ሁኔታዎችን በማመዛዘን የጽሑፉን አባበል ገምተው ትክክለኛው ነጥብ ላይ ሊደርሱ ይችላሉ። የፕሮግራም ስህተቶች ግን አይምሬ ናቸው። ቢያሻ መታረም አለባቸው፥ አለዛ እንደጥልቀታቸው አበሳ ይፈጥራሉ። ማንነታቸው ከታወቀ፥ ወዲያውኑ መታረም አለባቸው።
በዚህ ጥናት ውስጥ «ስህተት» ወይም «ግድፈት» ስንል የኮምፕዩተር ስህተት ወይም ግድፈት ለማለት ነው። የስህተት ምንጮች፥ የጃቫን የሰዋሰው ሕግ የጣሱ የቃል አገባቦች፥ ግድፈትን ያቀፉ ተውላጠ-ቃላት፥ ጠንቅ ያዘሉ የኮድ ስልቶች፥ እንዲሁም የምንጠቀማቸው መሣሪያዎች ናቸው።
ስህተቶች መቀነሻ አስከትሎ ማረሚያ መንገዶች አሉ። ዋናውና የመጀመሪያው የጸሓፊው አሠራር፥ ጥንቃቄና ሥነ-ሥርዓት ነው። አንድ ኮድ ተጽፎ ለኮምፓይሌሽን ሂደት ከመድረሱ በፊት በወረቀት ላይ በቅደም ተከተል ተመርምሮ፥ ውጤቱ ተጣርቶ፥ መሥራትና አለመሥራቱ መረጋገጥ አለበት። ይህ ደረጃ፥ ልዩ ልዩ ስህተቶችን ለማግኘትና ተገቢውን እርምጃ ለመውሰድ ዕድል ይሰጣል። ክፋቱ፥ ብዙ ፕሮግራም ጸሐፊዎች ይኸን መንገድ መከተላቸው አጠራጣሪ ነው።
ሌላኛው መንገድ፥ የጃቫ ኮምፓይለር አንድ ኮድ ሲመለከት ስህተት ካገኘ እንዲታረም ሲጠይቅ ነው። የጃቫን ሕግ የጣሰ ማንኛውም ንባባዊ ፕሮግራም ለስምሪት የሚያስችለው አካል ላይ እንዲደርስ አይፈቀድለትም። ስህተቶቹን እስኪያርም ድረስ።
ለፕሮግራምነት ከበቃም በኃላ የተጠበቀውን ያህል መሥራትና አለመሥራቱን የማጣራቱ ሂደት እጅግ አስቸጋሪና እርግጠኝነት የጐደለው ነው። ስለዚህ ፕሮግራሙ ከተለያዩ ማእዘኖች አንጻር በጥብቅ መፈተን አለበት። ፕሮግራሙ ስምሪት ላይ እያለ ደረጃ በደረጃ ውስጣዊ ሥራውን መከታተልና የችግሮችን መንስኤ ማፈላለግ እንዲሁም ማረም ይቻላል። የጃቫ ፕሮግራም መገንቢያ አብሮት የሚመጣ «ግድፈት ማረሚያ» (debugger) አለው።
የመጨረሻ እንኳን ባይሆን ሌላኛው ስህተት መፈለጊያና ማረሚያው መንገድ ተጠቃሚው ሕዝብ ነው። በአሁኑ ጊዜ አንድ ፕሮግራም አለቀ ተብሎ በገሀድ ከመሠራጨቱ በፊት በተጠቃሚዎች እንዲሞከር ማድረጉ የታመነበትና ቢቻል በሥራ የሚውል ነው።
9.3 ቅድመ-ስምሪታዊ ስህተቶችና አስተራረማቸው
በቅድመ-ስምሪታዊ ስህተቶች የተበከለ አንድ ንባባዊ-ፕሮግራም ለግንባታ ዝግጁ አይሆንም። ስህተቶች የግድ በመጀመሪያ መታረም አለባቸው። ባለቅድመ-ስምሪታዊ ስህተቶች፥ አብዛኛውን ጊዜ፥ የተሳሳተ ቃል አገባብ፥ የተረሳ ወይም የተዛነፈ ሥርዓተ-ነጥብ፥ ወይም ባለግድፈት ተውላጠ-ቃል ናቸው።
ቀላል ይመስላሉ፤ ግን ዕለታዊ ችግሮች ናቸው። ለምሳሌ ያህል፥ x እና y ቀደም ብለው እንደታወጁ እንውሰድና ይኸን ቃል እንመልከት።
x =+ y ;
ይህ ምስኪን መስሎ የሚታይ ቃል በማይታለፍ ስህተት ተገድፏል። እርማት ሳይደረግ ለጃቫ ኮምፓይለር ከቀረበ በፍጹም ሂደቱን አያልፍም። ስህተቱ የሂሳብ ምልክት አሰካኩ ላይ ሲሆን ትክክለኛው ቃል ይኸን ይመስላል።
x += y ;
ሥርዓተ-ነጠብ መሳት ወይም አላግባብ መጠቀም እንዲሁ የከፋ የስህተቶች መንስኤ ነው። ስንቶቻችን ነን የሚከተለውን ዓይነት ስህተት ደግመን ደጋግመን የምንሠራው?
ብዙ ነን ቢባል ከእውነት አይርቅም። ለዚህ መድኃኒቱ የሚከተሉት ናቸው።
ከዚህ በታች የተሰጠው ምሳሌ ብርቱ ስህተት አለው። የማረሙን ሥራ ለአንባቢው ትተን ወደ ቀጣዩ ክፍል እናመራለን።
9.4 ኧክሴፕሽን፥ የስህተቶች መቆጣጠሪያ፥ መከላከያ
ከላይ እንዳየነው፥ ቅድመ-ስምሪታዊ ስህተቶች ካልታረሙ በስተቀር ወደፊት መንቀሳቀስ አለመቻሉ ግልጽ ነው። የጃቫ ኮምፓይለር ማቆም የሚሳነው የስህተቶች ዓይነትና ቍጥር ብዙ ነው። አንድ ፕሮግራም የኮምፓይል ደረጃ ማለፉ ከስህተት ነፃ አያደርገውም ምንም እንኳን ያ አንድ እርምጃ ቢሆንም። ፕሮግራሙን የመቆፈሩና ስህተቶቹን የማረሙ ሂደት መቀጠል አለበት።
በጃቫ ይነሳሉ ብለን የምናስባቸውን ስህተቶች ከመሆናቸው በፊት የምናገኝበትና እርምጃ የምንወስድበት መንገድ አለ። ተጠቃሚውን ቍጥር አስገባ ብለነው ከቍጥር ፈንታ ኧስትሪንግ ቢያስገባ ምንድን ነው የምናደርገው? የኧስትሪንግ ዴታ የቍጥር ቦታ ውስጥ ማስገባት አይፈቀድልንም። ከሞከርን «ስምሪታዊ ስህተት» ይፈጠራል። የፕሮግራማችን ሂደት ይሰናከላል። እንደዚህ ዓይነት ስህተቶችን ለማቆም መፍትሔው ኧክሴፕሽን ነው።
በተጨማሪ፥ የጃቫን መደቦች ስንጠቀም ስህተት ከተነሳ ችግሩን የሚያስታውቁን ከስህተቱ ጋር የተዛመደውን ኧክሴፕሽን ወደእኛ በመወርወር ነው። የተወረወረውን የኧክሴፕሽን ርቢ ተቀብለን የስህተቱ ዓይነት ካወቅን በኃላ ተገቢውን እርምጃ እንወስዳለን። በመሆኑም፥ የኧክሴፕሽን ስልት ስምሪታዊ ስህተቶችን ለመከታተልና እርምጃ ለመውሰድ ዕድል ይሰጠናል። የቃል አገባቡ ይኸን ይመስላል።
ይህ ምስል የሚያሳየው፥ አንድ ኧክሴፕሽን ሲወረወር እንዴት መያዝ እንዳለበት ነው። ኧክሴፕሽን ወርዋሪና ተቀባዮች ሁልጊዜ የመደብ አባላት መላዎች ናቸው። የጃቫን መደብ ሰንጠቀም ማለትም ርቢ ፈጥረን መላዎቻቸውን ስንጠራ ስህተት ከተፈጠረ፥ ከስህተቱ ጋር የሚዛመድ ኧክሴፕሽን ወደእኛ ይወረውራሉ። የtry ክፍል ማቀፍ ያለበት የመላ ጥሪዎችንና የመሳሰሉትን ነው። የcatch ክፍል እንደ ኧክሴፕሽኑ ዓይነት ስህተት አራሚ ወሳጅ ነው። አንድ ወይም ከአንድ በላይ የcatch ክፍል ይፈቀዳል። የfinally ክፍል ኧክሴፕሽን ቢወረወር ባይወረወርም በሥራ ላይ ይውላል። አማራጭ ስለሆነ የግድ መግባት የለበትም። የጸሐፊው ፈንታ ነው።
ቀጣዩ ምሳሌ የጃቫ Double መደብ አባል የሆነውን አንዱን መላ በኧስትሪንግ መልክ የላከውን ዴታ ወደ double የዴታ ዓይነት እንዲቀይር ይጠራል። ያ መላ የተላከለት የኧስትሪንግ ዴታ ችግር ካለበት ወደ ጠሪው የNumberFormatException ይወረውራል። አያያዙ ምን እንደሚመስል በሜይን መላ ውስጥ ቀርቧል። አንባቢው ምሳሌውን ገንብቶ ውጤቱን ካየ በኃላ፥ ለvalues የተሰየመውን ዕሴት አንዱን ገድፎ፤ ማለት 2.71 ወደ 2.71A ቀይሮ እንደገና ፕሮግራሙን ገንብቶ ለሥራ ቢያሰማራው፥ ተወርዋሪ ኧክሴፕሽኑና ማንነት በግልጽ ይመለከታል።
9.5 የኧክሴፕሽን ዓይነቶች
ሦስት የኧክሴፕሽን ዓይነቶች አሉ፤ ግን እዚህ በሁለቱ ላይ ብቻ እናተኩራለን። እነሱም፥ ውዴታዊ ኧክሴፕሽን (unchecked exception) እና ግዴታዊ ኧክሴፕሽን (checked exception) ናቸው።
ውዴታዊ ኧክሴፕሽኖች (unchecked exceptions) ፕሮግራሞች በሥራ ላይ እያሉ የሚመነጩ፤ ነገር ግን በግዴታ መያዝ ያለባቸው አይደሉም። መላዎች በሥራ ላይ እያሉ ስህተት ተፈጥሮ እንደዚህ ዓይነት ኧክሴፕሽን ከወረወሩ፥ ጠሪው የመቀበል ወይም ያለመቀበል አማራጭ አለው። ለዚህም ነው «ውዴታዊ ኧክሴፕሽን» የምንላቸው።
ከጃቫ ጋር አብረው የሚመጡ የውዴታዊ ኧክሴፕሽኖች ቍጥር ብዙ ከመሆኑም በላይ ሥፍር ቍጥር የሌላቸው የስህተት ዓይነቶች ይወክላሉ። እንዳስፈላጊነታቸው ፕሮግራማችን ውስጥ ለውርወራም ሆነ ለቀበላ መጠቀም እንችላለን። የጃቫ ኤ/ፒ/አይ በጣም ይገለገላቸውም፤ እናም እሱን በተጠቀምን ጊዜ ሁሉ ከእነዚህ ኧክሴፕሽኖች ጋር ጋር በተዘዋዋሪ ሆነ በቀጥታ እንገናኛለን። ከውዴታዊ ኧክሴፕሽኖች መካከል በጣም ጥቂቶቹን እንጥቀስ።
NullPointerException
ይህ ስህተት የሚነሳው ኑል (null) የሆነ ተውላጠ-ቃል መላዎችን ለመጥራት ሲሞክር፤ ኑል የሆነን ኧሬይ የሕዋሳትን ቍጥር ለማወቅ ሙከራ ሲደረግና የመሳሰሉት ናቸው። ቀጣዩ ቃል ይኸን ያሳያል።
int[] numbers = null ;
አንድን ቍጥር በዚሮ ለማካፈል መሞከር ውጤቱ ቀውስ ነው። በሥነ-ሂሳብ ውስጥ በፍጹም ትርጉም የለውም። እንዳጋጣሚ፥ ይህ ሁኔታ ከተከሰተ፥ ጃቫ የሚከተለውን ውዴታዊ ኧክሴፕሽን ይወረውራል።
ArithmeticException
ሌላኛው የኧክሴፕሽን ዓይነት ግዴታዊ ነው፤ ማለትም እንደዚህ ዓይነት ኧክሴፕሽን ወርዋሪ መደብ ከተጠቀምን የመቀበል ግዳጅ አለብን። አሻፈረኝ አማራጭ አይደለም። የጃቫ ኮምፓየለር ግዴታዊ ኧክሴፕሽኖች በሥነ-ሥርዓት መያዛቸውን ሳያረጋግጥ አንድን ፕሮግራም ለግንባታ አያስተላልፍም። ነገሩ የውዴታ ግዴታ ነው። ዴታ ከፋይል የምናነብባቸው የጃቫ መደቦች እንደዚህ ዓይነት ኧክሴፕሽን ወርዋሪ ስለሆኑ መቀበሉ አማራጭ የሌለው ተግባር ነው።
በግዴታዊና ውዴታዊ ኧክሴፕሽኖች መካከል ያለው ልዩነት ግዴታዊው በአግባብ መያዝና አለመያዙን የጃቫ ኮምፓይለር ማረጋገጡ ነው። ይኸንን በትንሹ ለመገንዘብ ይረዳን ዘንድ ቀጣዩን ኮድ እንመርምር። ዴታ ወደ ፋይል ለመጻፍ የተጠቀማቸው መዶቦች ኧክሴፕሽን ከወረወሩ አቀባበሉና እርምጃ አወሳሰዱ እንዴት መሆኑን ይጠቍማል። የተጠቀሰውን ፋይል መፍጠር ካልተቻለ፥ በእርግጥ ኧክሴፕሽን ይነሳል።
Copyright © 2002-2005 Senamirmir Project