Сколько измерений в массиве без значения - PullRequest
0 голосов
/ 26 ноября 2008

Я немного растерялся (все еще работаю с книгой Рона Джеффриса). Вот простой класс:

public class Model{
    private String[] lines;

    public void myMethod(){
        String[] newLines = new String[lines.length + 2];
        for (i = 0, i <= lines.length, i++) {
            newLines[i] = lines[i];
        }
    }
}

У меня есть другой класс, который инициализирует Model, и пустой массив, установив myModel = new String[0]. Когда я вызываю myModel.myMethod(), я получаю нижний индекс ошибки вне диапазона. Глядя на отладчик, я вижу, что myModel.lines имеет нулевые размеры и нулевую длину. Разве он не должен иметь размер и длину 1? Допустим, значение lines[0] равно null, но сам массив не должен быть, не так ли?

Любые мысли по-настоящему ценятся.

Randy

Ответы [ 5 ]

1 голос
/ 26 ноября 2008

Я думаю, что ваш пример, вероятно, не совпадает с вашим реальным кодом на основе вашего описания. Я думаю, что проблема заключается в том, что массивы начинаются с нуля, и поэтому массив инициализируется как:

string [] lines = новая строка [0];

не имеет элементов.

Вам нужно изменить цикл так, чтобы вы проверяли, что индекс строго меньше длины массива. Как уже указывали другие, вам также нужно убедиться, что сам массив не равен нулю, прежде чем пытаться ссылаться на него.

Мое мнение о вашем коде:

public class Model{
    private String[] lines = new string[0];

    public Model( string[] lines ) {
        this.lines = lines;
    }

    public void myMethod(){
        int len = 2;
        if (lines != null) {
            len = len + lines.length;
        }
        String[] newLines = new String[len];
        for (i = 0, i < lines.length, i++) {
            newLines[i] = lines[i];
        }
    }
}
1 голос
/ 26 ноября 2008

строк инициализируется до null, проверьте нулевое значение или инициализируйте его следующим образом:

private String[] lines = new String[0];
1 голос
/ 26 ноября 2008

Вы не можете инициализировать экземпляр Model, установив его равным массиву String. Я на самом деле удивлен, что компилятор позволит вам даже попробовать.

Если вы действительно хотите, чтобы Model инициализировалась с помощью внешнего массива, вы должны создать Constructor для класса Model, который будет принимать в качестве аргумента массив. Затем в теле вашего конструктора установите значение строк равным этому значению.

Пример:

public class Model {
    private String []lines;

    public Model(String [] inLines)
       {
       lines = inLines;
       }
}

Использование:

myStringArray = new String[0];
myModel = new Model(myStringArray);
1 голос
/ 26 ноября 2008

строк будут нулевыми, поэтому lines.length выдаст исключение.

Я полагаю, что ваш другой класс, инициализирующий "Модель", не поможет, так как сама Lines является частной. Фактически, то, что вы делаете с Моделью, вероятно, является незаконным по крайней мере в 30 штатах.

0 голосов
/ 26 ноября 2008

Посмотрите на мой ответ здесь - я думаю, что это даст вам необходимую информацию о различиях между инициализацией массива в Java и C / C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...