Хорошим местом для начала является JavaDocs . Они охватывают это:
Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:
- Вызов метода экземпляра нулевого объекта.
- Доступ или изменение поля нулевого объекта.
- Выполнение длины null, как если бы это был массив.
- Доступ или изменение слотов с нулевым значением, как если бы это был массив.
- Бросать нуль, как если бы это было значение Throwable.
Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.
blockquote>Также, если вы попытаетесь использовать нулевую ссылку с
synchronized
, который также выдаст это исключение, за JLS :SynchronizedStatement: synchronized ( Expression ) Block
blockquote>
- В противном случае, если значение выражения равно null,
NullPointerException
.Как это исправить?
Итак, у вас есть
NullPointerException
. Как вы это исправите? Возьмем простой пример, который выдаетNullPointerException
:public class Printer { private String name; public void setName(String name) { this.name = name; } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer(); printer.print(); } }
Идентифицирует нулевые значения
. Первый шаг - точно определить , значения которого вызывают исключение . Для этого нам нужно выполнить некоторую отладку. Важно научиться читать stacktrace . Это покажет вам, где было выбрано исключение:
Exception in thread "main" java.lang.NullPointerException at Printer.printString(Printer.java:13) at Printer.print(Printer.java:9) at Printer.main(Printer.java:19)
Здесь мы видим, что исключение выбрано в строке 13 (в методе
printString
). Посмотрите на строку и проверьте, какие значения равны нулю, добавив протоколирующие операторы или используя отладчик . Мы обнаруживаем, чтоs
имеет значение null, а вызов методаlength
на него вызывает исключение. Мы видим, что программа перестает бросать исключение, когдаs.length()
удаляется из метода.Трассировка, где эти значения взяты из
Затем проверьте, откуда это значение. Следуя вызовам метода, мы видим, что
s
передается сprintString(name)
в методеprint()
, аthis.name
- null.Трассировка, где эти значения должны быть установлены
Где установлен
this.name
? В методеsetName(String)
. С некоторой дополнительной отладкой мы видим, что этот метод вообще не вызывается. Если этот метод был вызван, обязательно проверьте порядок , что эти методы вызывают, а метод set не будет называться после методом печати. Этого достаточно, чтобы дать нам решение: добавить вызов
printer.setName()
перед вызовомprinter.print()
.Другие исправления
Переменная может иметь значение по умолчанию (и
setName
может помешать ему установить значение null):private String name = "";
Либо метод
printString
может проверить значение null например:printString((name == null) ? "" : name);
Или вы можете создать класс, чтобы
name
всегда имел ненулевое значение :public class Printer { private final String name; public Printer(String name) { this.name = Objects.requireNonNull(name); } public void print() { printString(name); } private void printString(String s) { System.out.println(s + " (" + s.length() + ")"); } public static void main(String[] args) { Printer printer = new Printer("123"); printer.print(); } }
См. также:
Я все еще не могу найти проблему
Если вы попытались отладить проблему и до сих пор не имеете решения, вы можете отправить вопрос для получения дополнительной справки, но не забудьте включить то, что вы пробовали до сих пор. Как минимум, включите stacktrace в вопрос и отметьте важные номера строк в коде. Также попробуйте сначала упростить код (см. SSCCE ).
Вы хотите использовать Приложение. Конфигурация.
, Когда Вы добавляете новый объект к проекту, существует что-то названное Конфигурационным файлом Приложений. Добавьте это.
Тогда Вы добавляете ключи в разделе configuration/appsettings
Как:
<configuration>
<appSettings>
<add key="MyKey" value="false"/>
Получают доступ к участникам путем выполнения
System.Configuration.ConfigurationSettings.AppSettings["MyKey"];
, Это работает в .net 2 и выше.
От быстрого чтения предыдущих ответов они выглядят корректными, но не похоже, что любой упомянул новые средства конфигурации в VS 2008. Это все еще использует app.config (скопированный во время компиляции в YourAppName.exe.config), но существует виджет UI для установки свойств и specifiy их типы. Дважды щелкните по Settings.settings в папке "Properties" своего проекта.
большая часть - то, что доступ к этому свойству от кода безопасен с точки зрения типов - компилятор поймает очевидные ошибки как ввод с опечатками имени свойства. Например, как свойство под названием MyConnectionString в app.config получили бы доступ:
string s = Properties.Settings.Default.MyConnectionString;
Разъяснение предыдущих ответов...
1) Добавляют, новый файл к Вашему проекту (Добавьте-> Новый Объект-> Файл Конфигурации приложения)
2), новый файл конфигурации появится в Проводнике Решения как Приложение. Конфигурация.
3) Добавляют, что Ваши настройки в этот файл с помощью следующего в качестве шаблона
<configuration>
<appSettings>
<add key="setting1" value="key"/>
</appSettings>
<connectionStrings>
<add name="prod" connectionString="YourConnectionString"/>
</connectionStrings>
</configuration>
4) Получают их как это:
private void Form1_Load(object sender, EventArgs e)
{
string setting = ConfigurationManager.AppSettings["setting1"];
string conn = ConfigurationManager.ConnectionStrings["prod"].ConnectionString;
}
5), Когда создано, Ваша выходная папка будет содержать файл, названный < assemblyname> .exe.config Это будет копией Приложения. Файл конфигурации. Никакая дальнейшая работа не должна должна быть быть сделана разработчиком для создания этого файла.
Необходимо создать файл App.config (очень похожий на web.config)
, необходимо щелкнуть правой кнопкой по проекту, добавить новый объект, новый "Файл Конфигурации приложения".
Гарантируют, чтобы Вы добавили Систему использования. Конфигурация к Вашему проекту.
Тогда Вы можете добавленные стоимости к нему
<?xml version="1.0" encoding="utf-8" ?>
<configuration>
<appSettings>
<add key="setting1" value="key"/>
</appSettings>
<connectionStrings>
<add name="prod" connectionString="YourConnectionString"/>
</connectionStrings>
</configuration>
<час> private void Form1_Load(object sender, EventArgs e)
{
string setting = ConfigurationManager.AppSettings["setting1"];
string conn = ConfigurationManager.ConnectionStrings["prod"].ConnectionString;
}
<час> Просто примечание, согласно Microsoft, необходимо использовать ConfigurationManager вместо ConfigurationSettings. (см. раздел комментариев), "Класс ConfigurationSettings обеспечивает обратную совместимость только. Для новых приложений необходимо использовать класс ConfigurationManager или класс WebConfigurationManager вместо этого".
Имя по умолчанию для конфигурационного файла [yourexe] .exe.config. Таким образом, notepad.exe будет иметь конфигурационный файл названным notepad.exe.config в той же папке как программа. Это - общий конфигурационный файл для всех аспектов CLR и Платформы, но может содержать Ваши собственные настройки под <appSettings>
узел.
<appSettings>
элемент создает набор пар "имя-значение", к которым можно получить доступ как System.Configuration.ConfigurationSettings.AppSettings
. Нет никакого способа сохранить, возвращается к конфигурационному файлу, как бы то ни было.
также возможно добавить Ваши собственные элементы к конфигурационному файлу - например, определить структурированную установку - путем создания класса, который реализует IConfigurationSectionHandler
и добавление его к <configSections>
элемент конфигурационного файла. Можно тогда получить доступ к нему путем вызова ConfigurationSettings.GetConfig
.
.NET 2.0 добавляет новый класс, System.Configuration.ConfigurationManager
, который поддерживает несколько файлов с переопределениями в расчете на пользователя данных на систему. Это также поддерживает измененные конфигурации сохранения назад в файлы настроек.
Visual Studio создает файл, названный App.config
, который она копирует в папку EXE с корректным именем, когда проект разрабатывается.
В формах Windows Вы имеете app.config
, который очень похож на web.config
. Но начиная с того, что я вижу, Вы нуждаться в нем для являетесь пользовательскими значениями, я предлагаю использовать Настройки. Чтобы сделать это, откройте свои свойства проекта, затем перейдите к настройкам. Если файл настроек не будет существовать, то у Вас будет ссылка для создания той. Затем можно добавить настройки к таблице, которую Вы видите там, который генерировал бы и соответствующий XML и класс Настроек, который может использоваться, чтобы загрузить и сохранить настройки. Класс настроек назовут чем-то как DefaultNamespace.Properties.Settings
. Затем можно использовать код, подобный:
using DefaultNamespace.Properties;
namespace DefaultNamespace {
class Class {
public int LoadMySettingValue() {
return Settings.Default.MySettingValue;
}
public void SaveMySettingValue(int value) {
Settings.Default.MySettingValue = value;
}
}
}
Лучшая статья (IMHO) о Конфигурации приложения.NET находится на CodeProject , Распутывающем Тайны.NET 2.0 Конфигурации . И моя следующая любимая (более короткая) статья о разделах в .net конфигурационных файлах Обработчики Разделов Понимания - Файл .
App.configЯ соглашаюсь с другими ответами, которые указывают на Вас на app.config. Однако вместо того, чтобы читать значения непосредственно из app.config, необходимо создать служебный класс (AppSettings является именем, которое я использую) считать их и представить их как свойства. Класс AppSettings может привыкнуть к совокупным настройкам от нескольких хранилищ, таких как значения от app.config и информация о версии приложения от блока (AssemblyVersion и AssemblyFileVersion).
Очень простой способ сделать это состоит в том, чтобы использовать Ваш Ваше собственное Settings
класс .
Какую версию.Net и VS Вы используете?
при создании нового проекта у Вас должен быть файл в Вашем решении, названном app.config, который является конфигурационным файлом по умолчанию.
Система. Конфигурация. ConfigurationSettings. AppSettings["MyKey"];
AppSettings удержали от использования и теперь считают устаревшим. [ ссылка ]
, Кроме того, appSettings раздел app.config был заменен разделом applicationSettings.
, Поскольку кто-то еще упомянул, необходимо использовать Систему. Конфигурация. ConfigurationManager [ ссылка ], который является новым для.Net 2.0