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, указывающий на недопустимую ячейку памяти. Нулевой указатель буквально не указывает на в любом месте , который отличается от указаний на местоположение, которое оказывается недопустимым.)
Во-первых, Вашему интерфейсу нужен ComVisible (верный), чтобы быть замеченным сценарием выполнения вызова (это, вероятно, вызывает ошибку).
Во-вторых, добавьте.NETreference в своем проекте к "Microsoft.mshtml". Это импортирует COM-интерфейсы для различных связанных с IE вещей (окна, документы HTML, и т.д.)
Затем необходимо добавить свойство типа IHtmlDocument2 к интерфейсу:
IHtmlDocument2 Document { set; }
... реализуйте его в своем классе:
public IHtmlDocument2 Document
{
set { _doc = value;}
}
... назовите его из сценария
CTIAX.Document = document;
... после того как Вы сохранили ссылку на документ, можно использовать его по желанию для получения до окна, других кадров или любой части DOM HTML, которого Вы желаете.
Я нашел осуществимое решение. Это не идеально, потому что это полагается на соответствие URL местоположения окна IE для получения корректного контейнера, но это действительно работает. В моем случае я использую специальное значение на строке запроса, чтобы удостовериться, что я получаю правильное окно.
Это получает ссылку на SHDocVw. InternetExplorer, который подвергает тот же GetProperty и PutProperty что SHDocVw. WebBrowser делает:
private InternetExplorer GetIEWindow(string url)
{
SHDocVw.ShellWindowsClass sh = new ShellWindowsClass();
InternetExplorer IE;
for (int i = 1; i <= sh.Count; i++)
{
IE = (InternetExplorer)sh.Item(i);
if (IE != null)
{
if (IE.LocationURL.Contains(url))
{
return IE;
}
}
}
return null;
}