如何通过终端调用Java方法?运行报cannot find symbol错误如何解决
解决步骤
错误原因
你遇到的报错是因为Java 11及以上版本提供的单文件直接运行机制(即java 文件名.java)仅会编译、处理你指定的这一个源文件,不会自动关联同目录下的其他Java源文件,因此编译器在编译B.java时找不到A类的定义。另外你提供的两份代码都缺少ArrayList的导入声明,即使解决A类找不到的问题也会触发新的编译错误。
修复&运行步骤
第一步:补全代码的导入声明
在A.java和B.java的第一行都添加如下导入语句:
import java.util.ArrayList;
修复后的完整代码示例:
A.java:
import java.util.ArrayList; public class A{ public static int promedio(ArrayList<Integer> array) { int sum=0,prom=0; for(int i=0 ; i < array.size() ; i++) { sum+=array.get(i); } prom = sum/array.size(); return prom; } }
B.java:
import java.util.ArrayList; public class B{ public static void main(String[] args) { ArrayList<Integer> array = new ArrayList<Integer>(); //Convert to int the string from args for (int i = 0; i < args.length; i++) { int StrToInt= Integer.parseInt(args[i]); array.add(StrToInt); } //call method class A int returnPromedio = A.promedio(array); System.out.println("Prom: "+returnPromedio); } }
第二步:编译所有源文件后运行
不要直接用java B.java的单文件运行模式,改为先批量编译所有依赖的源文件,再运行主类:
- 打开终端,切换到A.java、B.java所在的目录
- 执行编译命令:
javac A.java B.java,执行完成后同目录会生成A.class、B.class两个字节码文件 - 执行运行命令:
java B 200 100,即可得到输出结果Prom: 150
备选方案(单文件运行)
如果你坚持要用java xx.java的单文件运行方式,可以把A类的代码合并到B.java中,去掉A类的public修饰符即可,示例如下:
import java.util.ArrayList; class A{ public static int promedio(ArrayList<Integer> array) { int sum=0,prom=0; for(int i=0 ; i < array.size() ; i++) { sum+=array.get(i); } prom = sum/array.size(); return prom; } } public class B{ public static void main(String[] args) { ArrayList<Integer> array = new ArrayList<Integer>(); for (int i = 0; i < args.length; i++) { int StrToInt= Integer.parseInt(args[i]); array.add(StrToInt); } int returnPromedio = A.promedio(array); System.out.println("Prom: "+returnPromedio); } }
保存为B.java后直接执行java B.java 200 100即可正常运行。
内容的提问来源于stack exchange,提问作者Pl4g
相关产品推荐
相关产品推荐

