Особенности java 8

Введение в обработку исключений

Последнее обновление: 30.10.2015

Нередко в процессе выполнения программы могут возникать ошибки, при том необязательно по вине разработчика. Некоторые из них трудно
предусмотреть или предвидеть, а иногда и вовсе невозможно. Так, например, может неожиданно оборваться сетевое подключение при передаче файла.
Подобные ситуации называются исключениями.

В языке Java предусмотрены специальные средства для обработки подобных ситуаций. Одним из таких средств является конструкция try…catch…finally.
При возникновении исключения в блоке try управление переходит в блок catch, который может обработать
данное исключение. Если такого блока не найдено, то пользователю отображается сообщение о необработанном исключении, а дальнейшее выполнение
программы останавливается. И чтобы подобной остановки не произошло, и надо использовать блок try..catch. Например:

int[] numbers = new int;
numbers=45;
System.out.println(numbers);

Так как у нас массив numbers может содержать только 3 элемента, то при выполнении инструкции консоль отобразит
исключение, и выполнение программы будет завершено. Теперь попробуем обработать это исключение:

try{
    int[] numbers = new int;
	numbers=45;
	System.out.println(numbers);
}
catch(Exception ex){
    
	ex.printStackTrace();
}
System.out.println("Программа завершена");

При использовании блока try…catch вначале выполняются все инструкции между операторами try и catch.
Если в блоке try вдруг возникает исключение, то обычный порядок выполнения останавливается и переходит к инструкции сatch.
Поэтому когда выполнение программы дойдет до строки , программа остановится и перейдет к блоку

Выражение catch имеет следующий синтаксис: .
В данном случае объявляется переменная , которая имеет тип . Но если возникшее исключение не
является исключением типа, указанного в инструкции сatch, то оно не обрабатывается, а программа просто зависает или выбрасывает
сообщение об ошибке.

Но так как тип является базовым классом для всех исключений, то выражение
будет обрабатывать практически все исключения. Обработка же исключения в данном случае сводится к выводу на консоль стека трассировки ошибки с
помощью метода , определенного в классе Exception.

После завершения выполнения блока catch программа продолжает свою работу, выполняя все остальные инструкции после блока catch.

Конструкция try..catch также может иметь блок . Однако этот блок необязательный, и его можно при обработке исключений
опускать. Блок выполняется в любом случае, возникло ли исключение в блоке try или нет:

try{
    int[] numbers = new int;
	numbers=45;
	System.out.println(numbers);
}
catch(Exception ex){
    
	ex.printStackTrace();
}
finally{
    System.out.println("Блок finally");
}
System.out.println("Программа завершена");

Обработка нескольких исключений

В Java имеется множество различных типов исключений, и мы можем разграничить их обработку, включив дополнительные блоки catch:

int[] numbers = new int;
try{
    numbers=45;
    numbers=Integer.parseInt("gfd");
}
catch(ArrayIndexOutOfBoundsException ex){
            
    System.out.println("Выход за пределы массива");
}
catch(NumberFormatException ex){
            
    System.out.println("Ошибка преобразования из строки в число");
}

Если у нас возникает исключение определенного типа, то оно переходит к соответствующему блоку catch.

Оператор throw

Чтобы сообщить о выполнении исключительных ситуаций в программе, можно использовать оператор throw. То есть с помощью
этого оператора мы сами можем создать исключение и вызвать его в процессе выполнения. Например, в нашей программе происходит ввод числа, и
мы хотим, чтобы, если число больше 30, то возникало исключение:

package firstapp;

import java.util.Scanner;
public class FirstApp {

    public static void main(String[] args) {
       
        try{
            Scanner in = new Scanner(System.in);
            int x = in.nextInt();
            if(x>=30){
               throw new Exception("Число х должно быть меньше 30");
           }
        }
        catch(Exception ex){
            
            System.out.println(ex.getMessage());
        }
        System.out.println("Программа завершена");
    }   
}

Здесь для создания объекта исключения используется конструктор класса Exception, в который передается сообщение об исключении. И если
число х окажется больше 29, то будет выброшено исключение и управление перейдет к блоку catch.

В блоке catch мы можем получить сообщение об исключении с помощью метода .

НазадВперед

Change out of System.out.println

‘out’ object can be customized. out gets initialized by java runtime environment at startup and it can be changed by developer during execution. Instead of standard output, in default cases when you run a program through command line, the output is printed in the same command window. We can change that behavior using method as below. In the following example, I have redirected the output to a text file in the same directory.

public class ChangeOut {
	public static void main(String args[]) {
		try {
			System.setOut(new PrintStream(new FileOutputStream("log.txt")));
			System.out.println("Now the output is redirected!");
		} catch(Exception e) {}
	}
}

JSON

Сериализация и Десериализация

JSON — невероятно удобный и полезный синтаксис для хранения и обмена данными. Java полностью поддерживает это.

Прим. перев. Для использования JSON из примера необходимо подключить библиотеку JSON Simple.

Вы можете сериализовать данные следующим образом:

Получается следующая строка JSON:

Десериализация в Java выглядит так:

Используемый в примере файл JSON (jsonDemoFile.json):

Прим. перев. В Java проектах очень часто для работы с JSON используют библиотеки Gson от Google или Jackson. Обе библиотеки очень популярны и хорошо поддерживаются. Попробуйте и их.

2 Перехват исключений try-catch

В Java есть механизм перехвата исключений, который позволяет прекратить аварийное завершение методов. Выглядит он так:

Эта конструкция называется блок .

Код, в котором могут возникнуть исключения, оборачивается в фигурные скобки, перед которыми пишется слово (пытаться).

После фигурных скобок пишется ключевое слово , внутри круглых скобок объявляется переменная типа-исключения. Затем следуют фигурные скобки, внутри которых пишется код, который нужно выполнить, если возникло исключение указанного типа.

Если во время выполнения «основного кода» исключений не возникло, код внутри блока catch выполняться не будет. Если же исключение возникло, будет (при условии, что тип возникшего исключения совпадает с типом переменной в круглых скобках).

Пример:

Код Вывод на экран

System.out.println and Performance

There is a general notion that System.out.println are bad for performance. When we analyze deeply, the sequence of calls are like println -> print -> write() + newLine(). This sequence flow is an implementation of Sun/Oracle JDK. Both write() and newLine() contains a block. Synchronization has a little overhead, but more than that the cost of adding characters to the buffer and printing is high.

When we run a performance analysis, run multiple number of System.out.println and record the time, the execution duration increases proportionally. Performance degrades when we print more that 50 characters and print more than 50,000 lines.

It all depends on the scenario we use it. Whatever may be the case, do not use System.out.println for logging to stdout.

3 Факты о методах

Вот еще несколько фактов о методах:

Факт 1. Метод — это всегда часть класса.

Метод можно объявить только в классе.  Метод нельзя объявить внутри другого метода. Метод нельзя объявить вовне класса.

Факт 2. Имя метода не несет сакрального смысла

Неважно, как называются методы — это ни на что не влияет. Метод main — это такой же метод, как и все остальные

Просто такое имя выбрали для метода, с которого Java-машина начинает исполнение программы. Ничего волшебного в нем нет.

Факт 3. Порядок методов в классе не важен

Вы можете написать ваши методы в классе в любом порядке — это никак не повлияет на выполнение программы. Пример:

Код

Факт 4. Переменные внутри одного метода никак не связаны с переменными других методов

Что происходит в Вегасе, остается в Вегасе. А переменные, объявленные внутри метода, остаются внутри этого метода.

В двух соседних методах могут быть объявлены одинаковые переменные, и эти переменные никак не связаны друг с другом.

Что такое класс System в Java?

Системный является одним из базовых классов в Java и принадлежит пакету java.lang. Класс System является финальным и не предоставляет общедоступных конструкторов. Из-за этого все члены и методы, содержащиеся в этом классе, являются статическими по природе.

Таким образом, вы не можете наследовать этот класс для переопределения его методов. Поскольку класс System  имеет множество ограничений, существуют различные предварительно созданные поля и методы класса. Ниже я перечислил несколько важных функций, поддерживаемых этим классом:

  • Стандартный ввод и вывод.
  • Ошибка вывода потоков.
  • Доступ к внешним свойствам и переменным среды.
  • Встроенная утилита для копирования части массива.
  • Предоставляет средства для загрузки файлов и библиотек.

1 Потоки данных

Любая программа редко существует сама по себе. Обычно она как-то взаимодействует с «внешним миром». Это может быть считывание данных с клавиатуры, отправка сообщений, загрузка страниц из интернета или, наоборот, загрузка файлов на удалённый сервер.

Все эти вещи мы можем назвать одним словом — процесс обмена данными между программой и внешним миром. Хотя это уже не одно слово.

Сам процесс обмена данными можно разделить на два типа: получение данных и отправка данных. Например, вы считываете данные с клавиатуры с помощью объекта — это получение данных. И выводите данные на экран с помощью команды — это отправка данных.

Для описания процесса обмена данными в программировании используется термин поток. Откуда вообще взялось такое название?

В реальной жизни им может быть поток воды или поток людей (людской поток). В программировании же под потоком подразумевают поток данных.

Потоки — это универсальный инструмент. Они позволяют программе получать данные откуда угодно (входящие потоки) и отправляют данные куда угодно (исходящие потоки). Делятся на два вида:

  • Входящий поток (Input): используется для получения данных
  • Исходящий поток (Output): используется для отправки данных

Чтобы потоки можно было «потрогать руками», разработчики Java написали два класса: и .

У класса есть метод , который позволяет читать из него данные. А у класса есть метод , который позволяет записывать в него данные. У них есть и другие методы, но об этом после.

Байтовые потоки

Что же это за данные и в каком виде их можно читать? Другими словами, какие типы данных поддерживаются этими классами?

О, это универсальные классы, и поэтому они поддерживают самый распространённый тип данных — . В можно записывать байты (и массивы байт), а из объекта можно читать байты (или массивы байт). Все — никакие другие типы данных они не поддерживают.

Поэтому такие потоки еще называют байтовыми потоками.

Особенность потоков в том, что данные из них можно читать (писать) только последовательно. Вы не можете прочитать данные из середины потока, не прочитав все данные перед ними.

Именно так работает чтение с клавиатуры через класс : вы читаете данные с клавиатуры последовательно: строка за строкой. Прочитали строку, прочитали следующую строку, прочитали следующую строку и т.д. Поэтому метод чтения строки и называется (дословно — «следующая срока»).

Запись данных в поток тоже происходит последовательно. Хороший пример — вывод на экран. Вы выводите строку, за ней еще одну и еще одну. Это последовательный вывод. Вы не можете вывести 1-ю строку, затем 10-ю, а затем вторую. Все данные записываются в поток вывода только последовательно.

Символьные потоки

Недавно вы изучали, что строки — второй по популярности тип данных, и это действительно так. Очень много информации передается в виде символов и целых строк. Компьютер отлично бы передавал все в виде байт, но люди не настолько идеальны.

Java-программисты учли этот факт и написали еще два класса: и . Класс — это аналог класса , только его метод читает не байты, а символы — . Класс соответствует классу , и так же, как и класс , работает с символами (), а не байтами.

Если сравнить эти четыре класса, мы получим такую картину:

Байты (byte) Символы (char)
Чтение данных
Запись данных

Практическое применение

Сами классы , , и в явном виде никто не использует: они не присоединены ни к каким внешним объектам, из которых можно читать данные (или в которые можно писать данные). Однако у этих четырех классов много классов-наследников, которые умеют очень многое.

The format Method

The method formats multiple arguments based on a format string. The format string consists of static text embedded with format specifiers; except for the format specifiers, the format string is output unchanged.

Format strings support many features. In this tutorial, we’ll just cover some basics. For a complete description, see
in the API specification.

The
example formats two values with a single invocation:

public class Root2 {
    public static void main(String[] args) {
        int i = 2;
        double r = Math.sqrt(i);
        
        System.out.format("The square root of %d is %f.%n", i, r);
    }
}

Here is the output:

The square root of 2 is 1.414214.

Like the three used in this example, all format specifiers begin with a and end with a 1- or 2-character conversion that specifies the kind of formatted output being generated. The three conversions used here are:

  • formats an integer value as a decimal value.
  • formats a floating point value as a decimal value.
  • outputs a platform-specific line terminator.

Here are some other conversions:

  • formats an integer as a hexadecimal value.
  • formats any value as a string.
  • formats an integer as a locale-specific month name.

There are many other conversions.

Note: 

Except for and , all format specifiers must match an argument. If they don’t, an exception is thrown.

In the Java programming language, the escape always generates the linefeed character (). Don’t use unless you specifically want a linefeed character. To get the correct line separator for the local platform, use .

In addition to the conversion, a format specifier can contain several additional elements that further customize the formatted output. Here’s an example,
, that uses every possible kind of element.

public class Format {
    public static void main(String[] args) {
        System.out.format("%f, %1$+020.10f %n", Math.PI);
    }
}

Here’s the output:

3.141593, +00000003.1415926536

The additional elements are all optional. The following figure shows how the longer specifier breaks down into elements.

Elements of a Format Specifier.

The elements must appear in the order shown. Working from the right, the optional elements are:

  • Precision. For floating point values, this is the mathematical precision of the formatted value. For and other general conversions, this is the maximum width of the formatted value; the value is right-truncated if necessary.
  • Width. The minimum width of the formatted value; the value is padded if necessary. By default the value is left-padded with blanks.
  • Flags specify additional formatting options. In the example, the flag specifies that the number should always be formatted with a sign, and the flag specifies that is the padding character. Other flags include (pad on the right) and (format number with locale-specific thousands separators). Note that some flags cannot be used with certain other flags or with certain conversions.
  • The Argument Index allows you to explicitly match a designated argument. You can also specify to match the same argument as the previous specifier. Thus the example could have said:

Переменные и константы

Последнее обновление: 12.04.2018

Для хранения данных в программе предназначены переменные. Переменная представляет именованную область памяти, которая хранит значение определенного типа.
Каждая переменная имеет тип, имя и значение. Тип определяет, какую информацию может хранить переменная или диапазон допустимых значений.

Переменные объявляются следующим образом:

тип_данных имя_переменной;

Например, определим переменную, которая будет называться x и будет иметь тип :

int x;

В этом выражении мы объявляем переменную x типа . То есть x будет хранить некоторое число не больше 4 байт.

В качестве имени переменной может выступать любое произвольное название, которое удовлетворяет следующим требованиям:

  • имя может содержать любые алфавитно-цифровые символы, а также знак подчеркивания, при этом первый символ в имени не должен быть цифрой

  • в имени не должно быть знаков пунктуации и пробелов

  • имя не может быть ключевым словом языка Java

Кроме того, при объявлении и последующем использовании надо учитывать, что Java — регистрозависимый язык, поэтому следующие объявления
и будут представлять две разных переменных.

Объявив переменную, мы можем присвоить ей значение:

int x;		// объявление переменной
x = 10;		// присвоение значения
System.out.println(x); 	// 10

Также можно присвоить значение переменной при ее объявлении. Этот процесс называется инициализацией:

int x = 10;		// объявление и инициализация переменной
System.out.println(x); 	// 10

Если мы не присвоим переменной значение до ее использования, то мы можем получить ошибку, например, в следующем случае:

int x;
System.out.println(x);

Через запятую можно объявить сразу несколько переменных одного типа:

int x, y;
x = 10;
y = 25;
System.out.println(x); 	// 10
System.out.println(y); 	// 25

Также можно их сразу инициализировать:

int x = 8, y = 15;
System.out.println(x); 	// 8
System.out.println(y); 	// 15

Отличительной особенностью переменных является то, что мы можем в процессе работы программы изменять их значение:

int x = 10;
System.out.println(x); 	// 10
x = 25;
System.out.println(x); 	// 25

Ключевое слово var

Начиная с Java 10 в язык было добавлено ключевое слово var, которое также позволяет определять переменную:

var x = 10;
System.out.println(x); 	// 10

Слово ставится вместо типа данных, а сам тип переменной выводится из того значения, которое ей присваивается. Например,
переменной x присваивается число 10, значит, переменная будет представлять тип int.

Но если переменная объявляется с помощью var, то мы обязательно должны инициализировать ее, то есть предоставить ей начальное значение, иначе мы получим ошибку, как,
например, в следующем случае:

var x;		// ! Ошибка, переменная не инициализирована
x = 10;

Константы

Кроме переменных, в Java для хранения данных можно использовать константы. В отличие от переменных константам можно присвоить
значение только один раз. Константа объявляется также, как и переменная, только вначале идет ключевое слово final:

final int LIMIT = 5;
System.out.println(LIMIT); 	// 5
// LIMIT=57; // так мы уже не можем написать, так как LIMIT - константа

Как правило, константы имеют имена в верхнем регистре.

Константы позволяют задать такие переменные, которые не должны больше изменяться. Например, если у нас есть переменная для хранения числа pi,
то мы можем объявить ее константой, так как ее значение постоянно.

НазадВперед

Статический класс

Класс можно сделать статическим, только если он является вложенным классом. Вложенный статический класс не нуждается в ссылке на Outer. В этом случае статический класс не может получить доступ к нестатическим членам класса Outer. Давайте рассмотрим пример, чтобы понять, как это работает

public class NestedExample{
private static String str= "Edureka"
//Static class
static class MyNestedClass{
//non-static method
public void disp(){
System.out.println(str);
}
}
public static void main(String args[]){
NestedExample.MyNestedClass obj = new NestedExample.MyNestedClass();
obj.disp();

}

Когда вы выполняете приведенный выше код, ваш вывод выглядит так:

Методы системного класса

Всего в классе java.lang.System объявлено 28 встроенных методов.

Метод Описание
static void arraycopy (Object src, int srcPos, Object dest, int destPos, int length) Помогает копировать массив из указанного исходного массива, начиная с указанной позиции до указанной позиции целевого массива.
static String clearProperty (ключ String) Помогает удалить системное свойство, указанное указанным ключом.
Консоль static static () Помогает вернуть любой доступный уникальный объект консоли, связанный с текущей JVM.
статическое длинное currentTimeMillis() Помогает вернуть текущее время в миллисекундах
выход из статической пустоты (статус int) Помогает завершить текущую JVM
статическая пустота gc() Этот метод помогает в запуске сборщика мусора
статическая карта <String, String> getenv() Помогает в возврате неизменяемой строковой карты текущей системы
static String getenv (имя строки) Помогает в получении значения указанной переменной среды
статические свойства getProperties () Помогает в определении текущих свойств системы
статическая строка getProperty (строковый ключ) Помогает получить системное свойство, указанное указанным ключом.
статическая строка getProperty (ключ строки, строка определения) Помогает получить системное свойство, указанное указанным ключом.
статический SecurityManager getSecurityManager () Помогает получить интерфейс безопасности системы
static int identityHashCode (Object x) Помогает возвращать тот же хэш-код для данного объекта, значение которого будет похоже на метод по умолчанию hashCode (), независимо от переопределения класса данного объекта hashCode ()
статический Канал унаследованный канал () Помогает в возврате канала, который унаследован от объекта, создавшего JVM.
статическая строка lineSeparator () Помогает в возврате системно-зависимой строки разделителя строк.
статическая пустая нагрузка (строковое имя файла) Помогает в загрузке файла кода с указанным именем файла из локальной файловой системы в виде динамической библиотеки.
static void loadLibrary (строковое имя_библиотеки) Помогает в загрузке системной библиотеки, указанной аргументом libname
статическая строка mapLibraryName (строковое имя_библиотеки) Помогает в отображении имени библиотеки в специфическую для платформы строку, представляющую собственную библиотеку
статический длинный nanoTime () Помогает возвращать текущее значение работающего источника времени высокого разрешения JVM в течение наносекунд
static void runFinalization () Помогает в выполнении методов завершения любых объектов, ожидающих завершения
static void setErr (PrintStream err) Помогает переназначить «стандартный» поток вывода ошибок
статическая пустота setIn (InputStream in) Помогает переназначить «стандартный» поток ввода
static void setOut (PrintStream out) Помогает переназначить «стандартный» поток вывода
static void setProperties (Свойства реквизита) Помогает в настройке системных свойств для аргумента Свойства
статическая строка setProperty (строковый ключ, строковое значение) Помогает в настройке системного свойства, указанного указанным ключом
static void setSecurityManager (SecurityManager s) Помогает в настройке безопасности системы
static void runFi nalizersOnExit (логическое значение) Устаревшее

5 Ввод данных с консоли

Вводить данные с клавиатуры, когда у нас есть объект типа , очень легко.

Чтобы считать с клавиатуры строку, нужна команда:

Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет сохранено в переменную .

Чтобы считать с клавиатуры число, нужна команда:

Тут все аналогично предыдущей команде. Когда программа дойдет до выполнения этой строки, она приостановится и будет ждать, пока пользователь введет данные и нажмет клавишу enter. После этого все, что ввел пользователь, будет преобразовано в число и сохранено в переменную .

Если пользователь ввел данные, которые невозможно преобразовать в целое число, в программе возникнет ошибка, и она завершится.

Чтобы считать с клавиатуры дробное число, нужна команда:

Эта команда полностью аналогична команде , только она проверяет, что введенные данные можно преобразовать в число .

Пример программы, которая считывает с клавиатуры два числа и выводит их сумму:

Примечание

Пользователь может ввести несколько чисел в одной строке, разделив их пробелами: такая ситуация будет корректно обработана методами класса . Однако числа будут считаны программой только после того, как пользователь нажмет .

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *

Adblock
detector