2010-04-12 2 views
18

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

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

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

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 не инициализирует его инициализацию» в будущем.

+0

Если s [0] «эффективно s.length-1», зачем вообще его включать? Почему бы просто не позволить себе длину s? – CPerkins

+0

Я согласен, но не могу контролировать этот вход. :) –

ответ

13

Вы не можете бросить 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]); 
+0

Часть ссылочных типов должна быть «ссылочными типами (любой * подтип * объекта)», потому что 'Object []' не является подклассом 'Object', но является подтипом. –

+0

Спасибо, немного поиграв с этим, я обнаружил, что мне нужно было сделать новый Integer (ы), чтобы его отличить. –

+2

@Javier: снова: это не «кастинг», это «конвертация». –

1

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

String myVar1 = null; 
Person bobby = null; 

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

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

, только если он был первоначально и явно инициализирован нулевым ИЛИ это член объекта/класса – Yaneeve

+0

Я отредактировал свой ответ, я должен был быть более ясным в своем направлении. –

0

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

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

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

+3

Это не скомпилируется: по умолчанию локальные переменные * не * установлены на 'null'. (кроме того, есть проблема с int-casting, которая не будет работать, как отметил @erickson). –

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

Спасибо. Я не знал, что могу присвоить значение null любому типу переменной. –

+0

@Javier: только переменные/поля ссылочных типов. Так что все, кроме 'int',' boolean', 'char',' short', 'long',' float', 'double'. Типы ссылок включают 'Integer',' int [] 'и бесконечное количество других возможностей. – polygenelubricants

+0

@polygenelubricants спасибо за разъяснение, так что это все, кроме родных типов, не так ли? –

12

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

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

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

1

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

1

Как отмечали другие, наиболее подходящим для «правильного» способа является инициализация массива до нуля.

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

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

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

+0

Спасибо за ваш ответ. Да, я добрался до n.length, всегда возвращающего x, я не понял реализацию java длины, теперь, когда я это вижу, это имеет большой смысл, ведь я инициализировал его с помощью x элементов, поэтому n.length должен всегда возвращаем x. И да, я согласен, сохранение размера в первом элементе беспорядочно, но я не контролирую это (я кодирую некоторые упражнения, и это ожидаемый ввод) –

+0

А, нечувствительные требования снова приводят к нечувствительному дизайну , Напоминает мне об экономическом классе, который я получил в колледже. Одна глава в учебнике говорила о затратах, связанных с потоком, и указала на то, что невысокие затраты не имеют отношения к будущим планам. В конце главы было упражнение, в котором говорилось: «Предположите, что вы устроились на работу, и ваш босс сказал:« Мне все равно, что они сказали вам в экономическом классе! Я хочу, чтобы вы учитывали все наши потопленные затраты или вы «Уволен!» Неужели потоки сейчас вам не подходят? – Jay

0

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

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

Смежные вопросы