无法将包含main方法的类的数组值传递给不同的类

时间:2013-02-24 21:52:47

标签: java

我们的老师要求我们创建一个程序,根据LIFO的原理复制堆栈的工作,并指出堆栈溢出和空堆栈。

我创建了三个类。包含main方法的Retrievee类,它使用String [] args从用户获取输入。其他类Push使用Retrievee类中的值Push应该根据其大小接受值,并检查值是否超出它的大小和状态溢出并进入类Pop,它使用类推中的值而不是检索。

class Push extends Retrivee
{
  int i;
  Push()
  {
    String push[]= new String[10];
    //int push[]=new int[10];
    for(i=0;i<12;i++)
    {
      //Retrivee ele= new Retrivee();
      push[i]=a[i];
      System.out.print("value in Push["+i+"]="+push[i]);
      if( i == 9 )
         {
           System.out.print("Stack for push has Overflown");
         }
    }
  }
}

class Pop extends Push
{
  int i;
  Pop()
  {
    String pop[]= new String[10];
    //int pop[]= new int[10];
    for(i=10;i>=-1;i--)
    {
      //Push ele1= new Push();
      pop[i]=push[i];
      System.out.print("value in Pop["+i+"]="+pop[i]);
      if(i == -1)
      {
       System.out.print("Stack for pop is empty");
      }
    }
  }
}
public class Retrivee
{
    public static void main(String args[] )
    {
        System.out.println("please enter 12 elements");
        String a[] = new String[13];
        //int a[]=new int [13];
        a[1]=args[1];
        a[2]=args[2];
        a[3]=args[3];
        a[4]=args[4];
        a[5]=args[5];
        a[6]=args[6];
        a[7]=args[7];
        a[8]=args[8];
        a[9]=args[9];
        a[10]=args[10];
        a[11]=args[11];

    /*
        a[0]=Integer.parseInt (args[0]);
        a[1]=Integer.parseInt (args[1]);
        a[2]=Integer.parseInt (args[2]);
        a[3]=Integer.parseInt (args[3]);
        a[4]=Integer.parseInt (args[4]);
        a[5]=Integer.parseInt (args[5]);
        a[6]=Integer.parseInt (args[6]);
        a[7]=Integer.parseInt (args[7]);
        a[8]=Integer.parseInt (args[8]);
        a[9]=Integer.parseInt (args[9]);
        a[10]=Integer.parseInt (args[10]);
        a[11]=Integer.parseInt (args[11]);
     */

     /* Push push1 =new Push();
        Pop pop1 =new Pop();

     */
    }
}

在编译时我得到了错误

 Retrivee.java:11:error :cannot find symbol
    push[i]=a[i];
    symbol: variable a
    location:class Push
 Retrivee.java:31:error :cannot find symbol
    pop[i]=push[i];
    symbol: variable push
    location:class Pop

所以我终于想到也许从String [] args获取的值不能传递给另一个类。所以改进了一点代码。

class Push //extends Retrive
{
    public Push()
    {
        int i;
        String push[]= new String[10];
        //Retrive ele= new Retrive();
        try
        {
            for(i=0;i<13;i++)
            {
                push[i]=Retrive.a[i];
                System.out.println("value in Push["+i+"]="+push[i]);
            }
        }
        catch(Exception e)
        {
            System.out.println("Stack for push has Overflown");
        }
    }
}

class Pop //extends Push
{
    public Pop()
    {
        int j;
        String pop[]= new String[10];
        //Push ele1= new Push();
        try
        {
            for(j=9;j>=-1;j--)
            {
                pop[j]=Pop.push[j];
                System.out.println("value in Pop["+j+"]="+pop[j]);
            }
        }
        catch(Exception ev)
        {
            System.out.println("Stack for pop is empty");
        }
    }
}

public class Retrive 
{
    public static void main(String args[])
    {
        String a[] = new String[13];
        for(int k=0;k<13;k++)
        {
            int d[]=new int[13];
            d[k]=2*k;
            a[k]=Integer.toString(d[k]);
            System.out.println("a["+k+"]= "+a[k]);
        }
    }
}

但最终又出现了相同的错误

 Retrive.java:12:error :cannot find symbol
    push[i]=Retrive.a[i];
    symbol: variable a
    location:class Retrive
 Retrive.java:34:error :cannot find symbol
    pop[i]=Pop.push[i];
    symbol: variable push
    location:class Pop

然后我尝试了这个代码,但只是在包含main方法的单个类中。

public class Retrivee
{
    public static void main(String args[] )
    {
        String a[] = new String[13];
        for(int k=0;k<13;k++)
        {
            int d[]=new int[13];
            d[k]=2*k;
            a[k]=Integer.toString(d[k]);
            System.out.println("a["+k+"]= "+a[k]);
        }
        int i;
        String push[]= new String[10];
        try
        {
            for(i=0;i<13;i++)
            {
                push[i]=a[i];
                System.out.println("value in Push["+i+"]="+push[i]);
            }
        }
        catch(Exception e)
        {
            System.out.println("Stack for push has Overflown");
        }
        int j;
        String pop[]= new String[10];
        try
        {
            for(j=9;j>=-1;j--)
            {
                pop[j]=push[j];
                System.out.println("value in Pop["+j+"]="+pop[j]);
            }
        }
        catch(Exception ev)
        {
            System.out.println("Stack for pop is empty");
        }
    }
}

最后它奏效了。为什么在上述两种情况下不起作用?如果它可以有效,请说明应该如何以及在何处进行更改。

我想问的最后一件事是为什么我们不能通过这样的写法在main方法中设置String args []的大小

  public static void main(String args[] = new String[10]) 
  {
  }

按照第一个例子我写了一个小代码

import java.util.*;
public class MyScan 
{
    public static void main(String[] args) 
    {
        //String[] args = new String[10];
        String[] in = new String[4];//= {"1 a 10 . 100 1000","12","2112"};
        in[0]= "1"; //args[0];
        in[1]= "2"; //args[1];
        in[2]= "3"; //args[2];
        String accum;
        for(int x = 0; x <3; x++)   
        {
            Scanner s = new Scanner(in[x]);
            accum = s.nextLine();
            System.out.println(accum);
        }
    }
} 

当我写作

 in[0]= args[0];
 in[1]= args[1];
 in[2]= args[2];

它扔了

  Exception in thread"main" java.lang.ArrayIndexOutOfBoundsException:0
  at MyScan.main<MyScan.java:9>

但上面的初始化在另一个程序中使用时有效,但有些不同。

    String a= args[0];
    String b= args[1];

1 个答案:

答案 0 :(得分:0)

你在这里问了不止一个问题,但是......

cannot find symbol是编译器告诉您对浮动的某个变量有未定义引用的方式。它甚至会告诉你它们是哪些变量。所以,现在,您没有将apush定义为任何内容。声明并将它们实例化为适当的值。

您不需要设置args[]的大小,因为它基本上是无限的。在命令行上传递参数时使用args[]

java program1 param1 param2 param3 param4 ... param99

...这些参数中的每一个都在args

你可以为main写这个,这意味着同样的事情:

public static void main(String... args) { }

以上称为varargs。我建议你研究一下这个参考。