主循环中函数参数中找不到符号?

时间:2014-05-29 13:21:39

标签: java compiler-errors command-line-arguments argument-passing symbol-not-found

描述

我有一个初级水平的课程。我的目标是第一次在运行时传递一个参数。

提出的问题

  • 更详细地描述错误?
  • 这样的错误如何跟踪和修复?
  • 我使用过谷歌和StackOverflow。我应该使用不同的资源来帮助我在初学者计划中出现这样的错误吗?

我的代码

class sayagain {

    public static void sayagain(String s){

        System.out.print(s);

    }

    public static void main(String[] args){

        sayagain(arg);  

    }

}

编译错误

print2.java:11: error: cannot find symbol
                print2(arg);
                       ^
  symbol:   variable arg
  location: class print2
1 error

4 个答案:

答案 0 :(得分:2)

正确

arg未定义。也许你的意思是sayagain(args[0]),它将打印main方法中的第一个参数。

字符串数组类型和索引

的说明

args字符串数组,因此要获取第一个参数,您需要访问数组中的第一个元素:[0]

警告

如果在调用main方法时不包含任何参数,则会出现index out of bounds错误。

  • 示例输入:>java sayagain
  • 示例输出:

    Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0 at sayagain.main(sayagain.java:11)

可变多个

没有内置功能可以将arg发现为args的单数。变量可以是正式语言规范内的任何内容,甚至是asdfsfaeef。使用描述性名称是更好的做法;因此,人们在命名数组时倾向于使用复数形式。

答案 1 :(得分:1)

看起来像印刷错误。

你已经通过了arg: - 名字中缺少了s,因为你在main方法中收到的参数是args。

 sayagain(arg);  

但是如果你将'args'传递给你的方法,它仍然会给出一个错误,因为args是一个数组类型,你的函数看起来是一个String类型。所以对该函数的正确调用将是。

sayagain(args[0]);  

在调用此函数之前检查args长度,否则如果未传递参数,则可能抛出ArrayIndexOutOfBoundException。

答案 2 :(得分:0)

我自己的旋转

  • 正确:System.out.print(args[0]);
  • 不正确:System.out.print(args); //错误的类型。
  • 不正确:System.out.print(args[1]); //索引错误。
  • 不正确:System.out.print(arg); //不是变量。
  • 不正确:System.out.print(arg[0]); //拼写错误(见上文)。

答案 3 :(得分:0)

在Java中,使用javac sayagain.java将源代码编译为类文件,然后创建sayagain.class,这基本上是JVM(Java虚拟机)可以理解和执行的内容。

要运行javac命令生成的sayagain.class,您将使用java sayagain

您还可以将由空格分隔的参数传递给正在运行的类,如下所示:

java sayagain Hello World !

这些参数传递给您在主类中定义的args 数组,这是将首先调用的方法。 (你可以将它称为l​​istOfArguments,如下所示,它没有任何区别)

要访问数组中包含的任何对象,请使用[]。数字从0开始,结束,长度为1。以下是您的代码的更改示例:

public class sayAgain {

//Eventhough there is two say methods, one takes a String parameter, and one takes an Integer parameter, thus they are different 

public static void say(String s){
    System.out.print(s);
}

public static void say(int i) {
    System.out.print(i);
}

public static void main(String[] listOfArguments){

    //First argument, starting at 0 - Hello
    String arg1 = listOfArguments[0];

    //Second argument - World
    String arg2 = listOfArguments[1];

    //Second argument - 3
    String arg3 = listOfArguments[2];

    //arg3 is a integer but is saved as a String, to use arg3 as a integer, it needs to be parsed
    // Integer, is a class, just like your sayAgain class, and parseInt is a method within that class, like your say method
    int count = Integer.parseInt(arg3);

    //Print each argument 
    say(arg1);
    say(arg2);
    say(arg3);

    //Use the converted argument to, to repeatedly call say, and pass it the current number
    for (int t = 0; t < count; t++) {
        //The variable t is created within the for structure and its scope only spans the area between the { }
        say(t);
    }
}
}

希望这会有所帮助:)