Internet Explorer 8 и Internet Explorer 6 рядом [дубликат]

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

28
задан Community 23 May 2017 в 11:53
поделиться

11 ответов

Я также использую виртуализацию. Я имею Виртуальный ПК 2007, который является бесплатной загрузкой от здесь , на моей машине и загрузил Internet Explorer изображения ПК Virual с Microsoft. Можно получить изображения здесь .

21
ответ дан Peter Mortensen 28 November 2019 в 02:50
поделиться

Microsoft не поддерживает несколько версий Internet Explorer в одной операционной системе. Причина состоит в том, что операционная система и Internet Explorer совместно используют определенный DLLs. Когда Вы обновляете от Internet Explorer 6 до Internet Explorer 7 (или Internet Explorer 8), Вы на самом деле заменяете некоторую систему DLLs. Это - причина, почему Вы "получаете" Internet Explorer 6 при удалении Internet Explorer 7.

Chris Wilson, архитектор Internet Explorer, решил эту проблему в сообщении в блоге Несколько IES на одной машине . Chris заявляет, что непрерывная замена mshtml.dll могла бы работать на CSS, представляющий "..., но это не то же как наличие полного набора новой системы Internet Explorer DLLs, установленный", и конечно не считалось бы категорическим решением.

виртуализация Only может обеспечить полный стек DLL для категорического тестирования.

Редактирование:

18 марта 2009, команда Microsoft Expression Web выпустила SuperPreview, бесплатное автономное приложение, которое позволяет перекрестный браузер бок о бок и onionskin сравнение между Internet Explorer 8, Internet Explorer 8 - Интернет режим эмуляции Explorer7 и Internet Explorer 6. Дополнительные браузеры и услуга по запросу планируются для рендеринга страниц в в реальном времени в других операционных системах.

Редактирование в ответ на комментарий

Zac спасибо за комментарий. сеть Выражения 3 (который будет включать SuperPreview) позволит сравнение между любой комбинацией Internet Explorer 6, Internet Explorer 7, Internet Explorer 8, и Firefox 3. Это согласно записи в блоге Somasgear сеть Expresion 3 отправлено 5 июня 2009. В снимке экрана на его блоге Вы будете рассматривать Firefox 3 как основной браузер (левая сторона) и Internet Explorer 6 как браузер сравнения. Любой браузер может быть помещен по обе стороны от окна сравнения.

16
ответ дан Peter Mortensen 28 November 2019 в 02:50
поделиться

Попробуйте это: http://www.my-debugbar.com/wiki/IETester/HomePage
LE: Это еще не действительно полностью совместимо, существует несколько незначительных проблем, как он катастрофические отказы на всплывающих окнах JavaScript, но я нашел его довольно надежным во время разработки. В конце всего я просто протестировал веб-приложение против реального IE6, чтобы удостовериться, что все прекрасно.

10
ответ дан 28 November 2019 в 02:50
поделиться

Виртуализация является самым легким способом достигнуть этого. Это имеет более высокие издержки, но так как IE имеет столько рычагов в ОС, пытающуюся устанавливать несколько версий его, обречен на беспорядок и отказ.

8
ответ дан John Millikin 28 November 2019 в 02:50
поделиться

Очень легкое (и просто выпущенный) способ сделать это должно использовать сеть SuperPreview Выражения. Это позволяет Вам сравнивать IE6 и IE7 (или IE6 и IE8+IE7-compatibility-mode) бок о бок. Это - в настоящее время просто предварительный просмотр, но я использовал его с хорошими результатами. Они собираются выпустить коммерческую версию, которая включает бок о бок сравнение большего количества браузеров, но они говорят, что определенный для IE останется свободным навсегда.

3
ответ дан sblom 28 November 2019 в 02:50
поделиться

Или выполненный это в VM, ожидайте, непока кратные числа не добавили IE8 или, используют http://browsershots.org/ , который сделает снимки экрана Вашего веб-сайта от нескольких различных Работ systmes и браузеры.

2
ответ дан UnkwnTech 28 November 2019 в 02:50
поделиться

Существует также IE7 автономный

1
ответ дан meleyal 28 November 2019 в 02:50
поделиться

То, что я делаю, использовать VMware с другой ОС с IE6.

Не прекрасный, но это помогает.

0
ответ дан Daniel Silveira 28 November 2019 в 02:50
поделиться

Я использую утилиту под названием «Песочница» (бесплатно для личного пользования, 29 долларов США для рекламы) для обеспечения изолированной среды приложений. Одним из полезных побочных эффектов этого является то, что вы можете устанавливать приложения (даже модифицирующие ОС, такие как IE) в песочницу, а родительская ОС совершенно не осведомлена (что позволяет иметь разные версии IE родительской ОС и изолированного IE) - и оба работают одновременно). Два сценария, которые я использовал до сих пор:

  • Internet Explorer 7 в родительской ОС и удаление IE7 в песочнице, чтобы сделать IE6 доступным
  • Internet Explorer 6 в родительской ОС, и обновление до IE8 в песочнице

Предостережения:

  • Если вам нужно более одной доступной версии IE одновременно , то вам нужно будет приобрести полную версию, поскольку вы можете иметь только одну версию IE в изолированной программной среде, а бесплатная версия поддерживает только одну активную изолированную программную среду за один раз
  • Установка версии IE в изолированную программную среду может потребовать небольшой проб и ошибок - IE8 был особенно хитрым. Некоторые предупреждения, которые появляются во время установки (или удаления), являются тривиальными.
0
ответ дан 28 November 2019 в 02:50
поделиться

Еще один вариант нескольких автономных IE: Коллекция IE .

3
ответ дан 28 November 2019 в 02:50
поделиться

Я написал пошаговое сообщение в блоге , показывающее, как запускать IE6, IE7 и IE8 как «виртуальные приложения» в Windows 7 Ultimate.

2
ответ дан 28 November 2019 в 02:50
поделиться