为什么我不能“修改”其他类的String数组?

时间:2018-12-07 18:21:20

标签: java

我的App中有两个类,我们将其称为A和B。A类在一种方法中使用B类的String数组,该方法应该使该数组变大并为最后一个索引分配一定的值。

我的问题是,即使在将类B声明为静态变量时也可以正常工作,看来它并不会使数组大1。

我引用B的String数组的方式:

environment: &environment

我在做什么错了?

我的实际代码段:

public class classA {

void myMethod() {
classB instance = new classB();
instance.array1 = Arrays.copyOf(instance.array1, instance.array1.length +1);
instance.array1[(instance.array1.length -1)] = someValue;} }

class classB{
String[] array1 = new String[0];
}
void save() {
    try {
        QAData qaObject = new QAData();
        File file = new File("path");
        boolean fileIsOk = file.isFile() && !(tf3.getText().equals("")) && !(file.isDirectory());
        if (fileIsOk) {
            FileOutputStream fos = new FileOutputStream(file);
            ObjectOutputStream oos = new ObjectOutputStream(fos);
            qaObject.question = Arrays.copyOf(qaObject.question, qaObject.question.length + 1);
            qaObject.question[(qaObject.question.length - 1)] = tf1.getText();
            qaObject.answer = Arrays.copyOf(qaObject.answer, qaObject.answer.length + 1);
            System.out.println(qaObject.question.length );
            qaObject.answer[(qaObject.answer.length - 1)] = tf2.getText();
            oos.writeObject(qaObject.question);
            oos.writeObject(qaObject.answer);}

            for (int i = 0; i < qaObject.question.length; i++) {
                System.out.println("question is: " + qaObject.question[i]);
            }


            for (int i = 0; i < qaObject.answer.length; i++) {
                System.out.println(("answer is: " + qaObject.answer[i]));
            }


        } catch (IOException e) {
        System.out.println("I/O exception during the save");
        e.printStackTrace();
    }
    catch (NullPointerException e){
        System.out.println("The object you are trying to save has the null value");
        e.printStackTrace();
    }
    catch (ArrayIndexOutOfBoundsException e) {
        System.out.println("error!!!!!");
    }
    finally {
            if (oos != null) {
                try{
                oos.close();
            } catch (IOException e) {
                    System.out.println("IO Exception!");
                }
        }
    }
}

2 个答案:

答案 0 :(得分:0)

我不确定您最终要达到的目标。我工程师的大脑说,有一种简单的方法可以完成您要尝试执行的操作。

我可以看到的最大问题是您使用的是裸露的Array。请改用ArrayList。使用ArrayList,您可以完成所有调整大小的操作。

如果您承诺使用Array,请至少在classB中提供一个公共方法,该方法可以处理调整数组大小等所有繁重的工作。声明如下:

public void addOneToEnd( String someValue )

类应该处理自己的数据,并且不要让外部类弄乱它。即使您使用ArrayList(您应该这样做),也应该使用方法方法。

祝你好运!

答案 1 :(得分:0)

这似乎对我有用。除非我缺少任何东西:

public class Tester {
  public static void main(String[] args) throws JsonProcessingException {
    classA a = new classA();
    a.myMethod();
  }
}
class classA {

  void myMethod() {
    classB instance = new classB();
    instance.array1 = Arrays.copyOf(instance.array1, instance.array1.length + 1);
    instance.array1[(instance.array1.length - 1)] = "someValue";
    System.out.println(instance.array1[(instance.array1.length -1)]);
  }
}

class classB {
  String[] array1 = new String[0];
}

它为我打印someValue。数组的初始长度为0,现在为1。

如果以下行:instance.array1[(instance.array1.length - 1)] = "someValue";没有给您例外,则表示大小实际增加了。您的初始大小为0。否则,该行会给您java.lang.ArrayIndexOutOfBoundsException: -1

java.lang.ArrayIndexOutOfBoundsException: -1