Примитивные типы данных
Вопрос 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".