Сервер разработки ASP.NET или IIS Localhost?

Что такое 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 ).

26
задан Community 23 May 2017 в 12:16
поделиться

9 ответов

Нет ничего, что может сделать ASP.NET Dev WebService, тот IIS не может (Можно установить точки останова и т.д., просто присоединить отладчик VS ко времени выполнения ASP.NET).

Однако ASP.NET Dev WebService не представляет истинную продуктивную среду, и как таковой, Вы можете быть пойманы глюками, которые Вы не ожидали бы, когда Вы развертываетесь к производству.

Из-за этого, я передаю под мандат ту всю разработку, сделан с помощью IIS на локальной машине. Не требуется большой работы для конфигурирования сайта в IIS.

32
ответ дан FlySwat 28 November 2019 в 06:22
поделиться

Это - очень хорошая идея. Вот некоторые причины:

  • Вы больше потребность доступ администратора к Вашей машине для веб-разработки (это может все еще быть полезно).
  • намного легче протестировать номер с переодеванием и продолжить работу, и , более быстрые итеративные циклы хороши .
  • Это может упростить установку и развертывание Ваших сред разработки.
  • версия XP IIS имеет ограничение, которые не присутствуют в Серверной версии, которую обходит Cassini.

единственный аргумент, против которого я знаю, - то, что существует пара очень редких пограничных случаев, где Cassini, встроенный сервер точно не подражает IIS, потому что Вы используете числа нечетного порта. Я сомневаюсь, что Вы будете когда-либо сталкиваться с ними, и использование Cassini, поскольку основная dev среда не устраняет разработчиков от также наличия доступа к IIS на машине. На самом деле, моей предпочтительной установкой является Cassini сначала для самой маленькой работы, затем развернитесь к моему локальному IIS для большего количества всестороннего тестирования перед положением обратно кода в общий исходный репозиторий.

[Редактирование]
Забыл о перезаписи URL. Вам действительно нужен IIS для этого. И пример ограничения встроенного XP, который IIS - то, что Вы ограничены одним сайтом в XP (может иметь несколько приложений, но это - другая вещь).

25
ответ дан Joel Coehoorn 28 November 2019 в 06:22
поделиться

Поскольку я заявил здесь: https://stackoverflow.com/questions/103785/what-are-the-disadvantages-of-using-cassini-instead-of-iis Ваши разработчики должны знать, что Cassini работает как локальный пользователь, который обычно является администраторским счетом на разработчиков. Разработка будет в состоянии получить доступ к любому файлу или ресурсу, что их учетная запись может, который очень отличается от того, что они будут видеть на сервере IIS 6.

другая вещь это - довольно большой глюк, отлаживает веб-сервисы, намного более легкое использование IIS и vdirs, а не отдельные экземпляры Cassini.

5
ответ дан Community 28 November 2019 в 06:22
поделиться

Я должен был переключиться (назад) на IIS для одного проекта, потому что я должен был установить [приблизительно 111] виртуальные каталоги , который не возможен на веб-сервере Разработки ASP.NET.

5
ответ дан splattne 28 November 2019 в 06:22
поделиться

Я знаю однажды, что у меня была проблема с Аутентификацией, не работающей как ожидалось над Cassini (созданный в сервере разработки)

кроме того, если необходимо протестировать вещи как плагины ISAPI (переписатель, например), я не уверен, как это сделано на Cassini.

постоянно изменяющийся порт является также довольно дезориентирующим мне. Кроме того, для каждого веб-проекта в Вашем решении это разжигает другой экземпляр сервера Казино, и каждый берет где угодно от 20 до 50 МБ памяти.

я использую IIS все время, довольно легко установить, и Вы, парни уже делают это...

2
ответ дан CubanX 28 November 2019 в 06:22
поделиться

Я использовал оба метода, и я предпочитаю иметь IIS локально по сравнению с использованием встроенного сервера. Самое малое Вы более согласовываетесь с заключительной установкой развертывания.

2
ответ дан Jeremy Bade 28 November 2019 в 06:22
поделиться

Кроме того, при использовании IIS 5.1, убедиться добраться администратор JetStat IIS , это добавляет функциональность, которая отключена из поля на IIS 5, таком как способность установить несколько сайтов.

1
ответ дан FlySwat 28 November 2019 в 06:22
поделиться

Я столкнулся со следующими ограничениями с сервером asp.net dev:

  1. не поддерживает виртуальные каталоги. Если они вам нужны в вашем приложении, IIS, кажется, ваш единственный выбор

  2. Классические страницы asp не запускаются на сервере разработки. Итак, если у вас смешанное веб-приложение (например, у меня сейчас есть у моего клиента), IIS, кажется, является решением

  3. Если вам нужен пользовательский интерфейс администратора для настройки параметров, IIS работает лучше

Конечно, IIS требует, чтобы вы были локальным администратором.

1
ответ дан 28 November 2019 в 06:22
поделиться

Основная проблема, с которой я столкнулся с сервером разработки, - это SerializationExceptions с настраиваемыми участниками безопасности, хранящимися в контексте потока. Подробности здесь .

0
ответ дан 28 November 2019 в 06:22
поделиться
Другие вопросы по тегам:

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