Java 在cmd中编译而不是在Netbeans中编译时出错

Java 在cmd中编译而不是在Netbeans中编译时出错,java,netbeans,Java,Netbeans,我有下面给出的一个小java文件 class abc{ public static void main(String args[]){ Object a= 9; int b= (int)a; System.out.print(b); } } 它在cmd中编译时出错,但在Netbeans中编译时出错。此外,当我用(整数)a替换“(int)a”时,它在cmd和Netbeans上编译并运行良好 class abc{

我有下面给出的一个小java文件

    class abc{
    public static void main(String args[]){
        Object a= 9;
        int b= (int)a;
        System.out.print(b);
    }
}
它在cmd中编译时出错,但在Netbeans中编译时出错。此外,当我用(整数)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)”强制转换时,cmd和Netbeans的行为相同。

这是因为您无法将
对象强制转换为原始数据类型。在第二个代码示例中,实际上您正在将
对象
强制转换为
整数
,然后将其展开为primitive
int

,这里发生了什么:

Object a= 9;
是:

  • 创建值为
    9
    int
  • 它使用自动装箱包装在一个
    整数中
  • 它存储在
    Object
现在,在下一行,
对象
在Java6中不能强制转换为
int
,因为它实际上是一个
整数
,而不是一个基本类型。但是,它可以强制转换为
整数
,然后自动取消装箱将负责从该
整数
中提取
int


现在来看“为什么它在Netbeans中工作?”

Netbeans使用与命令行
javac
不同的编译器(请参阅)。它的行为方式可能与
javac
不同,并且更具容错性-当它遇到试图将其强制转换为
int
时,可能会自动取消对
整数的绑定


根据另一个答案,Java 7在这种情况下支持自动取消绑定,因此可能的原因是您的命令行
javac
来自Java 6,而您的Netbeans使用Java 7编译器(或更高版本)。

我认为这是由于不同的编译器版本(或源代码遵从性级别):

这似乎是Java7中的一个变化。请参阅和相关的答案

看看其他一些答案,我认为有必要指出您的代码是完全有效的Java7代码


您不需要NetBeans编译器,我想说的是,只要从Oracle网站安装Java8,您就完成了。您只需要担心代码是否需要在Java 6上运行,在这种情况下,您的代码将需要向后兼容。

您无法将对象强制转换为原始数据类型,可能NetBeans会为您提供一个框。在这两种环境中,您使用什么java版本进行编译?

这种不相干行为的原因是Netbeans使用的是java 7,而cmd仍然使用java 6。在Java6中不允许使用“(int)”进行强制转换,但在Java7中允许使用

如何从cmd使用Java7? 答复:

  • 打开“我的电脑”

  • 单击顶部的“系统属性”选项卡

  • 单击左窗格上的“高级系统设置”

  • 单击“环境变量…”按钮

  • 将有两个部分;我们为标题为“系统变量”的问题而烦恼

  • 选择“路径”并单击编辑按钮

  • 添加Java7的javac地址。在我的例子中,它是“C:\ProgramFiles\Java\jdk1.7.0\U 79\bin”。它包含javac.exe

  • 单击“确定”

    现在尝试从cmd运行。希望它能起作用


  • 你能把错误贴出来吗。我认为这是因为NetBeans行为聪明,可以直接纠正您的错误。前面的代码仅在Java7+中有效;我猜您的netbeans使用的是旧的编译器。@ctst我已经发布了错误。@AndyTurner不,我不这么认为。我知道如何将对象强制转换为int。这是一个关于为什么cmd和Netbeans的行为不同的问题。我有根据的猜测是,要么Netbeans直接告诉编译器将代码解释为
    intb=(Integer)a
    或者甚至
    intb=(int)(整数)a
    或使用他们自己的编译器,该编译器知道如何处理此问题(就像您将强制转换(整数)并直接取消其装箱)。但这只是一个黑暗中的机会。编辑:我应该先阅读Jiri的答案。我如何使用cmd中Netbeans使用的编译器?我不知道你是否可以这样做,但我认为你不应该这样做-你毕竟在编写Java程序,所以它应该可以由标准Java编译器编译。但是使用(int)强制转换也是标准的,因为我在某个地方读到,Java7允许这种格式,而不是“(Integer)”。因为Java7已经存在了一段时间,所以可以肯定地说您的代码是标准Java。语言在不断发展。在Java 6编译器上编译
    new ArrayList()
    时也会遇到同样的问题。@AnkitShubham请看Vlad的答案,关于Netbeans能够编译它的原因,我的观点是正确的。您想要的是在命令行上使用Java7(或更高版本)编译器,而不是Netbeans编译器。
    $ 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