Ошибка «Стек вызовов содержит только внешний код»

#vb.net #visual-studio

Вопрос:

Кто-нибудь может мне здесь помочь? Все шло гладко, но внезапно отладка останавливается, и это приводит меня к этой -> >ошибке

Что еще хуже, я попытался снова выполнить весь дизайн и код в новом проекте, думая, что эта проблема возникает только в одном конкретном проекте. Потратил впустую около двух часов. Я помещаю здесь весь свой код на случай, если проблема кроется где-то в моем коде, это будет долго, но, пожалуйста, помогите мне. Возможно, я что-то пропустил.

 Imports System.Drawing.Text
Public Class Form1
Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load 
    Dim pfc As PrivateFontCollection = New PrivateFontCollection
    pfc.AddFontFile("digital-7 (italic).ttf")
    Label2.Font = New Font(pfc.Families(0), 30, FontStyle.Regular)
    Label2.ForeColor = Color.Black
    Dim pfc2 As PrivateFontCollection = New PrivateFontCollection
    pfc2.AddFontFile("digital-7.ttf")
    Label1.Font = New Font(pfc2.Families(0), 26, FontStyle.Regular)
    Label1.ForeColor = Color.Black
    BtnCase.Hide()
    BtnVer.Hide()
    BtnOff.Hide()
    BtnOn.Hide()
    BtnExp.Hide()
    BtnCube.Hide()
    BtnFact.Hide()
    BtnSqrt.Hide()
    Num7.Hide()
    Num8.Hide()
    Num9.Hide()
    BtnDel.Hide()
    BtnAC.Hide()
    Num4.Hide()
    Num5.Hide()
    Num6.Hide()
    BtnMult.Hide()
    BtnDiv.Hide()
    Num1.Hide()
    Num2.Hide()
    Num3.Hide()
    BtnAdd.Hide()
    BtnSub.Hide()
    Num0.Hide()
    BtnPi.Hide()
    BtnSqrd.Hide()
    BtnDot.Hide()
    BtnEql.Hide()
    BtnUp.Hide()
    BtnDown.Hide()
    BtnLeft.Hide()
    BtnRight.Hide()
End Sub

Private Sub Timer1_Tick(sender As Object, e As EventArgs) Handles Timer1.Tick
    Label2.Text = ""
    Timer1.Enabled = False
End Sub

Private Sub ButtonClickMethod(sender As Object, e As EventArgs) Handles BtnCase.Click, BtnVer.Click, BtnOff.Click, BtnOn.Click, BtnExp.Click, BtnCube.Click, BtnFact.Click, BtnSqrt.Click, Num7.Click, Num8.Click, Num9.Click, BtnDel.Click, BtnAC.Click, Num4.Click, Num5.Click, Num6.Click, BtnMult.Click, BtnDiv.Click, Num1.Click, Num2.Click, Num3.Click, BtnAdd.Click, BtnSub.Click, Num0.Click, BtnPi.Click, BtnSqrd.Click, BtnDot.Click, BtnEql.Click, BtnUp.Click, BtnDown.Click, BtnLeft.Click, BtnRight.Click
    Dim btn As Button = CType(sender, Button)

    If btn.Name = "BtnCase" Then
        Timer2.Enabled = True
        BtnCase.Hide()
        BtnVer.Hide()
        BtnOff.Hide()
        BtnOn.Hide()
        BtnExp.Hide()
        BtnCube.Hide()
        BtnFact.Hide()
        BtnSqrt.Hide()
        Num7.Hide()
        Num8.Hide()
        Num9.Hide()
        BtnDel.Hide()
        BtnAC.Hide()
        Num4.Hide()
        Num5.Hide()
        Num6.Hide()
        BtnMult.Hide()
        BtnDiv.Hide()
        Num1.Hide()
        Num2.Hide()
        Num3.Hide()
        BtnAdd.Hide()
        BtnSub.Hide()
        Num0.Hide()
        BtnPi.Hide()
        BtnSqrd.Hide()
        BtnDot.Hide()
        BtnEql.Hide()
        BtnUp.Hide()
        BtnDown.Hide()
        BtnLeft.Hide()
        BtnRight.Hide()
    End If

    If btn.Name = "BtnVer" Then
        Label1.Text = ""
        Label2.Text = "WE BARE BEARS"
    End If

    If btn.Name = "BtnOff" Then
        Label1.Text = ""
        Label2.Text = "CASEO"
        Timer1.Enabled = True
        BtnVer.Hide()
        BtnOff.Hide()
        BtnExp.Hide()
        BtnCube.Hide()
        BtnFact.Hide()
        BtnSqrt.Hide()
        Num7.Hide()
        Num8.Hide()
        Num9.Hide()
        BtnDel.Hide()
        BtnAC.Hide()
        Num4.Hide()
        Num5.Hide()
        Num6.Hide()
        BtnMult.Hide()
        BtnDiv.Hide()
        Num1.Hide()
        Num2.Hide()
        Num3.Hide()
        BtnAdd.Hide()
        BtnSub.Hide()
        Num0.Hide()
        BtnPi.Hide()
        BtnSqrd.Hide()
        BtnDot.Hide()
        BtnEql.Hide()
        BtnUp.Hide()
        BtnDown.Hide()
        BtnLeft.Hide()
        BtnRight.Hide()
    End If

    If btn.Name = "BtnOn" Then
        Label1.Text = ""
        Label2.Text = 0
        BtnVer.Show()
        BtnOff.Show()
        BtnExp.Show()
        BtnCube.Show()
        BtnFact.Show()
        BtnSqrt.Show()
        Num7.Show()
        Num8.Show()
        Num9.Show()
        BtnDel.Show()
        BtnAC.Show()
        Num4.Show()
        Num5.Show()
        Num6.Show()
        BtnMult.Show()
        BtnDiv.Show()
        Num1.Show()
        Num2.Show()
        Num3.Show()
        BtnAdd.Show()
        BtnSub.Show()
        Num0.Show()
        BtnPi.Show()
        BtnSqrd.Show()
        BtnDot.Show()
        BtnEql.Show()
        BtnUp.Show()
        BtnDown.Show()
        BtnLeft.Show()
        BtnRight.Show()
    End If

    If btn.Name = "BtnExp" Then
        Label1.Text = Label1.Text   "^"
    End If

    If btn.Name = "BtnCube" Then
        Label1.Text = Label1.Text   "^3"
    End If

    If btn.Name = "BtnFact" Then
        Label1.Text = Label1.Text   "!"
    End If

    If btn.Name = "BtnSqrt" Then
        Label1.Text = Label1.Text   "√"
    End If

    If btn.Name = "Num7" Then
        Label1.Text = Label1.Text   "7"
    End If

    If btn.Name = "Num8" Then
        Label1.Text = Label1.Text   "8"
    End If

    If btn.Name = "Num9" Then
        Label1.Text = Label1.Text   "9"
    End If

    If btn.Name = "BtnDel" Then
        ' Label1.Text = Label1.Text   "="
    End If

    If btn.Name = "BtnAC" Then
        ' Label1.Text = Label1.Text   "="
    End If

    If btn.Name = "Num4" Then
        Label1.Text = Label1.Text   "4"
    End If

    If btn.Name = "Num5" Then
        Label1.Text = Label1.Text   "5"
    End If

    If btn.Name = "Num6" Then
        Label1.Text = Label1.Text   "6"
    End If

    If btn.Name = "BtnMult" Then
        Label1.Text = Label1.Text   "×"
    End If

    If btn.Name = "BtnDiv" Then
        Label1.Text = Label1.Text   "÷"
    End If

    If btn.Name = "Num1" Then
        Label1.Text = Label1.Text   "1"
    End If

    If btn.Name = "Num2" Then
        Label1.Text = Label1.Text   "2"
    End If

    If btn.Name = "Num3" Then
        Label1.Text = Label1.Text   "3"
    End If

    If btn.Name = "BtnAdd" Then
        Label1.Text = Label1.Text   " "
    End If

    If btn.Name = "BtnSub" Then
        Label1.Text = Label1.Text   "-"
    End If

    If btn.Name = "Num0" Then
        Label1.Text = Label1.Text   "0"
    End If

    If btn.Name = "BtnPi" Then
        Label1.Text = Label1.Text   "π"
    End If

    If btn.Name = "BtnSqrd" Then
        Label1.Text = Label1.Text   "^2"
    End If

    If btn.Name = "BtnDot" Then
        Label1.Text = Label1.Text   "."
    End If

    If btn.Name = "BtnEql" Then
        Label1.Text = Label1.Text   "="
    End If

    If btn.Name = "BtnUp" Then

    End If

    If btn.Name = "BtnDown" Then

    End If

    If btn.Name = "BtnLeft" Then

    End If

    If btn.Name = "BtnRight" Then

    End If

End Sub

Private Const INCREMENT As Integer = 9
Private Sub Timer2_Tick(sender As Object, e As EventArgs) Handles Timer2.Tick
    If PictureBox1.Location.Y >= 1050 Then
        Timer2.Enabled = False
        BtnCase.Show()
        BtnOn.Show()
    Else
        PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y   INCREMENT)
    End If
End Sub

Private Sub PictureBox1_Click(sender As Object, e As EventArgs) Handles PictureBox1.Click
    Timer2.Enabled = True
End Sub

Private Sub Timer3_Tick(sender As Object, e As EventArgs) Handles Timer3.Tick
    If PictureBox1.Location.Y <= 0 Then
        Timer3.Enabled = False
    Else
        PictureBox1.Location = New Point(PictureBox1.Location.X, PictureBox1.Location.Y - INCREMENT)
    End If
End Sub
End Class
 

Комментарии:

1. Вам нужно пройти через код и найти точное местоположение исключения. Вы также можете ввести Try...Catch каждый из ваших методов и остановиться внутри улова

2. Я новичок в vb.net и программирование в целом, так что я не совсем уверен, как я могу это сделать.

3. Обучение отладке-довольно ключевой навык, которым вам необходимо овладеть, независимо от того, являетесь ли вы новичком в vb.net или любой другой язык разработки. Несколько вещей, которые можно попробовать в дополнение к другим комментариям, — это просто прокомментировать некоторые из них и посмотреть, работает ли ваша программа. Например, рассмотрим всю обработку шрифтов в начале вашего метода Form_load. закомментируйте их, и если программа запускается, добавляйте их по одному за раз, пока не вернется ошибка. И было бы действительно хорошей идеей почитать о Try/Catch. Обработка исключений — еще один ключевой навык, которым должен владеть каждый разработчик

Ответ №1:

Старайтесь не дублировать код. Два из этих длинных списков Control.Hide() идентичны, третий отличается только 2 элементами управления ( BtnCase и BtnOn ). Я извлек все это в один вызванный метод HideControls .

Сокращенно это Label1.Text = Label1.Text amp; "=" Label1.Text amp;= "=".

Select Case легче читать и писать, чем все эти If утверждения.

Фактическое решение вашей ошибки находится в Font конструкторе. Второй параметр ожидает a Single . Когда вы вводите литералы 30 и 26 для этого параметра, компилятор распознает это как Int32 ( Integer ). Ах! Несоответствие типа (Исключение аргумента), о котором упоминается в сообщении об ошибке. Вы можете исправить это, добавив F сразу после номера. Он будет переформатирован в 30.0 и 26.0 , и компилятор распознает число как а Single .

Числа есть числа и Strings есть Text . Вы пытались присвоить 0 Text свойство. Это не будет компилироваться с параметром Strict, который всегда должен быть.

 Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load
    Dim pfc As PrivateFontCollection = New PrivateFontCollection
    pfc.AddFontFile("digital-7 (italic).ttf")
    Label2.Font = New Font(pfc.Families(0), 30.0F, FontStyle.Regular)
    Label2.ForeColor = Color.Black
    Dim pfc2 As PrivateFontCollection = New PrivateFontCollection
    pfc2.AddFontFile("digital-7.ttf")
    Label1.Font = New Font(pfc2.Families(0), 26.0F, FontStyle.Regular)
    Label1.ForeColor = Color.Black
    BtnCase.Hide()
    BtnOn.Hide()
    HideControls()
End Sub

Private Sub ButtonClickMethod(sender As Object, e As EventArgs) Handles BtnCase.Click, BtnVer.Click, BtnOff.Click, BtnOn.Click, BtnExp.Click, BtnCube.Click, BtnFact.Click, BtnSqrt.Click, Num7.Click, Num8.Click, Num9.Click, BtnDel.Click, BtnAC.Click, Num4.Click, Num5.Click, Num6.Click, BtnMult.Click, BtnDiv.Click, Num1.Click, Num2.Click, Num3.Click, BtnAdd.Click, BtnSub.Click, Num0.Click, BtnPi.Click, BtnSqrd.Click, BtnDot.Click, BtnEql.Click, BtnUp.Click, BtnDown.Click, BtnLeft.Click, BtnRight.Click
    Dim btn As Button = CType(sender, Button)
    Select Case btn.Name
        Case "BtnCase"
            Timer2.Enabled = True
            BtnCase.Hide()
            BtnOn.Hide()
            HideControls()
        Case "BtnVer"
            Label1.Text = ""
            Label2.Text = "WE BARE BEARS"
        Case "BtnOff"
            Label1.Text = ""
                Label2.Text = "CASEO"
                Timer1.Enabled = True
                HideControls()
        Case "BtnOn"
            Label1.Text = ""
                Label2.Text = 0
                BtnVer.Show()
                BtnOff.Show()
                BtnExp.Show()
                BtnCube.Show()
                BtnFact.Show()
                BtnSqrt.Show()
                Num7.Show()
                Num8.Show()
                Num9.Show()
                BtnDel.Show()
                BtnAC.Show()
                Num4.Show()
                Num5.Show()
                Num6.Show()
                BtnMult.Show()
                BtnDiv.Show()
                Num1.Show()
                Num2.Show()
                Num3.Show()
                BtnAdd.Show()
                BtnSub.Show()
                Num0.Show()
                BtnPi.Show()
                BtnSqrd.Show()
                BtnDot.Show()
                BtnEql.Show()
                BtnUp.Show()
                BtnDown.Show()
                BtnLeft.Show()
                BtnRight.Show()
        Case "BtnExp"
            Label1.Text amp;= "^"
        Case "BtnCube"
            Label1.Text amp;= "^3"
        Case "BtnFact"
            Label1.Text amp;= "!"
        Case "BtnSqrt"
            Label1.Text amp;= "√"
        Case "Num7"
            Label1.Text amp;= "7"
        Case "Num8"
            Label1.Text amp;= "8"
        Case "Num9"
            Label1.Text amp;= "9"
        Case "Num4"
            Label1.Text amp;= "4"
        Case "Num5"
            Label1.Text amp;= "5"
        Case "Num6"
            Label1.Text amp;= "6"
        Case "BtnMult"
            Label1.Text amp;= "×"
        Case "BtnDiv"
            Label1.Text amp;= "÷"
        Case "Num1"
            Label1.Text amp;= "1"
        Case "Num2"
            Label1.Text amp;= "2"
        Case "Num3"
            Label1.Text amp;= "3"
        Case "BtnAdd"
            Label1.Text amp;= " "
        Case "BtnSub"
            Label1.Text amp;= "-"
        Case "Num0"
            Label1.Text amp;= "0"
        Case "BtnPi"
            Label1.Text amp;= "π"
        Case "BtnSqrd"
            Label1.Text amp;= "^2"
        Case "BtnDot"
            Label1.Text amp;= "."
        Case "BtnEql"
            Label1.Text amp;= "="
    End Select
End Sub

Private Sub HideControls()
    BtnVer.Hide()
    BtnOff.Hide()
    BtnExp.Hide()
    BtnCube.Hide()
    BtnFact.Hide()
    BtnSqrt.Hide()
    Num7.Hide()
    Num8.Hide()
    Num9.Hide()
    BtnDel.Hide()
    BtnAC.Hide()
    Num4.Hide()
    Num5.Hide()
    Num6.Hide()
    BtnMult.Hide()
    BtnDiv.Hide()
    Num1.Hide()
    Num2.Hide()
    Num3.Hide()
    BtnAdd.Hide()
    BtnSub.Hide()
    Num0.Hide()
    BtnPi.Hide()
    BtnSqrd.Hide()
    BtnDot.Hide()
    BtnEql.Hide()
    BtnUp.Hide()
    BtnDown.Hide()
    BtnLeft.Hide()
    BtnRight.Hide()
End Sub
 

Вы могли бы сэкономить много кода, если бы установили Tag свойство во время разработки каждой кнопки, обрабатываемой, в соответствующую строку. Установите кнопки со "" String.Empty значением «кому». Нам это нужно .ToString , потому Tag что собственность является Object .

Этот ShowControls метод не экономит ввод текста, но делает код нажатия кнопки намного чище.

 Private Sub ButtonClickMethod(sender As Object, e As EventArgs) Handles BtnCase.Click, BtnVer.Click, BtnOff.Click, BtnOn.Click, BtnExp.Click, BtnCube.Click, BtnFact.Click, BtnSqrt.Click, Num7.Click, Num8.Click, Num9.Click, BtnDel.Click, BtnAC.Click, Num4.Click, Num5.Click, Num6.Click, BtnMult.Click, BtnDiv.Click, Num1.Click, Num2.Click, Num3.Click, BtnAdd.Click, BtnSub.Click, Num0.Click, BtnPi.Click, BtnSqrd.Click, BtnDot.Click, BtnEql.Click, BtnUp.Click, BtnDown.Click, BtnLeft.Click, BtnRight.Click
    Dim btn As Button = CType(sender, Button)
    Label1.Text = btn.Tag.ToString
    Select Case btn.Name
        Case "BtnCase"
            Timer2.Enabled = True
            BtnCase.Hide()
            BtnOn.Hide()
            HideControls()
        Case "BtnVer"
            Label2.Text = "WE BARE BEARS"
        Case "BtnOff"
            Label2.Text = "CASEO"
            Timer1.Enabled = True
            HideControls()
        Case "BtnOn"
            Label2.Text = "0"
            ShowControls()
    End Select
End Sub

Private Sub ShowControls()
    BtnVer.Show()
    BtnOff.Show()
    BtnExp.Show()
    BtnCube.Show()
    BtnFact.Show()
    BtnSqrt.Show()
    Num7.Show()
    Num8.Show()
    Num9.Show()
    BtnDel.Show()
    BtnAC.Show()
    Num4.Show()
    Num5.Show()
    Num6.Show()
    BtnMult.Show()
    BtnDiv.Show()
    Num1.Show()
    Num2.Show()
    Num3.Show()
    BtnAdd.Show()
    BtnSub.Show()
    Num0.Show()
    BtnPi.Show()
    BtnSqrd.Show()
    BtnDot.Show()
    BtnEql.Show()
    BtnUp.Show()
    BtnDown.Show()
    BtnLeft.Show()
    BtnRight.Show()
End Sub
 

Комментарии:

1. Я только что видел это, большое вам спасибо! Я пытался найти способ сократить свой код, вы мне очень помогли. Спасибо тебе, правда!