0

以下是我正在尝试制作的程序的步骤

  1. 使用扫描仪捕获字符串
  2. 将该字符串传递给另一个类中的方法
  3. 使用将该字符串的字符分隔到一个数组中.toCharArray()
  4. 使用 for 循环将该数组的内容复制到另一个数组

但是这个数组给了我一个空指针异常。我究竟做错了什么?(忽略班级命名我知道这很愚蠢,但我必须这样做,因为我的老师想要那样做)

主类:

import java.util.Scanner;
public class _01 {


    public static void main(String[] args) {

        Scanner input = new Scanner(System.in);
        System.out.print("Enter your name : ");
        String name = input.nextLine();
        int size = name.length();

        _02 process = new _02(size);

        process.push(name);

    }

}

带有数组的其他类:

    public class _02 {

        int maxsize;
        int top;
        char arrayStack[];

        public _02(int size) {

            maxsize = size;
            top = -1;

            }

        public void push(String letters) {

            char temp[]= letters.toCharArray();

            for (int c=0;c<temp.length;c++) {

                temp[c] = arrayStack[++top];

            }

       }

}
4

3 回答 3

1

您的分配是相反的 - 您想temp (分配的右侧)分配arrayStack (分配的左侧)。此外,您需要初始化arrayStack,例如arrayStack = new char[temp.length]- 现在它为空。

于 2013-04-29T16:22:01.967 回答
0
char arrayStack[]; // this is not initialized.


arrayStack[] = new char[temp.length] // inside the push() method.
于 2013-04-29T16:23:07.073 回答
0

数组需要用Java初始化;简单地声明一个数组会产生一个初始化为null. 一旦将类更改为正确初始化arrayStack,您就不需要该maxsize字段,因为它将与arrayStack.length. 您还可以在该push方法中反转您的分配。最后,由于您有一个最大数组大小,您可能希望避免抛出一个ArrayIndexOutOfBoundsException,而是抛出一个语义上更有意义的异常,或者简单地删除额外的字符或增加堆栈(在这种情况下,构造函数 arg 是初始大小)。为此,您将需要进行一些范围检查。top最后,如果您初始化为 0 而不是-1并使用top++而不是++top(或者,更好的是,使用内置 API 来复制数组的片段),逻辑会更清晰。

public class _02 {
    int top;
    char arrayStack[];

    public _02(int size) {
        arrayStack = new char[size];
        top = 0;
    }

    public void push(String letters) {
        char temp[]= letters.toCharArray();
        int len = temp.length;

        // do some range checking
        if (top + len >= arrayStack.length) {
            // silently ignore the extra characters
            len = arrayStack.length - top;
            // an alternative would be to throw a "stack full" exception
            // yet another alternative would be to grow the stack
        }

//        for (int c=0; c<len; c++) {
//            arrayStack[top++] = temp[c];
//        }
        // don't use a loop--use the API!
        System.arraycopy(temp, 0, arrayStack, top, len);
        top += len;
    }
}
于 2013-04-29T16:35:11.017 回答