Почему не выдают ошибку компиляции или исключение времени выполнения?
blockquote>Поскольку спецификация языка требует, чтобы арифметика на примитивных типа была по модулю
2^width
, поэтому-1
становится2^16-1
какchar
.В разделе о целых операциях указано, что
Встроенный целочисленные операторы никак не указывают на переполнение или недополнение.
blockquote>, чтобы запретить бросать исключение.
Для используемого оператора postfix-декремента, в частности, его поведение указанный в 15.14.3
В противном случае значение 1 вычитается из значения переменной, а разница сохраняется в переменной. Перед вычитанием выполняется двоичное числовое продвижение (§5.6.2) на значение 1 и значение переменной. При необходимости различие сужается сужением примитивного преобразования (п. 5.1.3) и / или подвергается конверсии бокса (п. 5.1.7) к типу переменной до ее сохранения. Значение выражения постфиксного декремента - это значение переменной до того, как будет сохранено новое значение.
blockquote>Двоичное числовое продвижение преобразует оба значения: 1 и
int
(поскольку тип здесьchar
), таким образом, у вас есть промежуточный результат-1
какint
, тогда выполняется сужающее примитивное преобразование:Сужение преобразования знакового целого числа в интегральный тип T просто отбрасывает все, кроме n бит младшего разряда, где n - количество бит, используемых для представления типа T. В дополнение к возможной потере информации о величине числового значения это может привести к признаку результата значение отличается от знака входного значения.
blockquote>, что приводит к
char
значению0xFFFF
(поскольку Java указывает двоичное представление представления для его знаковых целых типов, явно указанных в спецификация унарный минус ):Для целых значений отрицание такое же, как и вычитание от нуля. Язык программирования Java использует представление двух дополнений для целых чисел, а диапазон значений двух дополнений не является симметричным, поэтому отрицание максимального отрицательного int или long приводит к тому же максимальному отрицательному числу. В этом случае происходит переполнение, но исключение не генерируется. Для всех целочисленных значений x, -x равно (~ x) +1.
blockquote>Для общего поведения обертывания для результатов вне диапазона в качестве примера в спецификация оператора умножения :
Если целочисленное умножение переполняется, то результатом являются младшие биты математического произведения, представленные в некотором достаточно большом формате с двумя дополнениями. В результате, если происходит переполнение, знак результата может быть не таким, как знак математического произведения двух значений операнда.
blockquote>Подобные фразы встречаются в спецификации целочисленное сложение и вычитание требуются для выполнения
a - b == a + (-b)
, поэтому следует поведение переполнения.
Вы никогда не закрывали первый элемент
.
Поэтому, когда цикл повторяется, он пытается прочитать второй
внутри первого .
Вам нужно дважды вызвать ReadEndElement ()
в конце цикла.
Если вы можете использовать .NET 3.5, я бы рекомендовал использовать XML литералы и синтаксис LINQ.
Dim ips = From xe In XElement.Parse(xmlString).<ip> _
Select New With {.IP = xe.<ip>.Value, _
.Ping = xe.<ping>.Value, _
.HostName = xe.<hostname>.Value}
'if you only want one
Dim firstIp = ips.First()
Существует также XElement.Load
, который можно использовать для загрузки из файла.