前言
2016校园招聘季,正在复习 java,想使用 javac
、 java
、javap
等命令分析String s = "a" + "b" + "c" + "d"
会创建几个对象,没想到执行java
命令总是报错。
本文链接 http://www.alijava.com/javac-error/ 转载请注明出处
代码
|
|
Main.java
是在 Eclipse 工程下的util
包里(注意就是这个 util
包的影响!!)
javac
在目录src/util
执行 javac
,没有问题
|
|
javac
命令的使用方式是javac [文件名(带后缀名 .java)]
java
命令是java [文件名(不带后缀名)]
javap 字节码反编译
依然在目录src/util
下执行javap
|
|
反编译主要是分析上面的String s = "a" + "b" + "c" + "d";
由上面的#2 = String #16 // abcd
可知:"a" + "b" + "c" + "d"
只创建了一个对象,因为"a""b""c""d"
等都是字符串常量,对于常量,在编译时候直接存储这几个常量拼接后的结果。
java
用惯了 Eclipse,想试下命令行输出,没想到执行java
命令却老是报错
|
|
报了一堆问题,看网上的答案说可能是 CLASSPATH 的问题。
试验 TomChens-MBP:util tomchen$ java -classpath . Main
还是不行。
怀疑可能是环境变量的问题,mac 的环境变量和 windows 有区别。
Mac 设置 JAVA_HOME 和 PATH
设置 JAVA_HOME
,网上找到一个方法,该方法的优点是没有把JAVA_HOME
写死:
|
|
对于 CLASSPATH
,网上大多意见是:不要设置全局的环境变量,每个应用会自己设置。有点疑惑?
- Mac OS X (Unix/Linux)中,路径分隔符是冒号(:)
- Windows是分号(;)
但是设置了环境变量还是没能解决上述的问题。
package 的原因
后来看到一篇文章,发现要在 src
目录下执行 java 命令,而不是在/src/util
下执行。
|
|
可以看到,用util.Main
或者util/Main
指定包名都可以。
如果不是在src
执行,而是在 src/util
执行java util/Main
,还是会报错
|
|
总结与思考
javac
命令与 java
命令的区别
javac
命令,在src
下执行javac util/Main.java
可以,在src/util
下执行javac Main.java
也可以。- 执行
java
命令需在 包的上层目录(比如包util
的上层目录:src
),并且类名前面要带上包名。因为Java存在类名相同但包名不同的情况,比如java.awt.List
和java.util.List
,包名+类名才能唯一识别某个类。 - javac是一个平台命令,它对具体的平台文件进行操作,要指明被编译的文件路径。
- java是一个虚拟机命令,它对类操作,即对类的描述要用点分的描述形式,并且不能加扩展名,还要注意类名的大小写。