为什么不在数字类型中尝试/捕获工作?

时间:2013-10-10 19:45:54

标签: vb.net try-catch

Dim mynumber as Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)

Console.WriteLine("Enter your number..") 'Ask to enter number
    Try
        mynumber = Console.ReadLine 'Read user input and store it
    Catch
        Console.WriteLine()
        Console.ForegroundColor = ConsoleColor.Red
        Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
        Console.ResetColor()
        Console.ReadLine()
        Console.Clear()
        GoTo start
    End Try

好的伙计们,正如您从上面的示例中看到的,我已经设置了一个用于错误处理的Try / Catch。我遇到了一个问题。是的Try / Catch代码阻止输入字母(字符串),但是当我输入十进制数字时,它仍然接受它。为什么?如何防止这种情况?不接受十进制数,因为整数只接受整数!

感谢。

3 个答案:

答案 0 :(得分:2)

数字类型之间存在隐式转换,因此不会触发错误。有不同的方法可以知道确切的数字类型。我想这里最好的选择是以下代码:

Dim mynumber0 As Double 'This is the variable as an integer, (Integers only allow WHOLE numbers)
Dim wasOK As Boolean = True
Console.WriteLine("Enter your number..") 'Ask to enter number
Try
    mynumber0 = Console.ReadLine 'Read user input and store it
    If (Convert.ToInt32(mynumber0) <> mynumber0) Then
        wasOK = False
    End If
Catch
    wasOK = False
End Try

Dim mynumber As Integer = mynumber0
If (Not wasOK) Then
    Console.WriteLine()
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
    Console.ResetColor()
    Console.ReadLine()
    Console.Clear()
    GoTo start
End If

更新

TryParse替代,正如mafafu

所建议的那样
Dim mynumber As Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)
Console.WriteLine("Enter your number..") 'Ask to enter number
If (Not Integer.TryParse(Console.ReadLine, mynumber)) Then
    Console.WriteLine()
    Console.ForegroundColor = ConsoleColor.Red
    Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
    Console.ResetColor()
    Console.ReadLine()
    Console.Clear()
    GoTo start
End If

答案 1 :(得分:2)

如前所述,您可以使用Integer.TryParse来检查是否可以将数字解析为整数。此外,您确实应该使用 Option Strict On ,这将有助于Visual Studio指出VB.NET代码中的问题。

我接受了答案:

Option Strict On

Module Module1

    Sub Main()

        Dim myNumber As Integer 'This is the variable as an integer, (Integers only allow WHOLE numbers)
        Dim userInput As String
        Dim userInputValid As Boolean = False

        While Not userInputValid
            Console.Write("Enter your number.. ") 'Ask to enter number

            userInput = Console.ReadLine() 'Read user input and store it
            userInputValid = Integer.TryParse(userInput, myNumber)
            If Not userInputValid Then
                Console.ForegroundColor = ConsoleColor.Red
                Console.WriteLine("Only whole numbers allowed! Press enter to start again!")
                Console.ResetColor()
                Console.ReadLine()
                Console.Clear()
            End If

        End While

        Console.WriteLine("I got the number " & myNumber.ToString())
        Console.ReadLine()

    End Sub

End Module

修改:请参阅Option Strict Statement上的“为新项目设置选项严格默认设置”部分。

答案 2 :(得分:1)

使用Option Strict Off,VB.NET尝试表现得像旧的VB版本,它在类型检查方面有相当松散的规则。字符串,浮点类型和整数类型可以在很大程度上互换使用,并且尝试将浮点值分配给整数类型会以某种方式对其进行舍入(我忘记了确切的细节)。虽然有一些非常罕见的情况,Option Strict Off可以用于除了给旧的VB6代码提供工作机会以外的其他目的,但只有那些足够专业才能理解这些案例的复杂性的人甚至应该考虑使用它任何新的代码(甚至只有那些可能有用的非常小的代码)。

顺便说一下,重要的是要注意,即使VB.NET将浮点值转换为整数类型,如果将浮点值舍入为最接近的整数,也会产生一个值即使浮点值具有在转换期间掉落的非零小数部分,也可以在该类型中表示。我不喜欢那个设计(我想如果有人希望Int32离一个给定的浮点值最近,那么应该使用一个函数来表示那个)但是它就是这样的。