2017-02-21 337 views
1

什麼Java編譯消息:「錯誤:不兼容的類型:void不能轉換爲...」是什麼意思?

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

平均值,我怎麼解決它。

(這是爲了對經常混淆新的Java程序員,而不是在各種不同的「類型轉換」,人們可以在Java中遇到的問題的教程非常具體的編譯錯誤信息的規範Q &一個。)

+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方法指示線指示的位置檢測問題。問題的根本原因不一定就在那一行,但那是編譯器已經知道是錯誤的地方。

  • 這是一個類型錯誤 - 因此是「不兼容類型」的短語。

  • 不兼容涉及兩種類型:voidint
  • 編譯器認爲該代碼需要從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

這就是「void can not be assigned to ...」錯誤消息確實是的意思。編譯器告訴我們,代碼嘗試使用已聲明的方法的結果不返回任何結果。這是不可能的。 Java語言不允許您「使用空值」來使用。


存在兩種可能的方式,使編譯錯誤消失:

  1. 我們可以改變方法的聲明,以便它返回一個值。例如:

    private static int add(int a, int b) { 
        int res = a + b; 
        return res; 
    } 
    
  2. 我們可以改變通話網站,使其不會嘗試喲使用(不存在)的返回值。例如:

    add(1, 1); 
    

在這個例子中,這兩種方法會做到這一點。但只有一種方法(第一種方法)使代碼按預期的工作。

相關問題