1

このプログラムを Visual Basic .NET で作成してさまざまなデータ フィールドを整理し、アプリケーション設定でプロファイル スロットを使用してユーザーのデータを保存しています。しかし、SlotSelect.vbクラスでスタック オーバーフロー エラーが発生しました。なぜこれが起こるのかについての私のもっともらしい推測は、以下のソースコードで間違った種類の変数コンテナを使用しているということですが、私のジレンマは、具体的に何が間違っているのか分からないということです.

vshost がオーバーフローの原因であると言っているコードは、他のクラスのオブジェクトを参照するために MSDN や他の場所で調べたコードから作成されたものであり、他のバリアントを使用して、それが異なるかどうかを確認してみました. これまでのところ、何も機能しておらず、コンパイル中にエラーが停止することはなく、コード マークアップではなおさらです。ビルドが完了した後、デバッグでアプリケーションを起動したときにのみエラーがキャッチされます。

のソース コードは次のとおりですSlotSelect.vb。他の無関係なクラス (およびこのクラス) のほとんどは につながるためMainForm.vb、そのソースも含めます。vshost がエラーとして示した場所は、内で使用される変数_MainFormが定義されている行にあります。Flaglister.MainFormSlotSelect.vb

SlotSelect.vb

Public Class SlotSelect

    ' Class variables
    Private _MainForm As Flaglister.MainForm = New Flaglister.MainForm
    Private _SaveSlot As Flaglister.SaveSlot = New Flaglister.SaveSlot
    Private _Misc As Flaglister.Misc = New Flaglister.Misc
    Private _FlagsTextBox As System.Windows.Forms.TextBox = Flaglister.MainForm.FlagsTextBox
    Private _VarsTextBox As System.Windows.Forms.TextBox = Flaglister.MainForm.VarsTextBox
    Private _HackNameTextBox As System.Windows.Forms.TextBox = Flaglister.MainForm.HackNameTextBox
    Private _RomCodeTextBox As System.Windows.Forms.TextBox = Flaglister.MainForm.RomCodeTextBox
    Private _NotesTextBox As System.Windows.Forms.TextBox = Flaglister.MainForm.NotesTextBox
    Private _ExpandedCheckBox As System.Windows.Forms.CheckBox = Flaglister.MainForm.ExpandedCheckBox

    ' Slot selection main execution subs
    Friend Sub _0()
        Try
            ' Disable FlagsTextBox
            _FlagsTextBox.DeselectAll()
            _FlagsTextBox.ClearUndo()
            _FlagsTextBox.Clear()
            _FlagsTextBox.Enabled = False
            ' Disable VarsTextBox
            _VarsTextBox.DeselectAll()
            _VarsTextBox.ClearUndo()
            _VarsTextBox.Clear()
            _VarsTextBox.Enabled = False
            ' Disable HackNameTextBox
            _HackNameTextBox.DeselectAll()
            _HackNameTextBox.ClearUndo()
            _HackNameTextBox.Clear()
            _HackNameTextBox.Enabled = False
            ' Disable RomCodeTextBox
            _RomCodeTextBox.DeselectAll()
            _RomCodeTextBox.ClearUndo()
            _RomCodeTextBox.Clear()
            _RomCodeTextBox.Enabled = False
            ' Disable NotesTextBox
            _NotesTextBox.DeselectAll()
            _NotesTextBox.ClearUndo()
            _NotesTextBox.Clear()
            _NotesTextBox.Enabled = False
        Catch
            Call _Misc.ErrorClose()
        End Try
    End Sub
    Friend Sub _1()
        Try
            ' Load flaglist
            _FlagsTextBox.DeselectAll()
            _FlagsTextBox.ClearUndo()
            _FlagsTextBox.Clear()
            _FlagsTextBox.Enabled = True
            _FlagsTextBox.Text = My.Settings.Flaglist_1
            ' Load varlist
            _VarsTextBox.DeselectAll()
            _VarsTextBox.ClearUndo()
            _VarsTextBox.Clear()
            _VarsTextBox.Enabled = True
            _VarsTextBox.Text = My.Settings.Varlist_1
            ' Load project name
            _HackNameTextBox.DeselectAll()
            _HackNameTextBox.ClearUndo()
            _HackNameTextBox.Clear()
            _HackNameTextBox.Enabled = True
            _HackNameTextBox.Text = My.Settings.Hackname_1
            ' Load ROM codename
            _RomCodeTextBox.DeselectAll()
            _RomCodeTextBox.ClearUndo()
            _RomCodeTextBox.Clear()
            _RomCodeTextBox.Enabled = True
            _RomCodeTextBox.Text = My.Settings.Romcode_1
            ' Load other notes
            _NotesTextBox.DeselectAll()
            _NotesTextBox.ClearUndo()
            _NotesTextBox.Clear()
            _NotesTextBox.Enabled = True
            _NotesTextBox.Text = My.Settings.Notes_1
        Catch
            Call _Misc.ErrorClose()
        End Try
    End Sub
    Friend Sub _2()
        Try
            ' Load flaglist
            _FlagsTextBox.DeselectAll()
            _FlagsTextBox.ClearUndo()
            _FlagsTextBox.Clear()
            _FlagsTextBox.Enabled = True
            _FlagsTextBox.Text = My.Settings.Flaglist_2
            ' Load varlist
            _VarsTextBox.DeselectAll()
            _VarsTextBox.ClearUndo()
            _VarsTextBox.Clear()
            _VarsTextBox.Enabled = True
            _VarsTextBox.Text = My.Settings.Varlist_2
            ' Load project name
            _HackNameTextBox.DeselectAll()
            _HackNameTextBox.ClearUndo()
            _HackNameTextBox.Clear()
            _HackNameTextBox.Enabled = True
            _HackNameTextBox.Text = My.Settings.Hackname_2
            ' Load ROM codename
            _RomCodeTextBox.DeselectAll()
            _RomCodeTextBox.ClearUndo()
            _RomCodeTextBox.Clear()
            _RomCodeTextBox.Enabled = True
            _RomCodeTextBox.Text = My.Settings.Romcode_2
            ' Load other notes
            _NotesTextBox.DeselectAll()
            _NotesTextBox.ClearUndo()
            _NotesTextBox.Clear()
            _NotesTextBox.Enabled = True
            _NotesTextBox.Text = My.Settings.Notes_2
        Catch
            Call _Misc.ErrorClose()
        End Try
    End Sub
    Friend Sub _3()
        Try
            ' Load flaglist
            _FlagsTextBox.DeselectAll()
            _FlagsTextBox.ClearUndo()
            _FlagsTextBox.Clear()
            _FlagsTextBox.Enabled = True
            _FlagsTextBox.Text = My.Settings.Flaglist_3
            ' Load varlist
            _VarsTextBox.DeselectAll()
            _VarsTextBox.ClearUndo()
            _VarsTextBox.Clear()
            _VarsTextBox.Enabled = True
            _VarsTextBox.Text = My.Settings.Varlist_3
            ' Load project name
            _HackNameTextBox.DeselectAll()
            _HackNameTextBox.ClearUndo()
            _HackNameTextBox.Clear()
            _HackNameTextBox.Enabled = True
            _HackNameTextBox.Text = My.Settings.Hackname_3
            ' Load ROM codename
            _RomCodeTextBox.DeselectAll()
            _RomCodeTextBox.ClearUndo()
            _RomCodeTextBox.Clear()
            _RomCodeTextBox.Enabled = True
            _RomCodeTextBox.Text = My.Settings.Romcode_3
            ' Load other notes
            _NotesTextBox.DeselectAll()
            _NotesTextBox.ClearUndo()
            _NotesTextBox.Clear()
            _NotesTextBox.Enabled = True
            _NotesTextBox.Text = My.Settings.Notes_3
        Catch
            Call _Misc.ErrorClose()
        End Try
    End Sub


    ' Save all slots
    Friend Sub SlotSaveAll()
        Call _SaveSlot.FlaglistSave()
        Call _SaveSlot.VarlistSave()
        Call _SaveSlot.HacknameSave()
        Call _SaveSlot.RomcodeSave()
        Call _SaveSlot.NotesSave()
        Call _SaveSlot.ExpandedSave()
    End Sub
End Class

MainForm.vb

Public Class MainForm

    ' Class-level variables
    Private _SlotSelect As New Flaglister.SlotSelect
    Private _SaveSlot As New Flaglister.SaveSlot
    Private _Misc As New Flaglister.Misc

    ' Startup/Shutdown events
    Sub MainForm_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        If Slot0RadioButton.Checked = True Then
            Call _SlotSelect._0()
        End If
    End Sub
    Sub MainForm_Deactivate(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Deactivate
        My.Settings.Save()
        Me.Close()
    End Sub

    ' Form object events
    Private Sub Slot0RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Slot0RadioButton.CheckedChanged
        If Slot0RadioButton.Checked = True Then
            Call _SlotSelect._0()
        End If
    End Sub
    Private Sub Slot1RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Slot1RadioButton.CheckedChanged
        If Slot1RadioButton.Checked = True Then
            Call _SlotSelect._1()
        End If
    End Sub
    Private Sub Slot2RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Slot2RadioButton.CheckedChanged
        If Slot2RadioButton.Checked = True Then
            Call _SlotSelect._2()
        End If
    End Sub
    Private Sub Slot3RadioButton_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Slot3RadioButton.CheckedChanged
        If Slot3RadioButton.Checked = True Then
            Call _SlotSelect._3()
        End If
    End Sub
    Private Sub FlagsTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles FlagsTextBox.TextChanged
        Call _SaveSlot.FlaglistSave()
    End Sub
    Private Sub VarsTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles VarsTextBox.TextChanged
        Call _SaveSlot.VarlistSave()
    End Sub
    Private Sub HackNameTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles HackNameTextBox.TextChanged
        Call _SaveSlot.HacknameSave()
    End Sub
    Private Sub RomCodeTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles RomCodeTextBox.TextChanged
        Call _SaveSlot.RomcodeSave()
    End Sub
    Private Sub NotesTextBox_TextChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles NotesTextBox.TextChanged
        Call _SaveSlot.NotesSave()
    End Sub
    Private Sub ExpandedCheckBox_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles ExpandedCheckBox.CheckedChanged
        Call _SaveSlot.ExpandedSave()
    End Sub
End Class

コードの問題は何ですか?

ここに、私と私のプログラムに関する追加の詳細があります。

コンピューター

システム: AMD Sempron を搭載した 7 つの x64
コンパイラ: Microsoft Visual Basic 2010 Express

応用

フレームワーク: Microsoft .NET バージョン 3.5
ルート ネームスペース: Flaglister
アセンブリ名: Flaglister
アプリケーションの種類: Windows フォーム アプリケーション

時々私は考えすぎてしまうので、答えが多くの人にとって明白で、私には見えない場合は申し訳ありません.

編集

エラーがスローされたときのコールスタックの現在の位置のスクリーンショットと、ポップアップ エラー ボックスの別のスクリーンショットを次に示します。これらを追加するとは思いもしませんでした。

コール スタックのスクリーンショット

例外のスクリーンショット

4

3 に答える 3

2

これは、クラスでMainFormの新しいインスタンスを宣言してインスタンス化しているためだと思います。

 Private _MainForm As Flaglister.MainForm = New Flaglister.MainForm

次に、MainFormクラスで、SlotSelectクラスの新しいインスタンスを宣言してインスタンス化します。

 Private _SlotSelect As New Flaglister.SlotSelect

したがって、2つのクラスは単に「バウンス」して相互に新しいインスタンスを作成し、最終的にスタックオーバーフローを引き起こします。

于 2012-06-07T02:48:33.727 に答える
0

あなたは無限ループにいます。

slotselectには

Private _MainForm As Flaglister.MainForm = New Flaglister.MainForm

これにより、新しいメインフォームが作成され、MainFormに次のようになります。

Private _SlotSelect As New Flaglister.SlotSelect

これにより、新しいslotselectが作成されます。

1つのオブジェクトを親にし、もう1つを子にして、コンストラクターで親参照を渡します。

Class SlotSelect
  Private _MainForm As MainForm
  Sub New(mf as MainForm)
    _MainForm=mf
  End Sub
...
End Class        
于 2012-06-07T02:49:59.323 に答える