Ubuntu终端编译Java代码时Long.parseLong报错的原因咨询
问题描述
编写了一个演示Long.parseLong用法的Java程序,在BlueJ中运行可正常输出结果。但在Ubuntu终端使用javac编译时,仅将main方法修改为标准的public static void main(String args[])后,出现cannot find symbol错误,提示找不到Long.parseLong方法;而使用java.lang.Long.parseLong则编译运行正常,咨询该差异现象的原因。
程序代码
import java.lang.*; public class LongDemo { public void main() { // parses the string argument long a = Long.parseLong("1452"); long b = Long.parseLong("26"); long c = Long.parseLong("54"); long m = a * b * c; System.out.print("Value after multiplying = " + m); } }
编译错误信息
LongDemo.java:8: error: cannot find symbol long a = Long.parseLong("1452"); ^ symbol: method parseLong(String) location: class Long LongDemo.java:9: error: cannot find symbol long b = Long.parseLong("26"); ^ symbol: method parseLong(String) location: class Long LongDemo.java:10: error: cannot find symbol long c = Long.parseLong("54"); ^ symbol: method parseLong(String) location: class Long 3 errors
Java版本
openjdk version "11.0.16" 2022-07-19 OpenJDK Runtime Environment (build 11.0.16+8-post-Ubuntu-0ubuntu120.04) OpenJDK 64-Bit Server VM (build 11.0.16+8-post-Ubuntu-0ubuntu120.04, mixed mode, sharing)
原因分析
- 编译报错的核心原因是当前目录下存在自定义的
Long.java源文件(或编译后的Long.class文件),javac编译时会优先查找当前目录下的同名类,导致代码中的Long被解析为你自定义的类,而非java.lang.Long,而自定义的Long类没有parseLong方法,因此触发错误。 - BlueJ的编译运行机制与终端
javac不同:BlueJ默认会优先加载java.lang包下的核心类,不会被同目录的自定义同名类干扰,所以能正常运行。 - 当使用全类名
java.lang.Long.parseLong时,明确指定了要加载的是java.lang包下的Long类,编译器会直接忽略同目录的自定义同名类,因此编译运行正常。
内容的提问来源于stack exchange,提问作者Midhun Raj
相关产品推荐
相关产品推荐

