Подтвердить что ты не робот

Как проверить, была ли инициализирована переменная

Прежде всего, я довольно новичок в 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 не инициализирует его инициализацию" в будущем.

4b9b3361

Ответ 1

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

Чтобы преобразовать a 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]);

Ответ 2

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

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

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

Ответ 3

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

Ответ 4

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

String myVar1 = null;
Person bobby = null;

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

if (myVar != null) {
  // myVar has a value.
}

Ответ 6

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

Ответ 7

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

В других точках:

"n [n.length]" выкинет исключение "index out of bounds". Массивы имеют элементы от 0 до длины-1. В любом случае, я думаю, что вы сказали в первом случае "n [0]", а во втором - "n [i]".

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

Ответ 8

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

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

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

Ответ 9

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

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