首先;我知道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是德语,我稍后会明确地改为英语。我把几个德语部分翻译成英文。
申请暂停 您的应用程序已暂停,但没有要显示的代码,因为所有线程都执行了外部代码(通常是系统代码或框架代码)。
经过一些研究后我发现,大多数情况下,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()
调用。这可能导致异常。我会在修好后立即更新。
解决方案可以在答案+评论中找到
答案 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()