Я получил эту ошибку после выполнения mvn eclipse:eclipse
Это немного испортило мой файл .classpath
.
Если бы изменить строки в .classpath
из
<classpathentry kind="src" path="src/main/java" including="**/*.java"/>
<classpathentry kind="src" path="src/main/resources" excluding="**/*.java"/>
to
<classpathentry kind="src" path="src/main/java" output="target/classes" />
<classpathentry kind="src" path="src/main/resources" excluding="**" output="target/classes" />
Он преобразует null
в строку "null"
и пытается ее преобразовать. Для радиусов с 0 по 23 нет цифр, которые он может преобразовать, поэтому он возвращает NaN
. В 24, "n"
, 14-я буква, добавляется в цифровую систему. На 31, "u"
добавляется 21-я буква, и вся строка может быть расшифрована. В поле «37» уже нет никакого действительного набора цифр, которое может быть сгенерировано, и возвращается NaN.
js> parseInt(null, 36)
1112745
>>> reduce(lambda x, y: x * 36 + y, [(string.digits + string.lowercase).index(x) for x in 'null'])
1112745
Игнасио Васкес-Абрамс прав, но позволяет точно видеть , как это работает ...
Из 15.1.2.2 parseInt (string , radix)
:
Когда вызывается функция parseInt, выполняются следующие шаги:
- Пусть inputString - ToString (string).
- Пусть S - вновь созданная подстрока inputString, состоящая из первого который не является StrWhiteSpaceChar, и все символы, следующие за этим символом. (Другими словами, удалите ведущее белое пространство.)
- Пусть знак равен 1.
- Если S не пусто и первый символ S является знаком минус, -1.
- Если S не пусто и первый символ S является знаком плюс + или знаком минус, то удалите первый символ из S.
- . Пусть R = ToInt32 (radix).
- Пусть stripPrefix будет true.
- Если R ≠ 0, то a. Если R & lt; 2 или R> 36, затем верните NaN. б. Если R ≠ 16, пусть stripPrefix будет false.
- Else, R = 0 a. Пусть R = 10.
- Если stripPrefix истинно, то a. Если длина S не менее 2, а первые два символа S - «0x» или «0X», то удалите первые два символа из S и R = 16.
- Если S содержит любой символ, который не является цифрой radix-R, тогда пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z будет S.
- Если Z пуст, верните NaN.
- Пусть mathInt - математическое целочисленное значение, которое представлено Z в нотации radix-R, используя буквы AZ и az для цифр со значениями от 10 до 35. (Однако, если R равно 10, а Z содержит более 20 значащих цифр, каждая значимая цифра после 20-го может быть заменена цифрой 0 по выбору реализации, а если R не является 2, 4, 8, 10, 16 или 32, то mathInt может быть зависимым от реализации приближением к математическому целочисленному значению, которое представлено Z в нотации radix-R.)
- Пусть number - значение Number для mathInt.
- Возвращаемый знак × номер.
ПРИМЕЧАНИЕ parseInt может интерпретировать только ведущую часть строки как целочисленное значение; он игнорирует любые символы, которые не могут быть интерпретированы как часть обозначения целого числа, и не указывается указание на то, что любые такие символы были проигнорированы.
blockquote>Здесь есть две важные части. Я смел их обоих. Итак, прежде всего, мы должны выяснить, что представляет
toString
представлениеnull
. Нам нужно посмотретьTable 13 — ToString Conversions
в разделе 9.8.0 для этой информации:[/g1]
Отлично, теперь мы знаем, что выполнение
toString(null)
внутренне дает строку'null'
. Отлично, но как именно он обрабатывает цифры (символы), которые недопустимы в предоставленном радиксе?Мы смотрим выше на
15.1.2.2
, и мы видим следующее замечание:Если S содержит любой символ, который не является знаком radix-R, тогда пусть Z - подстрока S, состоящая из всех символов перед первым таким символом; в противном случае пусть Z будет S.
blockquote>Это означает, что мы обрабатываем все цифры PRIOR указанному основанию и игнорируем все остальное.
В принципе, выполнение
parseInt(null, 23)
- это такой же предмет какparseInt('null', 23)
.u
заставляет игнорировать дваl
(хотя они являются частью основания 23). Поэтому мы можем только разобратьn
, сделав синтаксис всего словаparseInt('n', 23)
. :)В любом случае, большой вопрос!
parseInt использует буквенно-цифровое представление, тогда в base-24 «n» действительно, но «u» является недопустимым символом, тогда parseInt только анализирует значение «n» ....
parseInt("n",24) -> 23
в качестве примера попробуйте с этим:
alert(parseInt("3x", 24))
Результат будет «3».
Я думаю, null
преобразуется в строку "null"
. Таким образом, n
на самом деле 23
в 'base24' (то же самое в 'base25' +), u
недопустимо в 'base24', поэтому остальная часть строки null
будет проигнорирована. Вот почему он выдает 23
, пока u
не станет действительным в «base31».
Mozilla сообщает нам :
function parseInt преобразует свой первый аргумент в строку, анализирует его и возвращает целое число или NaN. Если не NaN, возвращаемое значение будет десятичным целочисленным представлением первого аргумента, принятого как число в указанном базисе (base). Например, радиус 10 указывает на преобразование из десятичного числа, 8 восьмеричных, 16 шестнадцатеричных и т. Д. Для радиусов выше 10 буквы алфавита указывают цифры больше 9. Например, для шестнадцатеричных чисел (основание 16) используются A-F.
blockquote>В спецификация , 15.1.2.2/1 сообщает нам, что преобразование в строку выполняется с использованием встроенного
ToString
, который (согласно 9.8) дает"null"
(не путать сtoString
, что"u"
!).Итак, давайте рассмотрим
parseInt("null", 24)
.Конечно, это не целочисленная строка base-24 целиком, но «n» - : decimal 23 .
Теперь разбор остановок после вычитания десятичной цифры 23, потому что
"u"
не найден в системе base-24:Если S содержит любой символ, который не является знаком radix-R, то пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z является S. [15.1.2.2/11]
blockquote>(И поэтому
parseInt(null, 23)
(и более низкие радиусы) дает вамNaN
, а не 23:"n"
не находится в системе base-23.)
parseInt( null, 24 ) === 23
эквивалентен
parseInt( String(null), 24 ) === 23
, который эквивалентен
parseInt( "null", 24 ) === 23
. Цифры для основания 24 равны 0, 1, 2, 3, 4, 5 , 6, 7, 8, 9, a, b, c, d, e, f, ..., n.
Спецификация языка говорит
blockquote>
- Если S содержит любой символ, который не является знаком radix-R, то пусть Z - подстрока S, состоящая из всех символов до первого такого символа; в противном случае пусть Z является S.
, который является частью, которая гарантирует, что целые литералы в стиле C, такие как
15L
, правильно разбираются, поэтому приведенное выше эквивалентноparseInt( "n", 24 ) === 23
"n"
является 23-й буквой списка цифр выше.QED