2013-06-04 3 views
11

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


Версия A: Просто оставьте его как есть и взять на себя риски (которые я пытаюсь избежать)

public static int stringToInt(String param) { 
     return Integer.valueOf(param); 
} 

(с точки зрения скорости, какая разница будет это сделать до версии B и C)


Версия B: Поймай экс ception

public static int stringToInt(String param) { 
     try { 
       return Integer.valueOf(param); 
     } catch(NumberFormatException e) { 
       return -1; 
     } 
} 

Version C: Проверьте каждую букву строки, чтобы увидеть, если это значное число или нет

public static int stringToInt(String param) { 
     for(char c : param.toCharArray()) { 
       if(!Character.isDigit(c)) 
         return -1; 
     } 
     return Integer.valueOf(param); 
} 

Обратите внимание, что параметр должен быть положительное число, а значение -1 должно быть «значением ошибки» в моей маленькой программе, другими словами, все три версии методов будут отлично работать в моей программе.

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

Благодарим вас за поддержку.

+2

Первая версия является лишь «рискованным», если ошибка не правильное поведение, и если вы не хотите, чтобы поймать 'NumberFormatException' где-то выше изменения. Бросание исключений может быть совершенно здоровым ответом на плохой ввод. –

+0

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

+0

версия C сбой на отрицательных целых числах – bengoesboom

ответ

7

Во-первых, обратите внимание, что версия C не является пуленепробиваемой: она отвергает отрицательные числа и не будет ловить слишком большие числа.

Версия B в порядке, но при этом вызывающий абонент меняет стиль кодирования: вместо того, чтобы поймать ошибку и обработать ее вместе с другими ошибками, вызывающему абоненту необходимо будет постоянно проверять на наличие -1. Это может быть субоптимальным в ситуациях, когда вы читаете несколько целых чисел, но обработка ошибок не зависит от того, какой из них был неудачным. Кроме того, новые кодеры, использующие ваш API, могут забыть проверить на -1 и использовать код ошибки непреднамеренно.

Вот почему я останусь с первым вариантом: код, использующий версию A, будет сразу же знаком любому, кто знает Java API, без необходимости узнавать, что происходит внутри вашей функции.

+1

+1 для «знакомства» – Craig

+0

OP отмечает, что их фактический метод делает «другие вещи». Возможно, это не так удобно назвать 'stringToInt'. Явно объявляя, что исключенное исключение, вероятно, является хорошей идеей, если имя метода действительно не так ясно, как 'stringToInt' (и, конечно, javadoc, чтобы перейти со всем вышеперечисленным) – Gus

2

Я считаю, что лучший вариант для изменения исключения, а не возврата -1. Хорошо исключить исключение до уровня, где его можно обработать, чтобы отправить правильный ответ пользователю. Возврат значения, равного -1, сделает вашу ошибку кода неприемлемой. Предположим, что другой программист использует ваш метод, и он/она просто имеет подпись вашего метода. Поэтому из подписи неясно, что он/она должен кодировать для обработки сценария исключения или ошибки. Но если вы выбросите исключение и добавите его в объявление метода, он позволит другому программисту правильно использовать ваш метод вместе с необходимой обработкой исключений.Для меня это выглядит лучше всего:

public static int stringToInt(String param) throws NumberFormatException { 
     try { 
       return Integer.valueOf(param); 
     } catch(NumberFormatException e) { 
       // return -1; 
       throw e; 
     } 
} 
+10

Зачем вообще исключать исключение? – Craig

6

Guava предлагает метод утилиты для этого, который возвращает null, если ваша строка не может быть проанализирована.

https://google.github.io/guava/releases/19.0/api/docs/com/google/common/primitives/Ints.html#tryParse(java.lang.String)

Integer result = Ints.tryParse("1"); //returns 1 
Integer result = Ints.tryParse("-1"); //returns -1 
Integer result = Ints.tryParse("a"); //returns null