Как проверить, инициализирована ли переменная - PullRequest
18 голосов
/ 12 апреля 2010

Прежде всего, я довольно новичок в Java, поэтому извините, если этот вопрос очень прост.

Дело в том, что у меня есть String[] s, созданный путем разбиения строки, в которой каждый элемент является числом. Я хочу отлить предметы s в int[] n.

s[0] содержит количество предметов, которые n будет удерживать, фактически s.length-1. Я пытаюсь сделать это с помощью цикла foreach:

int[] n;
for(String num: s){
    //if(n is not initialized){
        n = new int[(int) num];
        continue;
    }
    n[n.length] = (int) num;
}

Теперь я понимаю, что могу использовать что-то вроде этого:

int[] n = new int[(int) s[0]];
for(int i=1; i < s.length; i++){
    n[i-1] = (int) s[i];
}

Но я уверен, что в будущем я столкнусь с этой проблемой "если n не инициализируется, то инициализируй".

Ответы [ 9 ]

13 голосов
/ 12 апреля 2010

Вы не можете разыграть String до int. Java строго типизирован, и нет неявного преобразования типов, которое вы можете найти в языке сценариев.

Чтобы преобразовать String в int, используйте явное преобразование, например Integer.parseInt(String).

Все переменные-члены и элементы массивов инициализируются значением по умолчанию. Для типов int значение равно 0. Для ссылочных типов (любой подтип Object) значением по умолчанию является null. Локальные переменные не получают значения по умолчанию, но компилятор анализирует код, чтобы убедиться, что значение назначено до чтения переменной. Если нет, код не будет компилироваться.

Я думаю, что вы хотите что-то вроде этого:

int[] n = new int[Integer.parseInt(s[0]);
for (int idx = 0; idx < n; ++idx)
  n[idx] = Integer.parseInt(s[idx + 1]);
12 голосов
/ 12 апреля 2010

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

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

В конкретном примере второй код, который вы показали, определенно будет чище.

2 голосов
/ 12 апреля 2010
int[] n = null;
for(String num: s){
    if(n == null){
        n = new int[(int) num];
        continue;
    }
    n[n.length] = (int) num;
}
1 голос
/ 12 апреля 2010

Как уже отмечали другие, самый близкий к "правильному" способу сделать это - инициализировать массив нулем.

По другим пунктам:

"n [n.length]" вызовет исключение "индекс вне границ". Массивы имеют элементы в диапазоне от 0 до длины-1. В любом случае, я думаю, что в первом случае вы намеревались сказать «n [0]», а во втором - «n [i]».

Сохранение размера массива в первом элементе, вероятно, плохая идея. Это может быть сделано для массива int, но это будет грязно в массиве String и не будет работать вообще для логического массива. Даже в случае с int вы теперь смешиваете две совершенно разные вещи в одной структуре данных, что может привести к путанице. Если размер массива фиксирован, «длина» в любом случае будет содержать размер. Если размер массива является переменным, и вы думаете, что собираетесь создать массив достаточно большой, а затем сохранить объем, который фактически используете, лучше использовать ArrayList, который аккуратно обрабатывает массивы динамического размера.

1 голос
/ 12 апреля 2010

Единственное, что вы можете сделать, это проверить по null. Если ваш код находится внутри метода, он не скомпилируется, если вы не инициализируете. Поэтому, если он компилируется и запускается, вы знаете, что он инициализирован как минимум до null, а затем выполните проверку null.

1 голос
/ 12 апреля 2010

Возможно, вы захотите взглянуть на другие структуры данных в структуре коллекций.

-> http://java.sun.com/developer/onlineTraining/collections/Collection.html

ArrayList - разумная альтернатива массивам

1 голос
/ 12 апреля 2010

Если вы инициализируете свои переменные или объекты на null до их использования,

String myVar1 = null;
Person bobby = null;

Вы можете сравнить переменную или объект с ненулевым значением,

if (myVar != null) {
  // myVar has a value.
}
0 голосов
/ 23 ноября 2012

Я столкнулся с этой проблемой, проверяя, была ли инициализирована int. В моей программе было возможно, что он был инициализирован на 0, поэтому проверка if (int i = 0) не принесет много пользы.

В качестве решения / обходного пути я создал переменную boolean, которая устанавливается при инициализации int. Надеюсь, это поможет.

0 голосов
/ 12 апреля 2010

Вы можете проверить на null:

int[] n;
for(String num: s){
    if(n == null) {
        n = new int[(int) num];
    }
    n[n.length] = (int) num;
}

Обратите внимание, что это может произойти, только если n является членом класса. Если это локальная переменная, компилятор не позволит вам ничего с ней сделать без инициализации.

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