سؤال

ونحن بشكل متقطع على أخطاء عندما نحاول تحديث تلميح أداة، مثل هذا

ToolTip.SetToolTip(myLabel, customDataStructure)

والخطأ نحصل هو NullReferenceException: Object reference not set to an instance of an object

لا أحد يعرف سبب هذا؟

هل لTry/Catch بسيطة أن يأكل NullReferenceException خيارا مجديا؟ نحن لا نريد تطبيق لدينا كامل لتفجير عندما نحصل على ذلك.

هل كانت مفيدة؟

المحلول

وأود أن أعتقد أن كنت تتصل ToolTip.SetTooltip من معالج حدث وأن معالج أحيانا الحرائق قبل التسمية تم إنشاؤه. ربما يجب عليك حماية هذا مع الاختيار التسمية يجري null ومن ثم التأكد من أن الطرف الأداة initialised على الحدث Load التسمية.

وأنت بالتأكيد لا ينبغي أن مجرد تصفية الاستثناء لأن هذا يخفي المشكلة.

نصائح أخرى

وتجاهل استثناءات غير نادرا ما من أي وقت مضى فكرة جيدة. تم طرح الاستثناء لأن هناك شيئا خطأ في التطبيق الحالي. من خلال تجاهل استثناء تطبيق العائدات أساسا في حالة غير محددة والتي من المرجح أن نرى آثار غريبة أخرى ويرجع ذلك إلى مرجع مفقود.

وبما أن هذا هو متفرقة يمكن أن يكون مسألة حالة سباق، لذلك عليك أن تنظر بعناية في رمز لمعرفة ما إذا كان هناك أي الحالات التي يمكن أن تستخدم للإشارة قبل أن يتم تهيئة بشكل صحيح.

وفي محاولة لاختبار ما إذا كنت الإعداد الذي فار في أي حالة، وذلك باستخدام المصحح على سبيل المثال ...

هل بسيط حاول / اقبض أن يأكل NullReferenceException خيارا مجديا؟

وهذا لن يحل المشكلة، فإنه إخفائه. ومن الممارسات البرمجة السيئة.

والسبب الأكثر شيوعا لهذا هو عند إغلاق النوافذ ويحدث التحقق من صحة أن يضع تلميح الأدوات على عنصر تحكم غير مرئية.

وأنا لم تصحيحه في قانون صافي ولكن لديها فكرة جيدة حيث يتم طرح خطأ في رمز 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));
    }

والشرط لإصلاح هذا هو بسيط جدا، تحقق فقط إذا كان النموذج مرئيا أو كما يذكر بنيامين RAIBAUD التخلص = كاذبة قبل استدعاء أسلوب التحكم تلميح الأدوات SetToolTip:

وC #:

if (!this.Disposing) ttpHoverText.SetToolTip(targetControl, brokenText);

وVB.Net:

If Me.Disposing = False Then ttpHoverText.SetToolTip(targetControl, brokenText)
<اقتباس فقرة>   

وIMO هذا أمر يجب أن يتم التعامل معها من قبل .NET Framework ...

وركضت فقط في نفس المشكلة. يبدو يتم طرح استثناء من داخل طريقة ToolTip.CreateHandle () ويحدث ذلك في إطار فرعي MDI يتم التخلص منها فقط. قبل استدعاء الأسلوب SetToolTip (...)، تأكد من أن خاصية التخلص من النموذج الأصل خاطئة. على أي حال، يتم التخلص من شكل، لذلك كنت لا يهتمون كثيرا تلميحات بعد الآن ...

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top