|
ИЗКЛЮЧИТЕЛНА СИТУАЦИЯ
При изпълнението на програма може да възникнат грешки (при излизане извън обема на масив; при опит на променлива от даден тип да бъде присвоена стойност от друг тип и т.н.). Когато възникне такава грешка (или има вероятност да възникне), казваме че е налице т.нар. изключителна ситуация. Компилаторът следи за обработката на изключителните ситуации и програмистът е длъжен да осигури тяхната обработка (т.е. как да постъпи компютъра, ако възникне съответната изключителна ситуация). По този начин обработката на изключителни ситуации в Java е част от създаването на програмата. Съществуват два типа изключителни ситуации – системни и определени от програмиста. При работа с изключителни ситуации се използват следните понятия – генериране на ситуация, прихващане на ситуация и обработка на ситуация. Прихващане и обработка Прихващането на ситуация и нейната обработка се извършва с помощта на конструкцията – try-catch-finally, включваща три програмни блока. Последният блок finally се използва рядко. Типичната конструкция се състои от първите два блока и има следният вид: CODE
Пр. 1 Опитайте се да компилирате следната проста програма: CODE
В резултат на компилацията ще бъде открита грешка, че изключителната ситуация “IOException” не е прихваната: CODE
Първо решение: CODE
Второ решение: CODE
Блокът catch е организиран като функция, получаваща обект от тип изключителна ситуация. Областта на видимост на обекта е само в блока catch. Блокът catch се изпълнява само, ако настъпи съответната ситуация, т.е. в кода на try се генерира обект от тип, съвпадащ с типа на параметъра в catch. В противен случай (при нормална ситуация) след последния оператор в блока try се изпълнява първият оператор след конструктура try-catch. В случай на един оператор е допустимо изпускане на фигурните скоби. Пр. 2 try System.in.read(); catch (IOException e); //празен оператор в частта catch Името на параметъра в блока catch не може да съвпада с никое от имената на локалните променливи! Генериране на изключителна ситуация Генерирането на системна изключителна ситуация се извършва от системата, а на потребителска – с оператора throw . Този оператор се поставя в програмния код на блока try, на мястото, където не може да продължи нормалното изпълнение на програмата. При използването му с оператора new се генерира обект от тип <изключителна ситуация>. Пр. 3 CODE
В класа изключителна ситуация може да се дефинират конструктори и при настъпване на ситуация да се предават параметри на обекта. Задача 1 Да се организира клас, представляващ масив от цели числа, така че да се обработват следните изключителни ситуации: грешен размер на масива при неговата дефиниция и индексиране извън границите на масива. Проектиране: За да се обработват тези две ситуации, необходимо е за всяка от тях да се дефинира клас, разширяващ класа Exception. При втората ситуация е добре да се предава и индексът, при който тя е настъпила. За тази цел трябва да се въведат два класа, единият от коите е тривиален. Програмиране: CODE
Разучете програмата. Забележете, че методът example на класа Example обработва ситуацията Range, но се освобождава и прехвърля на извикващият го метод main ситуацията Size. Методите ArrayOfInteger и get, в които настъпват ситуациите (генерират се обектите) се освобождават от тях. В случай, че не се зададе ключовата дума throws след параметрите, компилаторът ще сигнализира за грешка. Прехвърлянето на обработката на една изключителна ситуация на извикващия метод от извиквания става с поставяне на името й в заглавния ред на метод: CODE
Въведете и стартирайте горната програма. След това променете и пак стартирайте програмата последователно, както следва: първо, обръщението e.example(-1) на e.example(10) в метода main и второ int x = array.get(0) в метода example на int x = array.get(1). Ако е необходимо двете ситуации да се обработват в example, програмният код на класа Example ще изглежда така: CODE
Блокът finally Блокът finally позволява задаване на програмен код, който да се изпълнява винаги при напускане на конструктцията try-catch. Това изначава, че независимо дали настъпва ситуация или не след try (при нормална работа) и след catch (при настъпила ситуация) се изпълнява кодът от блока finally. Йерархия на класа Exception • Изключение се нарича неочаквано събитие (грешка) в програмата • В рамките на програмата вие определяте изключенията като класове • За да започне търсене на изключения се използва оператора try • За да прихване конкретно изключение, програмата използва оператора catch • За да предизвика изключение в момента на възникване на грешка, програмата използва оператора throw • Когато програмата прихване изключение, тя го обработва РАБОТА С ТЕКСТОВЕ Компютрите не биха имали толкова широко приложение, ако с тяхна помощ се обработваха само числови данни. В ежедневните си дейности човек най-често си служи с текстове. Компютрите са незаменими помощници в този вид дейност, особено когато се налага обработка на големи по обем текстове. Например при търсене на литературни източници в електронни библиотечни каталози или търсене на думи в електронни речници, при превод на текстове (романи, научни издания, новини) от един естествен език на други др. Тип знаков низ Низът е подредена съвкупност от краен брой знакове. Броят на елементите на даден низ се нарича дължина на низа. Важно свойство на низовете е, че броят на знаковете, т.е. дължината на низа, може да се променя по време на обработката на структурата в програмата. Основните операции за работа със знакови низове са конкатенация (слепване), сравнение, намиране на подниз, вмъкване на низ в друг, изтриване на подниз, намиране на дължината на низ, преобразуване на елементите (знаците) на низа и анализ на знаците. а) конкатенация – операция между два знакови низа (отбелязва се с +), в резултат на която се получава нов низ, съдържащ елементите на първия, следвани от елементите на втория. б) сравнение – сревнението се извършва на лексико-графичен принцип. То се извършва знак по знак, като се започне от първите. Ако съответните знаци не са равни, за по-малък се взема този с по-малък код. В случай на съвпадение, се преминава на следващия. Ако при това елементите на един низ се изчерпят, той е подниз на другия и е по-малък. в) операции за промяна на съдържанието на низ – съдържанието на низ може да се промени с вмъкване на низ или изтриване на подниз. Особености на представянето на знаковите низове в Java Знаковите низове в Java се представят с обекти. Съществуват два вида знакови низа – класовете String и StringBuffer. Първият се използва за константни знакови низове и веднъж създадени, те не могат да се променят. Вторият осигурява възможност за работа със знакови низове, променящи стойността и дължината си по време на изпълнение на програмата. Всички обекти в Java трябва да се създават явно с помощта на оператора new. За създаване на два типа обекти, обаче има особен синтаксис. Единият бе разгледан в тема 13 – това е масивът. Другият е знаковият низ String. Когато в програма се срещне серия от знаци – текст, заградени в кавички, компилаторът създава автоматично обект от тип String и го инициализира с текста. Последното е еквивалентно на създаване на обект с new. Пр. 1: “Пловдив” // е еквивалентно на new String(“Пловдив”); Операторът “+” предизвиква конкатенация на знакови низове, когато такива се явяват левият и десният операнд. Ако единият операнд на оператора “+” е низ, то другият автоматично се преобразува в знаков низ и тогава се прави сливането. Вградените типове данни в Java автоматично се преобразуват в низове, докато за обектите това е невъзможно. Във всеки клас е реализиран методът toString(), който се използва при необходимост за преобразуване на обекта в знаков низ. Знаков низ с фиксирана дължина – клас String След като се създаде един обект от тип String той неможе да се променя. Той представлява икономично представяне на знаков низ с фиксирана дължина. Типът String е последен (final) и не може да се препокрива. Методите му позволяват обработка на отделни знаци, сравнение, търсене, извличане на подниз, създаване на копие и други операции, извършвани без модификация на оригинала. Конструктори Типът поддържа множество конструктори, позволяващи създаването на знаков низ от друг обект от тип String и StringBuffer или от масив от знаци. Конструктор Създава обект от: CODE
Общи методи • public String toString(); //връща като резултат самия //обект • public char[] toCharArray(); //връща масив от знаци, //съотвестващи на знаците от обекта • public int length(); //връща дължината на знаковия низ // т.е. броя знаци • public char charAt(int index); // връща знак, разположен // на позиция index Методи за сравняване CODE
Методи за намиране на позиция на данни в знаков низ: Следните методи връщат първата позиция на срещане на зададения знак или знаков низ, като се започне търсене от началото на низа. Ако не се срещне, методите връщат минус 1. когато се използва с допълнителен параметър fromIndex, търсенето започва не отначало, а от зададената позиция: CODE
Следните методи връщат първата позиция на срещане на зададения знак или знаков низ като се започне търсене от края към началото на низа. Ако не се срещне, методите връщат минус единица (-1). Когато се използва с допълнителен параметър fromIndex, търсенето започва не от края, а от зададената позиция: CODE
1. Обект CODE
2. Други данни CODE
Извикване на метод Знаковите низови константи се представят с обекти. Поради това е възможно директното прилагане върху тях на методи и получаване на техния резултат. Обикновено това се използва за сравняване: Пр. 2 CODE
Изразът “add”.equals(x)) е еквивалентен на x.equals(“add”). Знаков низ с променлива дължина – клас StringBuffer Обектите от тип StringBuffer са като обектите от тип String, но могат да бъдат изменяни. Промяната може да бъде както в съдържанието на низа, така и в неговата дължина. Този тип се нарича знаков низ с променлива дължина. Неговото представяне заема повече ресурси в сравнение с типа String. Методите на тип StringBuffer позволяват добавяне и вмъкване на знаци в него, както и промяна на дължината на буфера. StringBuffer се характеризира с две величини – дължина на буфера и дължина на низа. Конструктори Съществуват три конструктора - за създаване на празен буфер, за създаване на буфер със зададена дължина и за създаване на буфер от знаков низ с фиксирана дължина: CODE
Пр. 3 CODE
Метод за генериране на знаков низ с фиксирана дължина CODE
Методи за работа с дължината на низа и големината на буфера CODE
Методи за работа със знаци на низа CODE
Метод за добавяне в края на низа Параметърът на този метод се преобразува до знаков низ (подобно на String.valueOf) и знаците от този низ се добавят в края на низа от обекта StringBuffer. Всички методи връщат самия обект като резултат, което е удобно за създаване на съставни операции. • public StringBuffer append (Object obj); • public StringBuffer append (String str); • public StringBuffer append (char[] str); • public StringBuffer append (char[] str, int offset, int len); • public StringBuffer append (boolean b); • public StringBuffer append (char c); • public StringBuffer append (int i); • public StringBuffer append (long l); • public StringBuffer append (float f); • public StringBuffer append (double d); Реализация на конкатенацията (добавянето, слепването) Този тип се използва за реализация на конкатенацията при създаване на нов знаков низ. Пр. 4 CODE
Метод за вмъкване на определена позиция в низа Параметърът на този метод се преобразува до знаков низ (подобно на String.valueOf) и знаците от този низ се вмъкват в зададената позиция в SringBuffer. Всички методи връщат самия обект като резултат, което е удобно за създаване на съставни операции. CODE
Пр. 5 CODE
Въвеждане на знаков низ от клавиатурата В показания по-долу клас readString се извършва въвеждане на знаков низ от клавиатурата до натискане на клавиша Enter, при което знаците последователно се записват в обект от тип StringBuffer. Cлед това той се преобразува до знаков низ от тип String. CODE
Изключителни ситуации При използване на методите на обектите от тип знаков низ е възможно да възникнат изключителни ситуации. Необходимо е програмистите да осигурят обработката на тези ситуации: 1. IndexOutOfBoundsException – при опит да се прочете (запише) знак на позиция, която не съществува т.е. тази позиция е по-голяма от дължината на низа или е зададено отрицателно число. 2. NegativeArraySizeException – при опит да се създаде буфер с отрицателна големина. 3. NullPointerException – при опит да се промени или използва неинициализиран обект.
| ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||









