2016-02-05 50 views
9

我有一個小的java文件給出如下。在cmd中編譯但在Netbeans中不存在錯誤

class abc{ 
    public static void main(String args[]){ 
     Object a= 9; 
     int b= (int)a; 
     System.out.print(b); 
    } 
} 

它給出錯誤,而在cmd中而不是在Netbeans的編譯。另外,當我用'(Integer)a'替換'(int)a'時,它會在cmd和Netbeans上編譯和運行。

class abc{ 
    public static void main(String args[]){ 
     Object a= 9; 
     int b= (Integer)a; 
     System.out.print(b); 
    } 
} 

這是什麼原因,我該如何解決這個問題?

編輯:顯示了在編譯第一個代碼是錯誤:

C:\Users\ANKIT.ANKITSHUBHAM-PC>javac abc.java 
    abc.java:4: inconvertible types 
    found : java.lang.Object 
    required: int 
          int b= (int)a; 
             ^
    1 error 

編輯:這個問題是不是鑄造。這是關於爲什麼當我使用'(int)'將對象轉換爲int時,爲什麼cmd和Netbeans的行爲會有所不同,但使用'(Integer)'時轉換的行爲相同。

+0

您可以請發佈錯誤。我認爲這是因爲NetBeans的行爲很明智,並直接糾正了你的錯誤。 – ctst

+1

[如何將一個對象轉換爲一個int在java?](http://stackoverflow.com/questions/3661413/how-to-cast-an-object-to-an-int-in-java) 。前面的代碼僅在Java 7+中有效;我猜你的netbeans使用的是較老的編譯器。 –

+0

@ctst我發佈了錯誤。 –

回答

2

這樣做的原因淡漠行爲是Netbeans的是使用Java 7,但CMD仍然使用Java 6.使用「(INT)」的鑄造Java 6中是不允許的,但被允許在Java 7中

如何從cmd使用Java 7? 答:

  1. 打開 '我的電腦'
  2. 點擊 '系統屬性' 的頂部標籤。
  3. 單擊左側窗格中的「高級系統設置」。
  4. 點擊'環境變量...'按鈕。
  5. 會有兩個部分;我們很困擾那個標題爲「系統變量」的文件

  6. 選擇'PATH'並點擊Edit按鈕。

  7. 添加java 7的javac地址。在我的情況下,它是「C:\ Program Files \ Java \ jdk1.7.0_79 \ bin」。它包含javac.exe
  8. 單擊確定。

    現在嘗試從cmd運行。希望它有效!

0

這是因爲您不能將Object投射到原始類型的數據。在第二個代碼示例中,您實際上會將Object轉換爲Integer,然後將其解包爲原始文件int

9

這裏發生:

Object a= 9; 

是:

  • int與價值9創建
  • 它用包裹在一個Integer自動裝箱
  • 它被存儲在一個變量類型Object

現在,在下一行,Object不能轉換爲intJava 6中,因爲它實際上是一個Integer,而不是基本類型。但是,它可以投射到Integer,然後自動拆箱負責從此Integer中提取int


現在到「爲什麼它在Netbeans中工作?」

Netbeans使用與命令行 javac不同的編譯器(請參閱 here)。它的行爲可能與 javac不同,它的行爲方式與 javac不同,可能會更寬容 - 當它遇到將其投射到 int的企圖時,它可能會自動取消打開 Integer

按照另一個答案,Java 7的支持自動拆箱在這種情況下,因此可能的原因是你的命令行javac是從Java 6,而你的NetBeans使用Java 7的編譯器(或更高版本)。

+0

如何在cmd中使用Netbeans使用的編譯器? –

+0

我不知道你是否可以這樣做,但我認爲你不應該那樣做 - 畢竟你正在編寫一個Java程序,所以它應該可以通過標準的Java編譯器進行編譯。 –

+0

但是使用(int)進行投射也是標準的,因爲我在某處讀到Java 7允許此格式與'(Integer)'分開。 –

5

我會說這是由於不同的編譯器版本(或來源合規水平):

$ javac abc.java -source 1.6 
warning: [options] bootstrap class path not set in conjunction with -source 1.6 
abc.java:4: error: incompatible types: Object cannot be converted to int 
     int b= (int)a; 
        ^
1 error 
1 warning 
$ javac abc.java -source 1.8 
$ java abc 
9 

看起來這是在Java 7中見this question和相關答案所做的更改。

看看其他一些答案,我認爲指出你的代碼是完全有效的Java 7代碼是非常重要的。

你不需要NetBeans編譯器,我只是說從Oracle網站安裝Java 8就完成了。你只需要擔心你的代碼是否需要在Java 6上運行,在這種情況下你的代碼需要向後兼容。

2

您無法將Object轉換爲原始類型的數據,也許NetBeans爲您做了一個框。你在兩種環境下使用什麼java版本進行編譯?

相關問題