Примитивные типы данных

Вопрос 1

Что будет, если попытаться откомпилировать и запустить следующий код?

char ch = '\u041f';

System.out.println(ch);

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

в. Код откомпилируется и программа отработает без ошибок.

Переменную типа char можно инициализировать 3 способами:

  • собственно символом: char ch = 'a';

  • номером символа в таблице символов: char ch = 97;

  • unicode-кодом символа: char ch = '\u041f';

Строго говоря, первый и третий способ по сути — одно и то же.

Вопрос 2

Дан следующий код:

byte[] nums = {10,20,100,120};

byte sum = 0;


for(int i = 0; i < nums.length; i++) {

sum += nums[i];

}


if((sum > 128) || (sum < -127)) {

System.out.println("Overflow detected");

} else {

System.out.println("There was no overflow");

}

В цикле for в переменную sum записывается сумма элементов массива nums. Далее происходит проверка на переполнение типа byte. Выводимое сообщение зависит от того, вышла ли полученная сумма за границы типа.

Что выведет в консоль приведённый код:

а. Код выпадет в ошибку во время выполнения.
б. Код выведет в консоль фразу: Overflow detected
в. Код выведет в консоль фразу: There was no overflow

в. Код выведет в консоль фразу: There was no overflow

Данный код ни при каких обстоятельствах не выведет фразу Overflow detected. Какими бы ни были исходные данные.

Сумма элементов массива сохраняется в переменную sum типа byte. Это означает, что по мере накопления суммы если и будут происходить переполнения, то анализируя значение самой переменной это определить будет невозможно. Поскольку переменная типа byte, чтобы с ней ни происходило в течение времени её существования, условие if((sum > 128) || (sum < -127)) для неё никогда не выполнится.

Чтобы данный код работал так, как ожидается, переменная sum должна быть более широкого типа, например, int.

Вопрос 3

Что будет, если попытаться откомпилировать и запустить следующий код?

class Test {

Boolean isPossible;


public boolean checkPossible() {

return isPossible;

}


public static void main(String[] args) {

System.out.println(new Test().checkPossible());

}

}

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

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

Поле isPossible класса Test объявлено Boolean (с заглавной буквы). Хоть Boolean и является классом обёрткой над примитивом boolean, то это всё равно объектный тип данных, а значит поле по умолчанию инициализируется значением null, а не false.

Таким образом, при попытке привести null к примитиву boolean во время выполнения метода checkPossible возникнет исключительная ситуация NullPointerException.

Вопрос 4

Что будет, если попытаться откомпилировать и запустить следующий код?

char[] charArray = new char[2];

charArray[0] = 'a';

charArray[1] = 'a';


System.out.println(charArray);

а. Код не откомпилируется.
б. Код откомпилируется, но во время выполнения вылетит исключение.
в. Код откомпилируется, отработает и выведет в консоль что-то наподобие [C@55f96302.
г. Код откомпилируется, отработает и выведет в консоль "aa".

г. Код откомпилируется, отработает и выведет в консоль "aa".

Код полностью валидный, поэтому он откомпилируется и отработает без проблем.

Метод System.out.println() перегружен таким образом, чтобы принимать в качестве параметра массив char и выводить его на консоль именно как последовательность символов. Поэтому на консоли будет напечатано "aa".