Как проверить, была ли инициализирована переменная
Прежде всего, я довольно новичок в 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 не инициализирует его инициализацию" в будущем.
Ответы
Ответ 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.
}
Ответ 5
Возможно, вы захотите взглянуть на другие структуры данных в рамках коллекций.
- > http://java.sun.com/developer/onlineTraining/collections/Collection.html
ArrayList является разумной хорошей альтернативой массивам
Ответ 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
. Надеюсь, это поможет.