Почему этот код компилируется и запускается успешно, кажется, он должен получить индекс за пределами - PullRequest
2 голосов
/ 17 апреля 2009

Я читал некоторый Java-код в проекте, над которым я работал, и нашел метод с чем-то для этого в этом.

Object[] objs = null;
objs[0] = str1;
objs[1] = obj1;
for(String str: strArray)
{
    objs[objs.length+1] = str;
}

Я не могу понять, что здесь происходит. Я надеялся, что кто-нибудь сможет объяснить, как этот код работает для меня, предпочтительно как на высоком уровне, так и на низком уровне.

Ответы [ 6 ]

7 голосов
/ 17 апреля 2009

Это не должно работать. objs [0] выдаст ошибку.

Вы уверены, что используете правильную версию файла?

6 голосов
/ 17 апреля 2009

У этого нет надежды когда-либо работать на Java. Я подозреваю, что «что-то на этот счет» слегка отличается от реального кода, если он, кажется, работает. Несколько проблем:

  • Очевидно, что при попытке разыменования переменной
  • objs[objs.length+1] не расширяет массив, что является намерением - массивы имеют фиксированный размер после выделения.
  • Даже если массивы могут быть расширены , они основаны на 0, так что вы действительно захотите расширить их, установив objs[objs.length] - если этот код сработает, вы получите другой элемент "отсутствует"
1 голос
/ 17 апреля 2009

Ваша первая проблема заключается в том, что objs является null, а не размещается как массив Первая строка должна быть:

Object[] objs = new Object[2];  // array 2 elements long

Далее, «длина массива» - это общий выделенный размер массива, а не количество вставленных элементов. Таким образом, в этом примере objs.length всегда 2.

Следовательно, ваш цикл тоже неправильный.

Правильный код будет следующим:

Object[] objs = new Object[ strArray.length ];  // array of the right size.
for( int k = 0 ; k < strArray.length ; k++ )
{
    objs[k] = strArray[k];
}
0 голосов
/ 17 апреля 2009

@ Джейсон Коэн

А как насчет членов str1 и obj1, которые также должны храниться в массиве objs?

0 голосов
/ 17 апреля 2009

Следующий код, представляющий собой ваш код с парой исправлений для его компиляции, выдает исключение NullPointerException, как и ожидалось.

public class Crap
{
  public static void main (String[] args)
  {
    Object[] objs = null;
    objs[0] = "str1";
    objs[1] = new Object ();
    for(String str: new String [] { "str1", "str2" })
    {
        objs[objs.length+1] = str;
    }
  }
}


Exception in thread "main" java.lang.NullPointerException
    at Crap.main(Crap.java:6)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
    at java.lang.reflect.Method.invoke(Method.java:585)
    at com.intellij.rt.execution.application.AppMain.main(AppMain.java:90)
0 голосов
/ 17 апреля 2009
  • Код синтаксически правильный
  • Он не компилируется отдельно, но с некоторыми дополнениями, например,

    public class Test {
        public static void main(String[] args) {
            String[] strArray = new String[]{"a","b","c","d","e","f"};
            Object obj1 = new Object();
            String str1 = "test";
            Object[] objs = null;
            objs[0] = str1;
            objs[1] = obj1;
            for(String str: strArray)
            {
                objs[objs.length+1] = str;
            }
        }
    }
    

    так и будет, так как это правильная Java, тогда

  • Он не будет работать без ошибок (NullPointerException произойдет на objs[0] = str1)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...