【问题标题】:Vb.net ExceptionVB.net 异常
【发布时间】:2011-05-02 00:30:13
【问题描述】:

我刚刚将我的 c# 代码转换为 vb.net。它给出了例外。

c#代码:

private static short[] muLawToPcmMap;

decoded[2 * i + 1] = (byte)(muLawToPcmMap[data[i]] >> 8);

vb 代码:

decoded(2 * i + 1) = CByte(muLawToPcmMap(data(i)) >> 8)

例外:

Arithmetic operation resulted in an overflow.

我遇到了很多麻烦。请帮忙。

【问题讨论】:

  • 你能告诉我们两种语言的“解码”变量的声明吗?
  • vb.net 或以前的 VB 版本,其中数组是基于 1 而不是基于 0?
  • byte[] 解码 = new byte[size*2];
  • @xcud:不,VB.NET 也是基于 0 的。

标签: c# vb.net exception


【解决方案1】:

您的代码导致您正在使用的数据类型溢出。

VB.NET 的默认行为是检查算术运算,而在 C# 中则不检查算术运算。

在您的 C# 代码周围添加 checked 语句以查看它是否也会失败。

checked {
   // do all your work here, any overflow will cause an exception
}

修复您的代码以停止溢出。正如下面我的 cmets 所提到的,算术溢出并不是必须忽略的。您在此处执行的操作可能会导致意外结果,您应该为此明确编码(通过增加类型的大小或处理故障)。

您应该 (IMO) 做的最后一件事是在您的项目属性、编译选项卡、高级编译器设置按钮下,选中标有“删除整数溢出检查”的复选框。我个人认为这是一个坏主意,并且我个人在 C# 中使用checked,每当我做的事情会溢出我的变量。尽早失败,经常失败等等。

【讨论】:

  • 是的。 /修复它以停止溢出/。我提到了 checked 关键字,因为您表明它们的行为不同。
  • 您的解决方案是停止随意移位并确保您的代码正常运行。如果位移的结果会溢出您的变量,请处理这种情况。或者让你的变量类型更大。问题是,当它溢出时你想要发生什么?溢出是那些静默失败程序之一,它不会像它应该的场景那样响应。所以你在代码中处理那个场景。
  • 如果您希望溢出导致值为零,请捕获异常并将值设置为零。如果您希望它像默认 C# 那样翻转(可能是个坏主意),请使用更大的变量类型,对其进行位移,如果结果值大于所需的数据类型,请找出您想要的值。
  • 仅供参考 - 用一种懒惰而不实际修复代码的方式更新了我的答案。不过我不建议这样做。
  • 就像我上面的回答所说:如果你希望它像 C# 那样运行,请删除整数溢出检查。默认情况下,它将使用与 C# 完全相同的 IL 来进行位移,因此它不会检查您的算术是否有溢出。
【解决方案2】:

检查你的翻译是否

byte[] decoded = new byte[size*2]; 

Dim decoded As Byte() = New Byte(size * 2 - 1) {}

或者不,就像在 vb.net 中一样,您使用最后一个元素的索引来声明数组,而不是大小本身。

根据您翻译解码的方式,您必须检查其余代码以使其适应您选择的版本。

【讨论】:

  • 是的,转换器改变了它,就像你提到的那样。但在每种情况下,它都会给出例外。
【解决方案3】:

我注意到您的 C# 代码不包含转换为 short,但您的 VB.NET 代码包含。 可能,演员阵容导致位转换为导致溢出的位。 (没有看到数据就无法真正判断。)删除它。

【讨论】:

  • 实际上,当我用转换器转换它时,铸件不存在。那时它也给出了同样的例外。
  • 请回复。我遇到了很多麻烦。
  • 您能否提供您尝试转换的数据样本?
  • 是的,当然:public static void MuLawDecode(byte[] data, out byte[] decoded) { int size = data.Length;解码 = 新字节 [大小 * 2]; for (int i = 0; i > 8); } }
  • 嗨,有没有可能将 8 作为整数??
【解决方案4】:

您尝试转换的数字很可能超出ByteShort 的范围

参考: link text

【讨论】:

  • 请尝试理解我知道 c# 但不知道 vb.net。我什至没有想到转换会导致问题。
  • 请给我一个解决方案,这个代码在 vb 中的转换代码是什么 [decoded[2 * i + 1] = (byte)(muLawToPcmMap[data[i]] >> 8); ]
  • 转换可能会导致各种问题。如果我将 BigInteger 转换为 Int16,我可能会导致溢出。我猜它可能在CShort 方法上。让我写一些代码来看看实际发生了什么。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多