Самый простой способ иметь конфигурационный файл в Приложении C# Windows Forms

Что такое NullPointerException?

Хорошим местом для начала является JavaDocs . Они охватывают это:

Брошено, когда приложение пытается использовать null в случае, когда требуется объект. К ним относятся:

  • Вызов метода экземпляра нулевого объекта.
  • Доступ или изменение поля нулевого объекта.
  • Выполнение длины null, как если бы это был массив.
  • Доступ или изменение слотов с нулевым значением, как если бы это был массив.
  • Бросать нуль, как если бы это было значение Throwable.

Приложения должны бросать экземпляры этого класса для указания других незаконных видов использования нулевого объекта.

blockquote>

Также, если вы попытаетесь использовать нулевую ссылку с synchronized, который также выдаст это исключение, за JLS :

SynchronizedStatement:
    synchronized ( Expression ) Block
  • В противном случае, если значение выражения равно null, NullPointerException.
blockquote>

Как это исправить?

Итак, у вас есть 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 = "";

Либо метод print, либо 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 ).

85
задан 2 revs 21 September 2015 в 12:58
поделиться

11 ответов

Вы хотите использовать Приложение. Конфигурация.

, Когда Вы добавляете новый объект к проекту, существует что-то названное Конфигурационным файлом Приложений. Добавьте это.

Тогда Вы добавляете ключи в разделе configuration/appsettings

Как:

<configuration>
 <appSettings>
  <add key="MyKey" value="false"/>

Получают доступ к участникам путем выполнения

System.Configuration.ConfigurationSettings.AppSettings["MyKey"];

, Это работает в .net 2 и выше.

119
ответ дан qui 24 November 2019 в 08:11
поделиться

От быстрого чтения предыдущих ответов они выглядят корректными, но не похоже, что любой упомянул новые средства конфигурации в VS 2008. Это все еще использует app.config (скопированный во время компиляции в YourAppName.exe.config), но существует виджет UI для установки свойств и specifiy их типы. Дважды щелкните по Settings.settings в папке "Properties" своего проекта.

большая часть - то, что доступ к этому свойству от кода безопасен с точки зрения типов - компилятор поймает очевидные ошибки как ввод с опечатками имени свойства. Например, как свойство под названием MyConnectionString в app.config получили бы доступ:

string s = Properties.Settings.Default.MyConnectionString;
26
ответ дан maxfurni 24 November 2019 в 08:11
поделиться

Разъяснение предыдущих ответов...

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 Это будет копией Приложения. Файл конфигурации. Никакая дальнейшая работа не должна должна быть быть сделана разработчиком для создания этого файла.

66
ответ дан ZombieSheep 24 November 2019 в 08:11
поделиться

Необходимо создать файл 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 вместо этого".

9
ответ дан Nathan Koop 24 November 2019 в 08:11
поделиться

Имя по умолчанию для конфигурационного файла [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 с корректным именем, когда проект разрабатывается.

7
ответ дан Mike Dimmick 24 November 2019 в 08:11
поделиться

В формах 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;
        }
    }
}
3
ответ дан configurator 24 November 2019 в 08:11
поделиться

Лучшая статья (IMHO) о Конфигурации приложения.NET находится на CodeProject , Распутывающем Тайны.NET 2.0 Конфигурации . И моя следующая любимая (более короткая) статья о разделах в .net конфигурационных файлах Обработчики Разделов Понимания - Файл .

App.config
6
ответ дан TcKs 24 November 2019 в 08:11
поделиться

Я соглашаюсь с другими ответами, которые указывают на Вас на app.config. Однако вместо того, чтобы читать значения непосредственно из app.config, необходимо создать служебный класс (AppSettings является именем, которое я использую) считать их и представить их как свойства. Класс AppSettings может привыкнуть к совокупным настройкам от нескольких хранилищ, таких как значения от app.config и информация о версии приложения от блока (AssemblyVersion и AssemblyFileVersion).

2
ответ дан Jamie Ide 24 November 2019 в 08:11
поделиться

Очень простой способ сделать это состоит в том, чтобы использовать Ваш Ваше собственное Settings класс .

2
ответ дан Community 24 November 2019 в 08:11
поделиться

Какую версию.Net и VS Вы используете?

при создании нового проекта у Вас должен быть файл в Вашем решении, названном app.config, который является конфигурационным файлом по умолчанию.

0
ответ дан Geoff 24 November 2019 в 08:11
поделиться

Система. Конфигурация. ConfigurationSettings. AppSettings["MyKey"];

AppSettings удержали от использования и теперь считают устаревшим. [ ссылка ]

, Кроме того, appSettings раздел app.config был заменен разделом applicationSettings.

, Поскольку кто-то еще упомянул, необходимо использовать Систему. Конфигурация. ConfigurationManager [ ссылка ], который является новым для.Net 2.0

1
ответ дан Edward Manning 24 November 2019 в 08:11
поделиться
Другие вопросы по тегам:

Похожие вопросы: