2017-02-21 4 views
1

Что делает компиляции Java сообщение:Что означает «Ошибка: Несовместимые типы: void нельзя преобразовать в ...»?

"Error: Incompatible types: void cannot be converted to ..." 

среднее, и как я могу это исправить.

(Предполагается, что это каноническое Q & А при очень конкретном сообщении об ошибке компиляции, которая часто путает новые Java-программист, а не учебник по различным различным «преобразованию типа» проблемы, которые можно встретить в Java.)

+0

Не может 'void' также быть' ... '? Или даже дошли до сообщения ClassCastException? –

+0

@ cricket_007 'ClassCastException'? У вас есть что-то в виду, которое на самом деле будет компилироваться и сбой во время выполнения, включая метод «void»? (Я не знаю, что вы имеете в виду с вашим комментарием) – Tom

+0

@ cricket_007 - 1) Я разработал этот вопрос и задание, чтобы быть конкретным для случая «void». 2) Опять же, я не хочу, чтобы это был учебник по всем возможным ошибкам компиляции типов и ошибок времени выполнения. –

ответ

3

Рассмотрим следующий пример:

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 не позволяет вам «вытащить значение из эфира» для использования.


Есть потенциально два способа сделать ошибку компиляции уйти:

  1. Мы могли бы изменить объявление метода, так что он возвращает значение. Например:

    private static int add(int a, int b) { 
        int res = a + b; 
        return res; 
    } 
    
  2. Мы могли бы изменить место вызова, так что он не пытается использовать йо (несуществующий) возвращаемое значение. Например:

    add(1, 1); 
    

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

Смежные вопросы