
Java_Lecture3.ppt
- Количество слайдов: 39
Обработка исключений Типы ошибок Ошибки компиляции Времени выполнения (run-time errors, exceptions, исключения) Логические ошибки if (flag == 1) n=0; else n=1; val=1/n; 1
Обработка исключений Исключение в Java — это объект некоторого класса, который описывает исключительное состояние, возникшее в каком-либо участке программного кода. При возникновении исключения исполняющая система Java создает объект класса, связанного с данным исключением. Этот объект хранит информацию о возникшей исключительной ситуации (точка возникновения, описание и т. п. ) Возможна как автоматическая так и программная генерация исключений. 2
Обработка исключений Формат try-catch блока try { // блок кода } catch (Exception. Type 1 еx. Ob 1) { // обработчик исключений типа Exception. Type 1 } [catch (Exception. Type 2 еx. Ob 2) { // обработчик исключений типа Exception. Type 2 }] [finally { //код, который выполняется перед выходом из блока try }] 3
Обработка исключений Формат try-catch блока try { read_from_file ("data. txt"); calculate(); } catch ( File. Not. Found. Exception fe ) { System. out. println("Файл data. txt не найден"); } catch ( Arithmetic. Exception aex ) { System. out. println("Деление на ноль"); } 4
Обработка исключений Формат try-catch блока • управление никогда не возвращается из блока catch обратно в блок try, после выполнения catch-блока управление передается строке, следующей сразу после try-catch-блока; • область видимости catch-блока ограничена ближайшим предшествующим утверждением try, т. е. catch-блок не может захватывать исключение, выброшенное «не своим» try-блоком; • операторы, контролируемые утверждением try, должны быть окружены фигурными скобками даже если это одиночная инструкция. • блоки try могут быть вложенными 5
Обработка исключений Стек вызовов Если обработчик не найден исключение передается JVM. 6
Обработка исключений Классы исключений никогда не обрабатываются обязательно обрабатывать можно не обрабатывать (но рекомендуется) 7
Обработка исключений Классы исключений Catch-блоки просматриваются в порядке их появления в программе, при этом обработчик catch для суперкласса перехватывает исключения как для своего класса так и для всех его подклассов. Следовательно, в последовательности catch-блоков подклассы исключений должны следовать перед любым из суперклассов. 8
Обработка исключений Классы исключений try {input. File("data. txt"); calculate(); } catch ( IOException Ex. Obj 2) File. Not. Found. Exception Ex. Obj 1) {System. out. println("Файл data. txt не найден"); {System. out. println("Ошибка ввода-вывода"); } } Error: catch ( File. Not. Found. Exception Ex. Obj 1) IOException Ex. Obj 2) {System. out. println("Ошибка ввода-вывода"); unreachable code! {System. out. println("Файл data. txt не найден"); } } т. к. File. Not. Found. Exception – подкласс IOException 9
Обработка исключений Оператор throw Программная генерация исключения: throw new <Exception. Class. Name>(); throw new <Exception. Class. Name>(“…”); 10
Обработка исключений Оператор throw public void demoproc () {try {throw new Null. Pointer. Exception("demo"); } catch (Null. Pointer. Exception e) {System. out. println("caught inside demoproc"); throw e; } } public static void main(String args[]) {try {demoproc(); } catch(Null. Pointer. Exception e) {System. out. println("recaught: " + e); } } 11
Обработка исключений Оператор throw Вывод программы: 12
Обработка исключений Оператор throws Исключения, которые порождены от Exception, но не от Runtime. Exception, могут быть сгенерированы только явно операцией throw. При этом если метод может выбрасывать одно из таких исключений, то должно выполняться одно из двух условий: либо для такого исключения должен быть catch-обработчик, либо в заголовке такого метода должна стоять конструкция: throws <Exception. Class. Name> (т. н. Catch or Specify Requirement) public String read. Line() throws IOException 13
Обработка исключений Оператор throws Вызов метода, в описании которого стоит " throws. . . ", тоже должен находиться либо внутри try-catch-блока, либо внутри метода с конструкцией " throws. . . " в его заголовке и т. д. вплоть до метода main(). Таким образом, где-то в программе любое возможное исключение, попадающее в категорию Catch or Specify Requirement обязано быть перехвачено и обработано. 14
Обработка исключений Подклассы Exception class My. Exception extends Exception {private int detail; My. Exception(int a) {detail = a; } public String to. String() {return "My. Exception[" + detail + "]"; } } Если надо создать исключение необязательное к перехвату – его надо унаследовать от Runtime. Exception. 15
Консольный ввод-вывод Байтовые и символьные потоки Аналогично языку С++ ввод/вывод в языке Java выполняется с использованием потоков. Поток ввода/вывода - это некоторый условный канал, по которому отсылаются и получаются данные. В Java 2 реализованы 2 типа потоков: байтовые и символьные. Байтовые потоки предоставляют удобные средства для обработки, ввода и вывода байтов или других двоичных объектов. Символьные потоки используются для обработки, ввода и вывода символов или строк в кодировке Unicode. Все классы для консольного I/O – пакет java. io: import java. io. *; 16
Консольный ввод-вывод Байтовые потоки 17
Консольный ввод-вывод Байтовые потоки. Абстрактный класс Input. Stream. public abstract int read() throws IOException Читает 1 байт из вх. потока. Результат в младшем байте. public int read (byte[ ] b) throws IOException Читает послед-ть байт в массив b[ ]. Возвращает колво прочитанных байт или -1. public int read (byte[ ] b, int Заполняет массив с off, int len) throws указанного байта, читает не IOException более len символов public long skip (long n) throws IOException Пропускает n байт в потоке int available () Возвращает кол-во доступных байт в потоке. void close () Закрывает поток ввода. 18
Консольный ввод-вывод Байтовые потоки. Класс File. Input. Stream(String name) throws File. Not. Found. Exception File. Input. Stream (File file) throws File. Not. Found. Exception В классе File. Input. Stream переопределяется большая часть методов класса Input-Stream (в т. ч. абстрактный метод read() ). Когда создается объект класса File. Input. Stream, он одновременно с этим открывается для чтения. 19
Консольный ввод-вывод Байтовые потоки. Класс File. Input. Stream. import java. io. *; System. out. println("Still Available: " + fp. available()); System. out. println("Total Still Available: " + fp. available()); class File. Input. Test System. out. println("Skipping another 1/4: skip()"); System. out. println("Reading the next 1/4: read(b[ ])"); {public static void main(String args[ ]) throws Exception fp. skip(size/4); byte b[ ] = new byte[size/4]; {int size; System. out. println("Still Available: " + fp. available()); if (fp. read(b) == -1) Input. Stream fp = new File. Input. Stream("File. Input. Test. java"); System. out. println("Reading 1/8 into the end of array"); {System. out. println("End of File"); } sizeif=(f 1. read(b, b. length-size/8, size/8) == -1) fp. available(); for (int i=0; i < size/4; i++) System. out. println("Total Available Bytes: " + size); {System. out. println("End of File”); } {System. out. print((char) b[i]); } System. out. println("First 1/4 Available: "read()"); System. out. println("Still of the file: + f 1. available()); for (int i=0; i < } fp. close(); size/4; i++) {System. out. print((char) fp. read()); } } 20
Консольный ввод-вывод Байтовые потоки. Класс Byte. Array. Input. Stream – это реализация входного потока, в котором в качестве источника используется массив типа byte. У этого класса два конструктора, каждый из которых в качестве первого параметра требует байтовый массив. Byte. Array. Input. Stream(byte array[ ]) Byte. Array. Input. Stream(byte array[ ], int start, int num. Bytes) 21
Консольный ввод-вывод Байтовые потоки. Класс Byte. Array. Input. Stream. import java. io. *; class Byte. Array. Test {public static void main(String args [ ]) throws IOException {byte b[ ] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; Byte. Array. Input. Stream input 1 = new Byte. Array. Input. Stream(b); Byte. Array. Input. Stream input 2 = new Byte. Array. Input. Stream(b, 0, 3); } } 22
Консольный ввод-вывод Байтовые потоки. Абстрактный класс Output. Stream. public abstract void write (int b) Записывает 1 байт в выходной throws IOException поток. public void write (byte[ ] b) throws IOException Записывает в поток массив байт public void write (byte[ ] b, int off, int len) throws IOException Записывает часть массива в поток (len элементов начиная с элемента off) public void flush() throws IOException Немедленно выталкивает из буфера в поток все что накоплено в буфере. public void close() throws IOException Закрывает поток. 23
Консольный ввод-вывод Байтовые потоки. Класс File. Output. Stream можно применять для записи байтов в файл. У класса File. Output. Stream есть 3 конструктора: File. Output. Stream (String file. Path) throws File. Not. Found. Exception File. Output. Stream (File file. Obj) throws File. Not. Found. Exception File. Output. Stream (String file. Path, boolean append) throws File. Not. Found. Exception - file. Path – полное имя файла, - file. Obj – объект типа File, который описывает файл - append (=true – добавление информации в существующий файл) 24
Консольный ввод-вывод Байтовые потоки. Класс File. Output. Stream. try {File. Input. Stream Source = new File. Input. Stream("infile. dat"); File. Output. Stream Dest = new File. Output. Stream("outfile. dat"); int c; while ((c = Source. read()) != -1) {Dest. write(c); } } catch (File. Not. Found. Exception ex) {… } finally {Source. close(); Dest. close(); } 25
Консольный ввод-вывод Байтовые потоки. Класс Byte. Array. Output. Stream( ); - 32 байта Byte. Array. Output. Stream(int num. Bytes); Метод, записывающий содержимое одного потока в другой: public void write. To(Output. Stream out) throws IOException byte buf [ ] = {‘a’, ’b’, ’c’, ’d’}; Byte. Array. Output. Stream b = new Byte. Array. Output. Stream(); b. write(buf); File. Output. Stream f = new File. Output. Stream(“result. txt”); b. write. To(f); 26
Консольный ввод-вывод Символьные потоки. В Java символы хранятся в кодировке Unicode. Символьный поток I/O автоматически транслирует Символы между форматом Unicode и локальной кодировкой, пользовательского ПК. 27
Консольный ввод-вывод Символьные потоки. 28
Консольный ввод-вывод Символьные потоки. Методы классов Reader и Writer аналогичны методам классов Input. Stream и Output. Stream с той разницей, что все аргументы типа byte заменены на аргументы типа char. Классы Char. Array. Reader и Char. Array. Writer соответствуют классам Byte. Array. Input. Stream и Byte. Array. Output. Stream с той же разницей. Классы File. Reader и File. Writer являются символьными версиями потоковых классов File. Input. Stream и File. Output. Stream. 29
Консольный ввод-вывод Символьные потоки. Классы Input. Stream. Reader и Output. Stream. Writer – переходники между байтовыми и символьными потоками. Байтовый поток используется для физического ввода-вывода, а символьный поток преобразует байты в символы с учетом кодировки. Input. Stream. Reader (Input. Stream obj) Output. Stream. Writer (Output. Stream out) 30
Консольный ввод-вывод Буферизованный ввод-вывод. В библиотеке Java имеются также буферизованные потоки I/O. Для буферизованных потоков операции чтения и записи происходят с буфером, находящимся в памяти. Когда буфер пуст выполняется реальная операция чтения из потока, когда буфер полон – реальная операция записи в поток. Буферизация может быть добавлена к любому байтовому либо символьному потоку с помощью специальных классов «оболочек» (“wrappers”). При этом конструктору буферизованного потока передается не буферизованный поток. 31
Консольный ввод-вывод Буферизованный ввод-вывод. Буферизованные потоки I/O: Buffered. Input. Stream, Buffered. Output. Stream байтовые Buffered. Reader, Buffered. Writer – символьные Конструкторы: Buffered. Input. Stream(Input. Stream in) Buffered. Output. Stream(Output. Stream out) Buffered. Reader(Reader in) Buffered. Writer(Writer out) 32
Консольный ввод-вывод Пример организации консольного ввода-вывода В пакете java. lang есть класс с именем System. В классе System определены три переменные: public static Input. Stream in; public static Print. Stream out; public static Print. Stream err; System. out и System. err – байтовые потоки, эмулирующие поддержку локального character set ! System. in – байтовый поток ! 33
Консольный ввод-вывод Пример организации консольного ввода int a; String str; Buffered. Reader br = = new Buffered. Reader( new Input. Stream. Reader( System. in ) ); Буферизованный Символьный поток Байтовый поток ввода str = br. read. Line(); a = Integer. parse. Int(str); 34
Консольный ввод-вывод Пример организации консольного вывода Класс Print. Stream содержит методы print() и println() для всех базовых типов данных. Т. о. для консольного вывода надо вызвать System. out. print() или System. out. println() System. out. println (“Значение а = ” +а); System. out. print (str); 35
Консольный ввод-вывод Класс Scanner начиная с JSDK 1. 5 import java. util. Scanner; … Scanner sc = new Scanner(System. in); … System. out. println(“Input a: ”); int a = sc. next. Int(); System. out. println(“Input str: ”); String str = sc. next(); Подробнее см. http: //docs. oracle. com/javase/1. 5. 0/docs/api/index. html? java/util/Scanner. html 36
Консольный ввод-вывод Класс File представляет имя файла, но не сам файл (если файл не существует, он не создается, если существует с ним можно проводить производить операции через объект File) ! Конструкторы: public File(String pathname) public File(String pathname, String filename) public File (File parent, String child) 37
Консольный ввод-вывод Класс File public boolean exists() Существует ли файл? public boolean can. Read() Возможен ли доступ на чтение? public boolean can. Write() Возможен ли доступ на запись public boolean is. Hidden() Является ли файл скрытым? public boolean is. File() Файл? public boolean is. Directory() Каталог? public boolean delete() Удаляет файл, если он существует. Каталог удаляется только если он пуст. public String[ ] list() Возвращает список файлов в каталоге 38
Консольный ввод-вывод Класс File public boolean mkdir() Создает пустой каталог public boolean rename. To (File new. Name) Переименование файла public boolean set. Read. Only() Устанавливает атрибут Read. Only 39
Java_Lecture3.ppt