NullPointerException
s - исключения, возникающие при попытке использовать ссылку, которая указывает на отсутствие местоположения в памяти (null), как если бы она ссылалась на объект. Вызов метода по нулевой ссылке или попытка получить доступ к полю нулевой ссылки вызовет функцию NullPointerException
. Они наиболее распространены, но другие способы перечислены на странице NullPointerException
javadoc.
Вероятно, самый быстрый пример кода, который я мог бы придумать для иллюстрации NullPointerException
, be:
public class Example {
public static void main(String[] args) {
Object obj = null;
obj.hashCode();
}
}
В первой строке внутри main
я явно устанавливаю ссылку Object
obj
равной null
. Это означает, что у меня есть ссылка, но она не указывает на какой-либо объект. После этого я пытаюсь обработать ссылку так, как если бы она указывала на объект, вызывая метод на нем. Это приводит к NullPointerException
, потому что нет кода для выполнения в местоположении, на которое указывает ссылка.
(Это техничность, но я думаю, что она упоминает: ссылка, которая указывает на null, равна 't то же, что и указатель C, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
, C# переводит ключевое слово урожая в конечный автомат во время компиляции. VB.NET не имеет ключевого слова урожая, но оно действительно имеет свой собственный механизм для того, чтобы безопасно встроить состояние в функции, которая не легко доступна в C#.
ключевое слово C# static
обычно переводится в Visual Basic с помощью Shared
ключевое слово, но существует два места, где вещи становятся сбивающими с толку. Каждый - это, статическим классом C# является действительно Модуль в Visual Basic, а не Общем классе (Вы думали бы, что они позволили Вам кодировать его так или иначе в Visual Basic, но noooo). Другой то, что VB.NET действительно имеет его собственное Static
ключевое слово. Однако Static
имеет различное значение в VB.NET.
Вы используете Static
ключевое слово в VB.NET для объявления переменной в функции, и когда Вы делаете переменная сохраняет свое состояние через вызовы функции. Это отличается, чем просто объявление частного статического участника класса в C#, потому что статический функциональный участник в VB.NET, как гарантируют, также будет ориентирован на многопотоковое исполнение, в котором компилятор переводит его для использования класса Монитора во время компиляции.
Итак, почему запись все это здесь? Ну, должно быть возможно создать допускающий повторное использование дженерик Iterator<T>
класс (или Iterator(Of T)
в VB.NET). В этом классе Вы реализовали бы конечный автомат, используемый C#, с Yield()
и Break()
методы, которые соответствуют ключевым словам C#. Тогда Вы могли использовать статический экземпляр (в смысле VB.NET) в функции так, чтобы он мог в конечном счете сделать в значительной степени то же задание как C# yield
приблизительно в том же объеме кода (отбрасывание класса implemenation самого, так как это было бы бесконечно допускающим повторное использование).
я не заботился достаточно об Урожае для попытки его сам, но это должно быть выполнимым. Однако это также совсем не тривиально, как член команды C# Eric Lippert называет это" самое сложное преобразование в компиляторе ".
я также приехал для веры, так как я записал первый проект этого более чем год назад, что это не действительно возможно значимым способом до Visual Studio, 2010 выходит, поскольку это потребовало бы отправки нескольких лямбд к классу Итератора, и так быть действительно практичными нам нужно .NET 4 поддержка многострочных лямбд.
Я лично просто пишу свой собственный класс итератора, который наследовался IEnumerator (T). Это действительно берет когда-то для разбираний в нем, но я думаю в конце, лучше записать, что это прямо тогда старается избегать его. Другой метод, который я сделал, должен записать рекурсивный метод, который возвращает IEnumerable (T) и просто возвращает Список (T) и использует.AddRange.
Хотелось бы надеяться, это будет вещью прошлого со следующей версией VB. Так как итераторы на самом деле получают много важное с новыми парадигмами (особенно LINQ в сочетании с отложенными вычислениями), это имеет настоящий высокий приоритет, насколько я знаю из блога Paul Vick. С другой стороны Paul больше глава команды VB и у меня еще не было времени для наблюдения переговоров по PCD.
однако, если Вам интересно, они связаны в блог .
Paul Есть хорошая статья Использование итераторов в VB Now Билла Маккарти в Visual Studio Magazine по эмуляции ] yield
в VB.NET. Или дождитесь следующей версии Visual Basic.