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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
System.Data
является пространством имен , System.Data.DLL
(файл) является сборкой .
Пространство имен является логической группировкой типов (в основном, чтобы избежать столкновений имен). Сборка может содержать типы в нескольких пространствах имен (System.DLL
содержит несколько ...), и одно пространство имен может быть распределено по сборкам (например, System.Threading
).
Короче:
Сборка:
Сборка представляет собой фундаментальный блок группировки физического кода. Это модуль вывода. Это подразделение Deployment & amp; блок управления версиями.
Пространство имен:
Пространство имен представляет собой базовую единицу группировки логических кодов. Это коллекция имен, в которых каждое имя уникально. Они образуют логическую границу для группы классов. В свойствах проекта должны быть указаны пространство имен.
Другие дали очень хорошие и подробные ответы на этот вопрос. Но я хочу отметить, что, когда вы не уверены, вы можете посмотреть на MSDN. Библиотека MSDN очень четко и просто объясняет пространство имен и сборку, в которых находится данный тип. Он даже говорит имя файла (in System.Data.dll)
, поэтому нет никакой двусмысленности.
[/g0]
Как пишет @amdluigi, «как правило, имя сборки такое же, как пространство имен, которое оно содержит, но не всегда».
В объекте System.Data.dll есть скриншот выше. Браузер в студии. Это отличный пример для изучения проблем здесь. Обратите внимание, что большинство пространств имен, содержащихся в сборке, являются System.Data или подпространством имен System.Data.
Как правило, для имен сборки должно быть связано с пространством имён , Обратите внимание, что когда Studio сначала создает проект для сборки сборки, одним из свойств проекта является пространство имен по умолчанию. Вначале Studio предоставляет пространство имен по умолчанию с тем же именем, что и сам проект. Если вы когда-нибудь захотите переименовать проект, подумайте об изменении своего пространства имен по умолчанию.
Есть два дополнительных пространства имен: Microsoft.SqlServer понятен. Некоторые типы SQL Server, которые они не хотели упаковывать в отдельную сборку.
Но что с System.Xml ???? Существует сборка System.Xml.dll. Почему это пространство имен также отображается в System.Data.dll?
Обратите внимание, что сборка может повторно открыть пространство имен и добавить к нему больше - это именно то, что System.Data.dll делает с системой. Xml namespace.
Причина в том, что пространства имен имеют нулевые значения производительности, но сборки очень много. Если у вас 1000 классов с большим количеством кода, вы не хотите, чтобы одна сборка имела очень большой объем памяти. Также вы не хотите 1000 сборок каждый с одним классом. Любая сборка должна быть загружена в память до того, как ее содержимое будет выполнено. Вы хотите, чтобы сборка содержала разумное количество взаимосвязанных классов, поэтому, как только ваше приложение загрузило сборку для получения одного из своих классов, она получит другие классы, которые, скорее всего, потребуются для приложения. Гранулярность важна: не слишком большая, не слишком маленькая, просто.
Обратите внимание, что System.Data.dll снова открывает System.Xml и добавляет ровно один класс: XmlDataDocument. Случается, что этот класс используется для интерпретации реляционных данных как XML-документа. Если ваше приложение просто использует XML, ему не нужен этот класс. Если ваше приложение имеет дело с реляционными данными, оно может. Таким образом, хотя XmlDataDocument наследуется от XmlDocument и находится в пространстве имен System.Xml, он упакован в сборку System.Data.dll.
Все это особенно важно, если у вас есть фон с Java, где есть только одна концепция, пакет. В .NET есть две, сборка и пространство имен. Эти два ортогональны. Очевидно, что сборка содержит более одного пространства имен. Сборка может снова открыть пространство имен и добавить к нему больше - другими словами, типы в пространстве имен могут охватывать более одной сборки.
Файл, который вы видите в GAC, является System.Data.dll
, который является сборкой и содержит пространства имен, включая System.Data
. Если вы просмотрите свойства Reference в Visual Studio, вы увидите:
[/g0]
Позже, если вы щелкните правой кнопкой мыши по ссылке и выберите вид в браузере объектов, вы будут видеть пространства имен в этой конкретной сборке.
[/g1]
Короче:
Советы.
Сборка содержит набор типов (например, l'assembly System содержит много пространств имен, включенных System, System.IO, ecc). Как правило, имя сборки совпадает с именем пространства, которое оно содержит, но не всегда.
Другой пример сборок и пространств имен.
Assembly 1 (CoreAssembly.DLL)
Содержит пространства имен Namespace1.subnamespace1
Сборка 2 (ExtensionCoreAssembly.DLL)
Содержит пространства имен Namespace1.subnamespace1
Возможно использование названия сборки, которое содержит различные пространства имен, и расширяет существующую сборку с помощью другой сборки по этой методике.
ОПРЕДЕЛЕНИЯ.
Ассембли
Сборка представляет собой набор типов и ресурсов, которые образуют логическую единицу функциональности. Все типы в .NET Framework должны существовать в сборках; общая среда исполнения не поддерживает типы вне сборок. Каждый раз, когда вы создаете приложение Microsoft Windows®, службу Windows, библиотеку классов или другое приложение с Visual Basic .NET, вы создаете единую сборку. Каждая сборка хранится как файл .exe или .dll. Примечание. Хотя технически возможно создавать сборки, которые охватывают несколько файлов, вряд ли вы будете использовать эту технологию в большинстве ситуаций.
Пространства имен
Еще один способ организовать ваш Visual Basic .NET код осуществляется с помощью пространств имен. Пространства имен не заменяют сборки, а второй организационный метод, который дополняет сборки. Пространства имен - это способ группировки имен типов и уменьшения вероятности столкновений имен. Пространство имен может содержать как другие пространства имен, так и типы. Полное имя типа включает комбинацию пространств имен, которые содержат этот тип.
Ссылка: http://msdn.microsoft.com/en-us/library/ms973231.aspx
Они являются пространствами имен. Ассембли содержат более одного пространства имен. Например: System.dll
содержит эти пространства имен (и более):
[/g3]
Также одно пространство имен может содержать вложенные пространства имен. Они являются просто логическими именами для организации кода. Следует помнить, что файлы DLL
представляют собой сборки, содержащие пространства имен.
GAC
- глобальный кэш сборок. Согласно MSDN:
Кэш глобальной сборки хранит сборки, специально предназначенные для совместного использования несколькими приложениями на компьютере.
blockquote>Так часто используемые сборки хранятся в файле
GAC
, и поэтому вам не нужно копировать все файлы сборки в каталог проекта, который вы ссылаетесь на ваш проект. Сборками, хранящимися вGAC
, являются Strong-Named . Обычно, когда вы добавляете ссылку на сборку из вашего проекта, которая не являетсяStrong-Named
, копия вашего файла.dll
будет создана в вашей папкеbin\Debug
. Если вы хотите, чтобы вы могли сделать свою сборку (например, проект библиотеки классов) Strong-Named.See: Как зарегистрировать сборку с сильным именем
Пространство имен - это логическая группировка классов, принадлежащих к той же функциональности. Таким образом, System.Web
и System.Data
являются пространствами имен
MSDN описывают это как:
Пространства имен в основном используются в программировании на C # двумя способами. Во-первых, .NET Framework использует пространства имен для организации своих многочисленных классов. Во-вторых, объявление собственных пространств имен может помочь контролировать область имен классов и методов в более крупных проектах программирования.
[/g2]
blockquote>Assembly является фрагментом (предварительно скомпилированным) кодом, который может быть запущен средой выполнения .NET. Он содержит одно или несколько пространств имен. Программа .NET состоит из одной или нескольких сборок.
System.Web.dll
иSystem.Data.dll
являются сборками.MSDN описывает это как:
Ассембли являются строительными блоками приложений .NET Framework; они образуют основную единицу развертывания, контроль версий, повторное использование, определение области действия и разрешения безопасности. Сборка представляет собой набор типов и ресурсов, которые созданы для совместной работы и образуют логическую единицу функциональности. Сборка обеспечивает общую языковую среду выполнения с информацией, которая должна быть осведомлена о реализациях типов. Для среды выполнения тип не существует вне контекста сборки.
[/g3]
blockquote>