WinForms上的NullPointerException Application.Exit()

时间:2017-07-19 08:37:35

标签: .net vb.net winforms frameworks

首先;我知道NullPointerException是什么。我很清楚What is a NullPointerException, and how do I fix it?

在我的WinForms应用程序中,我在Application.Exit调用时使用以下Stacktrace获取NullReferenceException:

  

发生了System.NullReferenceException。 HResult = 0x80004003消息   =对象引用未设置为对象的实例Source = Microsoft.VisualBasic StackMonitoring:at   Microsoft.VisualBasic.ApplicationServices.WindowsFormsApplicationBase.MainFormLoadingDone(对象   发件人,EventArgs e)在System.EventHandler.Invoke(对象发送者,   EventArgs e)在System.Windows.Forms.Form.OnLoad(EventArgs e)at at   System.Windows.Forms.Form.OnCreateControl()at   System.Windows.Forms.Control.CreateControl(Boolean fIgnoreVisible)
  在System.Windows.Forms.Control.CreateControl()at   System.Windows.Forms.Control.WmShowWindow(Message& m)at   System.Windows.Forms.Control.WndProc(Message& m)at   System.Windows.Forms.ScrollableControl.WndProc(Message& m)at   System.Windows.Forms.Form.WmShowWindow(Message& m)at   System.Windows.Forms.Form.WndProc(Message& m)at   System.Windows.Forms.Control.ControlNativeWindow.OnMessage(Message& m)   在System.Windows.Forms.Control.ControlNativeWindow.WndProc(Message&   m)在System.Windows.Forms.NativeWindow.DebuggableCallback(IntPtr)   hWnd,Int32 msg,IntPtr wparam,IntPtr lparam)

最初的消息是德语,因为我的VS17是德语,我稍后会明确地改为英语。我把几个德语部分翻译成英文。

此外,我的VS17向我展示了Screenshot of Visual Studio所在的位置

  

申请暂停   您的应用程序已暂停,但没有要显示的代码,因为所有线程都执行了外部代码(通常是系统代码或框架代码)。

经过一些研究后我发现,大多数情况下,Form Closing和Form Closed事件发生了错误。由于我自己没有创建任何结束活动,我认为我不会找到我的解决方案。

调用Environment.Exit(1)而不是Application.Exit()确实有效,但由于这个基本上只是杀死了我想不使用它的过程。

你们有什么想法在哪里寻找错误?

例外可能是由于以下原因:

Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    If Environment.GetCommandLineArgs.Contains("Confirmation") Then
       Dim a As New confirmationForm
       a.ShowDialog()
       Application.Exit()
    End If
End Sub

Application.Exit()事件进行a.Button1_Press()调用。这可能导致异常。我会在修好后立即更新。

解决方案可以在答案+评论中找到

1 个答案:

答案 0 :(得分:1)

如果您发现自己需要打开另一个表单而不是主要表单,我应该使用该应用程序Startup event。它在显示主表单之前被提升。

之后调用Environment.Exit()是无害的。只需确保所有 您的 代码已完成执行,以便在写入文件时不会因此而中断。

如果你真的不想打电话给Environment.Exit(),你也可以尝试Application.Exit(),但我不能确切地说如果你试图在{{1}中做到这一点会发生什么事件(即它是否仍会尝试显示主要表单)。

Startup

修改

事实证明,您可以通过在Private Sub MyApplication_Startup(ByVal sender As Object, ByVal e As Microsoft.VisualBasic.ApplicationServices.StartupEventArgs) Handles Me.Startup If Environment.GetCommandLineArgs.Contains("Confirmation") Then Dim a As New confirmationForm a.ShowDialog() Environment.Exit(0) '0 = Terminated with no error (success). End If End Sub 事件中设置e.Cancel = True来停止加载主表单,这样就可以更好地替代Startup

Environment.Exit()