Рассмотрим следующий пример:
public class Test {
private static void add(int a, int b) {
int res = a + b;
}
public static void main(String[] args) {
int sum = add(1, 1);
}
}
Когда я компилирую это с помощью javac
(Java 8), я получаю следующее сообщение об ошибке компиляции.
$ javac Test.java
Test.java:7: error: incompatible types: void cannot be converted to int
int sum = add(1, 1);
^
1 error
Ошибка компиляции фактически говорит нам несколько вещей:
Компилятор обнаружил проблему в указанном месте на указанной линии в методе main
. Основная причина проблемы не обязательно в этой строке, но именно здесь компилятор выяснил, что что-то не так..
Это ошибка типа - следовательно, фраза «несовместимые типы».
- Несовместимость включает в себя два типа:
void
и int
.
- Компилятор считает, что для этого кода требуется преобразование от
void
к int
... и это невозможно.
Так что же это void
тип? Наилучшим образом, вы, скорее всего, узнали, что Java поддерживает два типа типов: примитивные типы и ссылочные типы. Тип void
- ни один из этих. Это «тип» означает «нет ценности». (Если вы считаете типы наборами значений, то void
является пустым набором.)
Основное использование для типа void
используется в объявлениях методов. Посмотрите на объявление метода add
выше. Обратите внимание, что мы объявили add
с подписью:
private static void add(int a, int b)
Эта подпись гласит, что метод add
принимает два int
методы и возвращает void
. Это означает, что метод ничего не вернет.
... Но мы назвали его так:
int sum = add(1, 1);
Это ожидает, что add
вызов возвращает int
значение, которое мы присваиваемое sum
.
Это то, что «пустота не может быть назначен ...» сообщение об ошибкедействительно средства. Компилятор сообщает нам, что код пытается использовать результат объявленного метода, чтобы вернуть результат. Это невозможно. Язык Java не позволяет вам «вытащить значение из эфира» для использования.
Есть потенциально два способа сделать ошибку компиляции уйти:
Мы могли бы изменить объявление метода, так что он возвращает значение. Например:
private static int add(int a, int b) {
int res = a + b;
return res;
}
Мы могли бы изменить место вызова, так что он не пытается использовать йо (несуществующий) возвращаемое значение. Например:
add(1, 1);
В этом примере, либо подход позволил бы сделать это. Но только один подход (первый) делает код работы по назначению.
Не может 'void' также быть' ... '? Или даже дошли до сообщения ClassCastException? –
@ cricket_007 'ClassCastException'? У вас есть что-то в виду, которое на самом деле будет компилироваться и сбой во время выполнения, включая метод «void»? (Я не знаю, что вы имеете в виду с вашим комментарием) – Tom
@ cricket_007 - 1) Я разработал этот вопрос и задание, чтобы быть конкретным для случая «void». 2) Опять же, я не хочу, чтобы это был учебник по всем возможным ошибкам компиляции типов и ошибок времени выполнения. –