NullReferenceException com ToolTip.CreateHandle
-
05-07-2019 - |
Pergunta
Nós esporadicamente receber erros quando tentar actualizar uma dica de ferramenta, como este
ToolTip.SetToolTip(myLabel, customDataStructure)
O erro que temos é um NullReferenceException: Object reference not set to an instance of an object
Alguém sabe a causa desta?
é um simples Try/Catch
que come o NullReferenceException
uma opção viável? Nós não queremos que toda a nossa aplicação para explodir quando chegarmos isso.
Solução
Eu diria que você está chamando ToolTip.SetTooltip
de um manipulador de eventos e que manipulador às vezes dispara antes do rótulo foi criado. Você provavelmente deve guardar este com um cheque para o rótulo de ser null
e certifique-se de que a ponta da ferramenta é inicializado no evento Load
do rótulo.
Você certamente deve não apenas capturar a exceção como este esconde o problema.
Outras dicas
Ignorando exceções é raramente se sempre uma boa idéia. A exceção é lançada porque algo está errado na implementação atual. Ao ignorar a exceção da aplicação passa, basicamente, em um estado indefinido e você provavelmente verá outros efeitos estranhos devido à referência faltando.
Uma vez que este é esporádica que poderia ser um problema de condição de corrida, então você tem que olhar atentamente para o código para descobrir se existem situações em que a referência pode ser usado antes de ser inicializado corretamente.
Tente para testar se você está definindo que var em qualquer situação, usando o depurador, por exemplo ...
é um Try simples / catch que come o NullReferenceException uma opção viável?
Isso não resolveria o problema, seria escondê-lo. A prática de programação ruim.
A causa mais comum é quando você fechar uma janela e Validação ocorre que os conjuntos de uma dica de ferramenta em um controle invisível.
Eu não tenho depurado no Código .Net, mas tem uma boa idéia bastante onde o erro é lançado no código do ToolTip.CreateHandle:
private void CreateHandle()
{
if (this.GetHandleCreated())
{
return;
}
IntPtr userCookie = UnsafeNativeMethods.ThemingScope.Activate();
try
{
SafeNativeMethods.InitCommonControlsEx(new NativeMethods.INITCOMMONCONTROLSEX
{
dwICC = 8
});
CreateParams createParams = this.CreateParams;
if (this.GetHandleCreated())
{
return;
}
//HERE! I suspect window is null when the form is closed
this.window.CreateHandle(createParams);
}
finally
{
UnsafeNativeMethods.ThemingScope.Deactivate(userCookie);
}
if (this.ownerDraw)
{
int num = (int)((long)UnsafeNativeMethods.GetWindowLong(new HandleRef(this, this.Handle), -16));
num &= -8388609;
UnsafeNativeMethods.SetWindowLong(new HandleRef(this, this.Handle), -16, new HandleRef(null, (IntPtr)num));
}
A condição de corrigir isso é muito simples, basta verificar se o formulário é visível ou como Benjamin Raibaud menciona Eliminação = false antes de chamar método os controles dica de ferramenta SetToolTip:
C #:
if (!this.Disposing) ttpHoverText.SetToolTip(targetControl, brokenText);
VB.Net:
If Me.Disposing = False Then ttpHoverText.SetToolTip(targetControl, brokenText)
IMO Isso é algo que deve ser tratado pelo .Net Framework ...
Eu corri para o mesmo problema. Parece que a exceção é lançada de dentro do método ToolTip.CreateHandle () e acontece na janela filho MDI somente sendo eliminados. Antes de chamar o método SetToolTip (...), certifique-se a propriedade Eliminar o formulário pai é falso. De qualquer forma, o formulário está sendo descartado, para que você realmente não se preocupam com as dicas mais ...