【问题标题】:Symbol not found in function's argument in main loop?在主循环的函数参数中找不到符号?
【发布时间】:2014-05-29 21:58:15
【问题描述】:

说明

我有一个初学者级别的程序。我的目标是第一次在运行时传入一个参数。

提出的问题

  • 更详细地描述错误?
  • 如何跟踪和修复此类错误?
  • 我使用过谷歌和 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

【问题讨论】:

  • 是的,“args”是“arg”的复数形式。我也尝试过“args”,所以这些 cmets 不会创建解决方案。但是感谢您引起我的注意!
  • 没错。 arg != args。
  • 这是一个数组。您需要访问其中的一个元素,例如 args[0]。
  • @Takendarkk 我知道,arg = 单数(args)
  • 看看我通过谷歌搜索找到了here

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


【解决方案1】:

正确

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)

可变复数

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

【讨论】:

  • 你知道,在下面:有时使用单数形式(授予,它被启动)。举个例子:foreach arg as args{}.
  • @Wolfpack'08 你说得对,将数组命名为它们所存储内容的复数名词是一种很好的做法。它使代码更具可读性。正如您所指出的,它对于每个循环都非常方便。对不起,如果我的回答看起来很刻薄
  • 一点也不。你看起来很可爱。感谢您抽出宝贵时间回答我的问题,先生。不过,如果您不介意,我可能会处理格式问题。我在这个网站上尽我所能编辑。
【解决方案2】:

看起来像是印刷错误。

您已传递 arg :- 名称中缺少 s,因为您在 main 方法中收到的参数是 args。

 sayagain(arg);  

但是,如果您将“args”传递给您的方法,它仍然会给出错误,因为 args 是一个数组类型,而您的函数正在寻找一个字符串类型。所以对该函数的正确调用应该是。

sayagain(args[0]);  

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

【讨论】:

  • 我只是不知道那是什么意思。
  • 忘记了。它只是分隔符。我试图只写 s。
【解决方案3】:

我自己的旋转

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

【讨论】:

    【解决方案4】:

    在 Java 中,源代码使用 javac sayagain.java 编译为类文件,这反过来又创建了一个 sayagain.class,这本质上是 JVM(Java 虚拟机)可以理解和执行的。

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

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

    java sayagain Hello World !

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

    要访问数组中包含的任何对象,请使用[]。数字从 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);
        }
    }
    }
    

    希望这会有所帮助:)

    【讨论】:

      猜你喜欢
      • 2023-03-15
      • 2011-06-13
      • 2013-10-03
      • 1970-01-01
      • 2019-03-23
      • 1970-01-01
      • 2018-02-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多