обработка ошибок исключений числового формата

У меня есть массив строк, который заполнен числами. Любой неустановленный элемент в массиве по умолчанию будет null. Затем я перебираю этот массив, анализируя строки на их значения int, но я сталкиваюсь с NumberFormatException, когда цикл достигает элемента null.

Я не знаю заранее, сколько чисел будет в массиве, поэтому я использую большой массив, чтобы убедиться, что места достаточно для хранения всех строк.

Как я могу остановить цикл до того, как он достигнет элемента null?

for (int x = 1 ; x < array1.length ; x++){
    int newnode = Integer.parseInt(array1[x]);
    //searching in matrix
    // do other stuff
}

person Bahare Mkh    schedule 12.11.2015    source источник
comment
Использование List вместо массива может избежать проблемы   -  person JonK    schedule 12.11.2015


Ответы (2)


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

Измените код, заполняющий вашу коллекцию, чтобы использовать List<String> вместо String[]. Списки имеют динамический размер и будут постоянно расти по мере добавления в них новых элементов. При итерации не будет возвращено никаких элементов null, если только вы специально не добавите их в первую очередь, поэтому ваш код никогда не будет пытаться анализировать значение null.

Это изменение затем позволит вам перебирать список следующим образом:

for (String number : array1) { // You might want to rename array1 to something meaningful...
    int newNode = Integer.parseInt(number);
    // Do other stuff
}

Вы все еще можете поддерживать отдельную индексную переменную, если вам это нужно, она будет просто объявлена ​​​​и увеличена вручную, а не как часть конструкции цикла.

person JonK    schedule 12.11.2015
comment
Блок try-catch следует использовать вокруг Integer.parseInt(), потому что он может выдать NumberFormatException по многим причинам, и вы, вероятно, не хотите, чтобы программа останавливалась тогда. - person Michael Shopsin; 12.11.2015
comment
@MichaelShopsin Это зависит от содержимого списка. Если у вас есть контроль над источником и кодом, который создает список, вы можете убедиться, что в него в первую очередь вставляются только действительные данные. В этом случае вы можете возразить, что сбой на этом этапе указывает на более фундаментальную ошибку в более раннем коде. Это также может указывать на то, что данные находятся в недопустимом состоянии и дальнейшая обработка не должна продолжаться. Если недопустимые данные можно игнорировать, то во что бы то ни стало поймайте исключение и продолжите обработку... если нельзя, не делайте этого. - person JonK; 12.11.2015
comment
Ноя По моему опыту Integer.parseInt(), это слишком чувствительно, поэтому я обычно перехватываю исключение, а затем пытаюсь проанализировать число другим способом. - person Michael Shopsin; 16.11.2015
comment
@MichaelShopsin Но если вы убедились, что данные верны в точке входа, то обнаружение NFE позже так же хорошо, как мертвый код. Я предпочитаю, когда это возможно, быстро отбрасывать неверные данные, а не оставлять их в приложении, чтобы позже в какой-то неизвестный момент произошел сбой. - person JonK; 16.11.2015
comment
Иногда я читаю файл или другой ввод, когда я не могу контролировать то, что приходит, и не хочу останавливать весь ввод при каждой отдельной ошибке. Когда я читаю серию XML-файлов, я не хочу останавливаться на одной ошибке с числом, поскольку они не будут иметь существенного значения для результатов. В разделе Как избежать исключения числового формата в Java было хорошее обсуждение полной проверки чисел в строках. - person Michael Shopsin; 16.11.2015
comment
@MichaelShopsin О, это, конечно, не всегда возможно сделать - я не утверждаю этого. Как и все в коде, лучшее решение зависит от вашего варианта использования; иногда вам нужно поймать исключение, иногда нет. ОП должен решить, требуется ли это для их конкретного сценария. - person JonK; 16.11.2015

я думаю, что это правда:

for (int x = 1 ; x < array1.length ; x++){
    int newnode = -1;
    if(array1[x].equals("")) 
        break;
    try{
        newnode = Integer.parseInt(array1[x]);
    }catch(NumberFormatException e){
        System.err.println("err");
    }
    //searching in matrix
    // do other stuff
}
person Mohsen_Fatemi    schedule 12.11.2015
comment
Есть гораздо лучшие решения, позволяющие избежать этой проблемы, чем try-catch. - person JonK; 12.11.2015
comment
@JonK мое решение правильное, поэтому я не могу понять, почему вы отрицаете мой ответ :? - person Mohsen_Fatemi; 12.11.2015
comment
Смотрите мой первый комментарий. Это может сработать, но это не значит, что это хорошее решение. - person JonK; 12.11.2015
comment
@JonK, и это не достаточная причина, чтобы поставить минус, признай это - person Mohsen_Fatemi; 12.11.2015
comment
@JonK, если у вас есть лучшее решение, напишите его, если вы его не напишите, мое решение лучше, чем ваше ВООБРАЖАЕМОЕ решение, напишите его, и я проголосую за него - person Mohsen_Fatemi; 12.11.2015
comment
Почему вы захватываете весь цикл оператором try и ловите Exception вместо NumberFormatException? - person Clark Kent; 12.11.2015
comment
@SaviourSelf Exception e сам по себе имеет все исключения, такие как numberformatexception , arrayindexoutofbound , ... - person Mohsen_Fatemi; 12.11.2015
comment
Вот что мне было интересно... Использование попытки во всем цикле может поймать другое исключение, например исключение ArrayIndexOutOfBounds... и т.д. - person Doc; 12.11.2015
comment
Если это так, вы можете обернуть всю программу в try catch. Я думаю, что это плохой тон и не помогает OP понять распространение исключений. - person Clark Kent; 12.11.2015
comment
Таким образом, вы не будете знать, какое исключение подняло флаг. Всегда лучше быть очень точным при указании типа исключения в блоке catch. - person Doc; 12.11.2015
comment
@SaviourSelf я знаю, что его вопрос был о попытке поймать, и я ответил на него, попытавшись поймать - person Mohsen_Fatemi; 12.11.2015
comment
Другая проблема заключается в том, что ваша проверка if (array1[x].equals("")) break; не является нулевой. Это также не поможет в этом случае - OP заявил, что элементы, которые не содержат чисел, являются null, поэтому вы сразу же нажмете NullPointerException при оценке этого условия вместо NumberFormatException позже. Все, что вы делаете, это обмениваете одно исключение на другое. - person JonK; 12.11.2015
comment
@ shivam7357 вопрос был о try catch, и я ответил на него try catch , я знаю, что у него есть лучшие решения - person Mohsen_Fatemi; 12.11.2015
comment
@Mohsen_Fatemi хорошо, вы должны использовать этот тип блока try-catch, который не прерывает полный цикл for (int x = 1; x ‹ array1.length; x++){ if(array1[x].equals()) break; try { int newnode = Integer.parseInt (array1 [x]); // поиск в матрице // другие действия }catch(Exception e){ System.out.println(err); } } - person Doc; 12.11.2015
comment
@shivam7357 хорошо, прости меня, у меня нет времени, чтобы написать все это - person Mohsen_Fatemi; 12.11.2015