ArgumentOutOfRangeException Classe
Definição
A exceção que é gerada quando o valor de um argumento está fora do intervalo permitido de valores conforme definido pelo método invocado.The exception that is thrown when the value of an argument is outside the allowable range of values as defined by the invoked method.
public ref class ArgumentOutOfRangeException : ArgumentException
public class ArgumentOutOfRangeException : ArgumentException
[System.Serializable]
public class ArgumentOutOfRangeException : ArgumentException
[System.Serializable]
[System.Runtime.InteropServices.ComVisible(true)]
public class ArgumentOutOfRangeException : ArgumentException
type ArgumentOutOfRangeException = class
inherit ArgumentException
type ArgumentOutOfRangeException = class
inherit ArgumentException
interface ISerializable
[<System.Serializable>]
type ArgumentOutOfRangeException = class
inherit ArgumentException
interface ISerializable
[<System.Serializable>]
[<System.Runtime.InteropServices.ComVisible(true)>]
type ArgumentOutOfRangeException = class
inherit ArgumentException
interface ISerializable
Public Class ArgumentOutOfRangeException
Inherits ArgumentException
- Herança
- Herança
- Atributos
- Implementações
Exemplos
O exemplo a seguir define uma classe para conter informações sobre um convidado convidado.The following example defines a class to contain information about an invited guest. Se o convidado tiver menos de 21 anos, uma exceção ArgumentOutOfRangeException será lançada.If the guest is younger than 21, an ArgumentOutOfRangeException exception is thrown.
using System;
class Program
{
static void Main(string[] args)
{
try
{
Guest guest1 = new Guest("Ben", "Miller", 17);
Console.WriteLine(guest1.GuestInfo());
}
catch (ArgumentOutOfRangeException outOfRange)
{
Console.WriteLine("Error: {0}", outOfRange.Message);
}
}
}
class Guest
{
private string FirstName;
private string LastName;
private int Age;
public Guest(string fName, string lName, int age)
{
FirstName = fName;
LastName = lName;
if (age < 21)
throw new ArgumentOutOfRangeException("age","All guests must be 21-years-old or older.");
else
Age = age;
}
public string GuestInfo()
{
string gInfo = FirstName + " " + LastName + ", " + Age.ToString();
return(gInfo);
}
}
Module Module1
Public Sub Main()
Try
Dim guest1 As Guest = New Guest("Ben", "Miller", 17)
Console.WriteLine(guest1.GuestInfo)
Catch outOfRange As ArgumentOutOfRangeException
Console.WriteLine("Error: {0}", outOfRange.Message)
End Try
End Sub
End Module
Class Guest
Private FirstName As String
Private LastName As String
Private Age As Integer
Public Sub New(ByVal fName As String, ByVal lName As String, ByVal age As Integer)
MyBase.New()
FirstName = fName
LastName = lName
If (age < 21) Then
Throw New ArgumentOutOfRangeException("age", "All guests must be 21-years-old or older.")
Else
age = age
End If
End Sub
Public Function GuestInfo() As String
Dim gInfo As String = (FirstName + (" " _
+ (Me.LastName + (", " + Me.Age.ToString))))
Return gInfo
End Function
End Class
Comentários
Uma ArgumentOutOfRangeException exceção é lançada quando um método é invocado e pelo menos um dos argumentos passados para o método não é null
e contém um valor inválido que não é um membro do conjunto de valores esperado para o argumento.An ArgumentOutOfRangeException exception is thrown when a method is invoked and at least one of the arguments passed to the method is not null
and contains an invalid value that is not a member of the set of values expected for the argument. A ParamName propriedade identifica o argumento inválido e a ActualValue propriedade, se um valor estiver presente, identificará o valor inválido.The ParamName property identifies the invalid argument, and the ActualValue property, if a value is present, identifies the invalid value.
Normalmente, um ArgumentOutOfRangeException resultado do erro do desenvolvedor.Typically, an ArgumentOutOfRangeException results from developer error. Em vez de manipular a exceção em um try
/ catch
bloco, você deve eliminar a causa da exceção ou, se o argumento for retornado por uma chamada de método ou entrada pelo usuário antes de ser passado para o método que gera a exceção, você deverá validar os argumentos antes de passá-los para o método.Instead of handling the exception in a try
/catch
block, you should eliminate the cause of the exception or, if the argument is returned by a method call or input by the user before being passed to the method that throws the exception, you should validate arguments before passing them to the method.
ArgumentOutOfRangeException é usado extensivamente por:ArgumentOutOfRangeException is used extensively by:
Classes nos System.Collections System.IO namespaces e.Classes in the System.Collections and System.IO namespaces.
Métodos de manipulação de cadeia de caracteres na String classe.String manipulation methods in the String class.
As condições em que uma ArgumentOutOfRangeException exceção é gerada incluem o seguinte:The conditions in which an ArgumentOutOfRangeException exception is thrown include the following:
Você está recuperando o membro de uma coleção por seu número de índice e o número de índice é inválido.You are retrieving the member of a collection by its index number, and the index number is invalid.
Essa é a causa mais comum de uma ArgumentOutOfRangeException exceção.This is the most common cause of an ArgumentOutOfRangeException exception. Normalmente, o número de índice é inválido por um dos quatro motivos:Typically, the index number is invalid for one of four reasons:
A coleção não tem membros e seu código pressupõe que ele faz isso.The collection has no members, and your code assumes that it does. O exemplo a seguir tenta recuperar o primeiro elemento de uma coleção que não tem elementos:The following example attempts to retrieve the first element of a collection that has no elements:
using System; using System.Collections.Generic; public class Example { public static void Main() { var list = new List<String>(); Console.WriteLine("Number of items: {0}", list.Count); try { Console.WriteLine("The first item: '{0}'", list[0]); } catch (ArgumentOutOfRangeException e) { Console.WriteLine(e.Message); } } } // The example displays the following output: // Number of items: 0 // Index was out of range. Must be non-negative and less than the size of the collection. // Parameter name: index
Imports System.Collections.Generic Module Example Public Sub Main() Dim list As New List(Of String) Console.WriteLine("Number of items: {0}", list.Count) Try Console.WriteLine("The first item: '{0}'", list(0)) Catch e As ArgumentOutOfRangeException Console.WriteLine(e.Message) End Try End Sub End Module ' The example displays the following output: ' Number of items: 0 ' Index was out of range. Must be non-negative and less than the size of the collection. ' Parameter name: index
Para evitar a exceção, verifique se a propriedade da coleção
Count
é maior que zero antes de tentar recuperar qualquer membro, como faz o fragmento de código a seguir.To prevent the exception, check whether the collection'sCount
property is greater than zero before attempting to retrieve any members, as the following code fragment does.if (list.Count > 0) Console.WriteLine("The first item: '{0}'", list[0]);
If list.Count > 0 Then Console.WriteLine("The first item: '{0}'", list(0)) End If
Em alguns casos, a exceção pode ocorrer porque você está tentando adicionar um membro a uma coleção usando um índice que não existe, em vez de chamar o método, como
Add
, que existe para essa finalidade.In some cases, the exception may occur because you are attempting to add a member to a collection by using an index that does not exist, rather than by calling the method, such asAdd
, that exists for this purpose. O exemplo a seguir tenta adicionar um elemento a uma coleção usando um índice não existente em vez de chamar o List<T>.Add método.The following example attempts to add an element to a collection by using a non-existent index rather than calling the List<T>.Add method.using System; using System.Collections.Generic; public class Example { public static void Main() { var numbers = new List<int>(); numbers.AddRange( new int[] { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20 } ); var squares = new List<int>(); for (int ctr = 0; ctr < numbers.Count; ctr++) squares[ctr] = (int) Math.Pow(numbers[ctr], 2); } } // The example displays the following output: // Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. // Parameter name: index // at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) // at Example.Main()
Imports System.Collections.Generic Module Example Public Sub Main() Dim numbers As New List(Of Integer) numbers.AddRange( { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 20 } ) Dim squares As New List(Of Integer) For ctr As Integer = 0 To numbers.Count - 1 squares(ctr) = CInt(numbers(ctr) ^ 2) Next End Sub End Module ' The example displays the following output: ' Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. ' Parameter name: index ' at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) ' at Example.Main()
O fragmento de código a seguir corrige esse erro:The following code fragment corrects this error:
var squares = new List<int>(); for (int ctr = 0; ctr < numbers.Count; ctr++) squares.Add((int) Math.Pow(numbers[ctr], 2));
Dim squares As New List(Of Integer) For ctr As Integer = 0 To numbers.Count - 1 squares.Add(CInt(numbers(ctr) ^ 2)) Next
Você está tentando recuperar um item cujo índice é negativo.You're attempting to retrieve an item whose index is negative. Isso geralmente ocorre porque você pesquisou o índice de um elemento específico em uma coleção e presumiu erroneamente que a pesquisa foi bem-sucedida.This usually occurs because you've searched a collection for the index of a particular element and have erroneously assumed that the search is successful. No exemplo a seguir, a chamada para o método List<T>.FindIndex(Predicate<T>) falha ao localizar uma cadeia de caracteres igual a "Z" e, portanto, retorna -1.In the following example, the call to the List<T>.FindIndex(Predicate<T>) method fails to find a string equal to "Z" and so returns -1. No entanto, esse é um valor de índice inválido.However, this is an invalid index value.
using System; using System.Collections.Generic; public class Example { public static void Main() { var list = new List<String>(); list.AddRange( new String[] { "A", "B", "C" } ); // Get the index of the element whose value is "Z". int index = list.FindIndex((new StringSearcher("Z")).FindEquals); try { Console.WriteLine("Index {0} contains '{1}'", index, list[index]); } catch (ArgumentOutOfRangeException e) { Console.WriteLine(e.Message); } } } internal class StringSearcher { String value; public StringSearcher(String value) { this.value = value; } public bool FindEquals(String s) { return s.Equals(value, StringComparison.InvariantCulture); } } // The example displays the following output: // Index was out of range. Must be non-negative and less than the size of the collection. // Parameter name: index
Imports System.Collections.Generic Module Example Public Sub Main() Dim list As New List(Of String) list.AddRange( { "A", "B", "C" } ) ' Get the index of the element whose value is "Z". Dim index As Integer = list.FindIndex(AddressOf (New StringSearcher("Z")).FindEquals) Try Console.WriteLine("Index {0} contains '{1}'", index, list(index)) Catch e As ArgumentOutOfRangeException Console.WriteLine(e.Message) End Try End Sub End Module Friend Class StringSearcher Dim value As String Public Sub New(value As String) Me.value = value End Sub Public Function FindEquals(s As String) As Boolean Return s.Equals(value, StringComparison.InvariantCulture) End Function End Class ' The example displays the following output: ' Index was out of range. Must be non-negative and less than the size of the collection. ' Parameter name: index
Para evitar a exceção, verifique se a pesquisa foi bem-sucedida, certificando-se de que o índice retornado seja maior ou igual a zero antes de tentar recuperar o item da coleção, como faz o fragmento de código a seguir.To prevent the exception, check that the search is successful by making sure that the returned index is greater than or equal to zero before attempting to retrieve the item from the collection, as the following code fragment does.
// Get the index of the element whose value is "Z". int index = list.FindIndex((new StringSearcher("Z")).FindEquals); if (index >= 0) Console.WriteLine("'Z' is found at index {0}", list[index]);
' Get the index of the element whose value is "Z". Dim index As Integer = list.FindIndex(AddressOf (New StringSearcher("Z")).FindEquals) If index >= 0 Then Console.WriteLine("Index {0} contains '{1}'", index, list(index)) End If
Você está tentando recuperar um elemento cujo índice é igual ao valor da propriedade da coleção
Count
, como ilustra o exemplo a seguir.You're attempting to retrieve an element whose index is equal to the value of the collection'sCount
property, as the following example illustrates.using System; using System.Collections.Generic; public class Example { public static void Main() { var list = new List<String>(); list.AddRange( new String[] { "A", "B", "C" } ); try { // Display the elements in the list by index. for (int ctr = 0; ctr <= list.Count; ctr++) Console.WriteLine("Index {0}: {1}", ctr, list[ctr]); } catch (ArgumentOutOfRangeException e) { Console.WriteLine(e.Message); } } } // The example displays the following output: // Index 0: A // Index 1: B // Index 2: C // Index was out of range. Must be non-negative and less than the size of the collection. // Parameter name: index
Imports System.Collections.Generic Module Example Public Sub Main() Dim list As New List(Of String) list.AddRange( { "A", "B", "C" } ) Try ' Display the elements in the list by index. For ctr As Integer = 0 To list.Count Console.WriteLine("Index {0}: {1}", ctr, list(ctr)) Next Catch e As ArgumentOutOfRangeException Console.WriteLine(e.Message) End Try End Sub End Module ' The example displays the following output: ' Index 0: A ' Index 1: B ' Index 2: C ' Index was out of range. Must be non-negative and less than the size of the collection. ' Parameter name: index
Como as coleções no .NET usam a indexação baseada em zero, o primeiro elemento da coleção está no índice 0 e o último elemento está no índice
Count
-1.Because collections in .NET use zero-based indexing, the first element of the collection is at index 0, and the last element is at indexCount
- 1. Você pode eliminar o erro garantindo que você acesse o último elemento no índiceCount
-1, como faz o código a seguir.You can eliminate the error by ensuring that you access the last element at indexCount
- 1, as the following code does.// Display the elements in the list by index. for (int ctr = 0; ctr < list.Count; ctr++) Console.WriteLine("Index {0}: {1}", ctr, list[ctr]);
' Display the elements in the list by index. For ctr As Integer = 0 To list.Count - 1 Console.WriteLine("Index {0}: {1}", ctr, list(ctr)) Next
Você está tentando executar uma operação de cadeia de caracteres chamando um método de manipulação de cadeia de caracteres e o índice inicial não existe na cadeia de caracteres.You are attempting to perform a string operation by calling a string manipulation method, and the starting index does not exist in the string.
Sobrecargas de métodos como,,,,,, String.Compare String.CompareOrdinal String.IndexOf IndexOfAny String.Insert String.LastIndexOf String.LastIndexOfAny , Remove ou String.Substring que permitem que você especifique o índice inicial da operação exigem que o índice seja uma posição válida dentro da cadeia de caracteres.Overloads of methods such as such as String.Compare, String.CompareOrdinal, String.IndexOf, IndexOfAny, String.Insert, String.LastIndexOf, String.LastIndexOfAny, Remove, or String.Substring that allow you to specify the starting index of the operation require that the index be a valid position within the string. Índices válidos variam de 0 a String.Length -1.Valid indexes range from 0 to String.Length - 1.
Há quatro causas comuns dessa exceção ArgumentOutOfRangeException:There are four common causes of this ArgumentOutOfRangeException exception:
Você está trabalhando com uma cadeia de caracteres vazia, ou String.Empty.You are working with an empty string, or String.Empty. Como sua propriedade String.Length retorna 0, qualquer tentativa de manipulá-la pelo índice lança uma exceção ArgumentOutOfRangeException.Because its String.Length property returns 0, any attempt to manipulate it by index throws an ArgumentOutOfRangeException exception. O exemplo a seguir define um método
GetFirstCharacter
que retorna o primeiro caractere de uma cadeia de caracteres.The following example, defines aGetFirstCharacter
method that returns the first character of a string. Se a cadeia de caracteres estiver vazia, como a cadeia de caracteres final passada para o método está, o método gerará uma exceção ArgumentOutOfRangeException.If the string is empty, as the final string passed to the method is, the method throws an ArgumentOutOfRangeException exception.using System; public class Example { public static void Main() { String[] words = { "the", "today", "tomorrow", " ", "" }; foreach (var word in words) Console.WriteLine("First character of '{0}': '{1}'", word, GetFirstCharacter(word)); } private static char GetFirstCharacter(String s) { return s[0]; } } // The example displays the following output: // First character of //the//: //t// // First character of //today//: //t// // First character of //tomorrow//: //t// // First character of // //: // // // // Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array. // at Example.Main()
Module Example Public Sub Main() Dim words() As String = { "the", "today", "tomorrow", " ", "" } For Each word In words Console.WriteLine("First character of '{0}': '{1}'", word, GetFirstCharacter(word)) Next End Sub Private Function GetFirstCharacter(s As String) As Char Return s(0) End Function End Module ' The example displays the following output: ' First character of 'the': 't' ' First character of 'today': 't' ' First character of 'tomorrow': 't' ' First character of ' ': ' ' ' ' Unhandled Exception: System.IndexOutOfRangeException: Index was outside the bounds of the array. ' at Example.Main()
Você pode eliminar a exceção testando se a cadeia de caracteres String.Length é maior que zero ou chamando o método IsNullOrEmpty para garantir que a cadeia de caracteres não é
null
nem está vazia.You can eliminate the exception by testing whether the string's String.Length is greater than zero or by calling the IsNullOrEmpty method to ensure that the string is notnull
or empty. O fragmento de código a seguir faz o último.The following code fragment does the latter. Nesse caso, se a cadeia de caracteres énull
ou está vazia, o métodoGetFirstCharacter
retorna U+0000.In this case, if the string isnull
or empty, theGetFirstCharacter
method returns U+0000.static char GetFirstCharacter(String s) { if (String.IsNullOrEmpty(s)) return '\u0000'; else return s[0]; }
Function GetFirstCharacter(s As String) As Char If String.IsNullOrEmpty(s) Then Return ChrW(0) Else Return s(0) End If End Function
Você está manipulando uma cadeia de caracteres com base na posição de uma subcadeia dentro dessa cadeia de caracteres e não conseguiu determinar se a subcadeia de caracteres foi realmente encontrada.You're manipulating a string based on the position of a substring within that string, and you've failed to determine whether the substring was actually found.
O exemplo a seguir extrai a segunda palavra de uma frase de duas palavras.The following example extracts the second word of a two-word phrase. Ele lançará uma ArgumentOutOfRangeException exceção se a frase consistir em apenas uma palavra e, portanto, não contiver um caractere de espaço inserido.It throws an ArgumentOutOfRangeException exception if the phrase consists of only one word, and therefore does not contain an embedded space character. Isso ocorre porque a chamada para o String.IndexOf(String) método retorna-1 para indicar que a pesquisa falhou, e esse valor inválido é passado para o String.Substring(Int32) método.This occurs because the call to the String.IndexOf(String) method returns -1 to indicate that the search failed, and this invalid value is then passed to the String.Substring(Int32) method.
using System; public class Example { public static void Main() { String[] phrases = { "ocean blue", "concerned citizen", "runOnPhrase" }; foreach (var phrase in phrases) Console.WriteLine("Second word is {0}", GetSecondWord(phrase)); } static String GetSecondWord(String s) { int pos = s.IndexOf(" "); return s.Substring(pos).Trim(); } } // The example displays the following output: // Second word is blue // Second word is citizen // // Unhandled Exception: System.ArgumentOutOfRangeException: StartIndex cannot be less than zero. // Parameter name: startIndex // at System.String.Substring(Int32 startIndex, Int32 length) // at Example.GetSecondWord(String s) // at Example.Main()
Module Example Public Sub Main() Dim phrases() As String = { "ocean blue", "concerned citizen", "runOnPhrase" } For Each phrase In phrases Console.WriteLine("Second word is {0}", GetSecondWord(phrase)) Next End Sub Function GetSecondWord(s As String) As String Dim pos As Integer = s.IndexOf(" ") Return s.Substring(pos).Trim() End Function End Module ' The example displays the following output: ' Second word is blue ' Second word is citizen ' ' Unhandled Exception: System.ArgumentOutOfRangeException: StartIndex cannot be less than zero. ' Parameter name: startIndex ' at System.String.Substring(Int32 startIndex, Int32 length) ' at Example.GetSecondWord(String s) ' at Example.Main()
Para eliminar a exceção, valide o valor retornado pelo método de pesquisa de cadeia de caracteres antes de chamar o método de manipulação de cadeia de caracteres.To eliminate the exception, validate the value returned by the string search method before calling the string manipulation method.
using System; public class Example { public static void Main() { String[] phrases = { "ocean blue", "concerned citizen", "runOnPhrase" }; foreach (var phrase in phrases) { String word = GetSecondWord(phrase); if (! String.IsNullOrEmpty(word)) Console.WriteLine("Second word is {0}", word); } } static String GetSecondWord(String s) { int pos = s.IndexOf(" "); if (pos >= 0) return s.Substring(pos).Trim(); else return String.Empty; } } // The example displays the following output: // Second word is blue // Second word is citizen
Module Example Public Sub Main() Dim phrases() As String = { "ocean blue", "concerned citizen", "runOnPhrase" } For Each phrase In phrases Dim word As String = GetSecondWord(phrase) If Not String.IsNullOrEmpty(word) Then _ Console.WriteLine("Second word is {0}", word) Next End Sub Function GetSecondWord(s As String) As String Dim pos As Integer = s.IndexOf(" ") If pos >= 0 Return s.Substring(pos).Trim() Else Return String.Empty End If End Function End Module ' The example displays the following output: ' Second word is blue ' Second word is citizen
Você tentou extrair uma subcadeia de caracteres que está fora do intervalo da cadeia de caracteres atual.You've attempted to extract a substring that is outside the range of the current string.
Os métodos que extraem subcadeias de caracteres exigem que você especifique a posição inicial da subcadeia de caracteres e, para subcadeias de caracteres que não continuam até o final da cadeia de caracteres, o número de caracteres na subcadeia de caracteres.The methods that extract substrings all require that you specify the starting position of the substring and, for substrings that do not continue to the end of the string, the number of characters in the substring. Observe que esse não é o índice do último caractere na Subcadeia de caracteres.Note that this is not the index of the last character in the substring.
ArgumentOutOfRangeExceptionNormalmente, uma exceção é gerada nesse caso porque você calculou incorretamente o número de caracteres na Subcadeia.An ArgumentOutOfRangeException exception is typically thrown in this case because you've incorrectly calculated the number of characters in the substring. Se você estiver usando um método de pesquisa como String.IndexOf para identificar as posições inicial e final de uma subcadeia de caracteres:If you are using a search method like String.IndexOf to identify the starting and ending positions of a substring:
Se o caractere na posição final retornada por String.IndexOf for ser incluído na Subcadeia de caracteres, a posição final da subcadeia de caracteres será fornecida pela fórmulaIf the character in the ending position returned by String.IndexOf is to be included in the substring, the ending position of the substring is given by the formula
endIndex - startIndex + 1
Se o caractere na posição final retornada por String.IndexOf for ser excluído da subcadeia de caracteres, a posição final da subcadeia de caracteres será fornecida pela fórmulaIf the character in the ending position returned by String.IndexOf is to be excluded from the substring, the ending position of the substring is given by the formula
endIndex - startIndex
O exemplo a seguir define um
FindWords
método que usa o String.IndexOfAny(Char[], Int32) método para identificar caracteres de espaço e marcas de pontuação em uma cadeia de caracteres e retorna uma matriz que contém as palavras encontradas na cadeia de caracteres.The following example defines aFindWords
method that uses the String.IndexOfAny(Char[], Int32) method to identify space characters and punctuation marks in a string and returns an array that contains the words found in the string.using System; using System.Collections.Generic; public class Example { public static void Main() { String sentence = "This is a simple, short sentence."; Console.WriteLine("Words in '{0}':", sentence); foreach (var word in FindWords(sentence)) Console.WriteLine(" '{0}'", word); } static String[] FindWords(String s) { int start = 0, end = 0; Char[] delimiters = { ' ', '.', ',', ';', ':', '(', ')' }; var words = new List<String>(); while (end >= 0) { end = s.IndexOfAny(delimiters, start); if (end >= 0) { if (end - start > 0) words.Add(s.Substring(start, end - start)); start = end + 1; } else { if (start < s.Length - 1) words.Add(s.Substring(start)); } } return words.ToArray(); } } // The example displays the following output: // Words in 'This is a simple, short sentence.': // 'This' // 'is' // 'a' // 'simple' // 'short' // 'sentence'
Imports System.Collections.Generic Module Example Public Sub Main() Dim sentence As String = "This is a simple, short sentence." Console.WriteLine("Words in '{0}':", sentence) For Each word In FindWords(sentence) Console.WriteLine(" '{0}'", word) Next End Sub Function FindWords(s As String) As String() Dim start, ending As Integer Dim delimiters() As Char = { " "c, "."c, ","c, ";"c, ":"c, "("c, ")"c } Dim words As New List(Of String)() Do While ending >= 0 ending = s.IndexOfAny(delimiters, start) If ending >= 0 If ending - start > 0 Then words.Add(s.Substring(start, ending - start)) End If start = ending + 1 Else If start < s.Length - 1 Then words.Add(s.Substring(start)) End If End If Loop Return words.ToArray() End Function End Module ' The example displays the following output: ' Words in 'This is a simple, short sentence.': ' 'This' ' 'is' ' 'a' ' 'simple' ' 'short' ' 'sentence'
Você passou um número negativo para um método com um argumento que requer apenas números positivos e zero ou que você tenha passado um número negativo ou zero para um método com um argumento que requer apenas números positivos.You have passed a negative number to a method with an argument that requires only positive numbers and zero, or you have passed either a negative number or zero to a method with an argument that requires only positive numbers.
Por exemplo, o Array.CreateInstance(Type, Int32, Int32, Int32) método requer que você especifique o número de elementos em cada dimensão de uma matriz bidimensional; os valores válidos para cada dimensão podem variar de 0 a Int32.MaxValue .For example, the Array.CreateInstance(Type, Int32, Int32, Int32) method requires that you specify the number of elements in each dimension of a two-dimensional array; valid values for each dimension can range from 0 to Int32.MaxValue. Mas como o argumento de dimensão no exemplo a seguir tem um valor negativo, o método gera uma ArgumentOutOfRangeException exceção.But because the dimension argument in the following example has a negative value, the method throws an ArgumentOutOfRangeException exception.
using System; public class Example { public static void Main() { int dimension1 = 10; int dimension2 = -1; try { Array arr = Array.CreateInstance(typeof(String), dimension1, dimension2); } catch (ArgumentOutOfRangeException e) { if (e.ActualValue != null) Console.WriteLine("{0} is an invalid value for {1}: ", e.ActualValue, e.ParamName); Console.WriteLine(e.Message); } } } // The example displays the following output: // Non-negative number required. // Parameter name: length2
Module Example Public Sub Main() Dim dimension1 As Integer = 10 Dim dimension2 As Integer = -1 Try Dim arr AS Array = Array.CreateInstance(GetType(String), dimension1, dimension2) Catch e As ArgumentOutOfRangeException If e.ActualValue IsNot Nothing Then Console.WriteLine("{0} is an invalid value for {1}: ", e.ActualValue, e.ParamName) End If Console.WriteLine(e.Message) End Try End Sub End Module ' The example displays the following output: ' Non-negative number required. ' Parameter name: length2
Para corrigir o erro, verifique se o valor do argumento inválido é não negativo.To correct the error, ensure that the value of the invalid argument is non-negative. Você pode fazer isso fornecendo um valor válido, como faz o fragmento de código a seguir.You can do this by providing a valid value, as the following code fragment does.
int dimension1 = 10; int dimension2 = 10; Array arr = Array.CreateInstance(typeof(String), dimension1, dimension2);
Dim dimension1 As Integer = 10 Dim dimension2 As Integer = 10 Dim arr As Array = Array.CreateInstance(GetType(String), dimension1, dimension2)
Você também pode validar a entrada e, se ela for inválida, executar alguma ação.You can also validate the input and, if it is invalid, take some action. O fragmento de código a seguir exibe uma mensagem de erro em vez de chamar o método.The following code fragment displays an error message instead of calling the method.
if (dimension1 < 0 || dimension2 < 0) { Console.WriteLine("Unable to create the array."); Console.WriteLine("Specify non-negative values for the two dimensions."); } else { arr = Array.CreateInstance(typeof(String), dimension1, dimension2); }
If dimension1 < 0 OrElse dimension2 < 0 Then Console.WriteLine("Unable to create the array.") Console.WriteLine("Specify non-negative values for the two dimensions.") Else arr = Array.CreateInstance(GetType(String), dimension1, dimension2) End If
Existe uma condição de corrida em um aplicativo com multithread ou que tem tarefas que são executadas de forma assíncrona e que atualiza uma matriz ou coleção.A race condition exists in an app that is multithreaded or has tasks that execute asynchronously and that updates an array or collection.
O exemplo a seguir usa um List<T> objeto para popular uma coleção de
Continent
objetos.The following example uses a List<T> object to populate a collection ofContinent
objects. Ele lança um ArgumentOutOfRangeException se o exemplo tenta exibir os sete itens na coleção antes que a coleção seja totalmente populada.It throws an ArgumentOutOfRangeException if the example attempts to display the seven items in the collection before the collection is fully populated.using System; using System.Collections.Generic; using System.Threading; public class Continent { public String Name { get; set; } public int Population { get; set; } public Decimal Area { get; set; } } public class Example { static List<Continent> continents = new List<Continent>(); static String msg; public static void Main() { String[] names = { "Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America" }; // Populate the list. foreach (var name in names) { var th = new Thread(PopulateContinents); th.Start(name); } Console.WriteLine(msg); Console.WriteLine(); // Display the list. for (int ctr = 0; ctr < names.Length; ctr++) { var continent = continents[ctr]; Console.WriteLine("{0}: Area: {1}, Population {2}", continent.Name, continent.Population, continent.Area); } } private static void PopulateContinents(Object obj) { String name = obj.ToString(); msg += String.Format("Adding '{0}' to the list.\n", name); var continent = new Continent(); continent.Name = name; // Sleep to simulate retrieving remaining data. Thread.Sleep(50); continents.Add(continent); } } // The example displays output like the following: // Adding //Africa// to the list. // Adding //Antarctica// to the list. // Adding //Asia// to the list. // Adding //Australia// to the list. // Adding //Europe// to the list. // Adding //North America// to the list. // Adding //South America// to the list. // // // // Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. // Parameter name: index // at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) // at Example.Main()
Imports System.Collections.Generic Imports System.Threading Public Class Continent Public Property Name As String Public Property Population As Integer Public Property Area As Decimal End Class Module Example Dim continents As New List(Of Continent) Dim msg As String Public Sub Main() Dim names() As String = { "Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America" } ' Populate the list. For Each name In names Dim th As New Thread(AddressOf PopulateContinents) th.Start(name) Next Console.WriteLine(msg) Console.WriteLine() ' Display the list. For ctr As Integer = 0 To names.Length - 1 Dim continent = continents(ctr) Console.WriteLine("{0}: Area: {1}, Population {2}", continent.Name, continent.Population, continent.Area) Next End Sub Private Sub PopulateContinents(obj As Object) Dim name As String = obj.ToString() msg += String.Format("Adding '{0}' to the list.{1}", name, vbCrLf) Dim continent As New Continent() continent.Name = name ' Sleep to simulate retrieving remaining data. Thread.Sleep(50) continents.Add(continent) End Sub End Module ' The example displays output like the following: ' Adding 'Africa' to the list. ' Adding 'Antarctica' to the list. ' Adding 'Asia' to the list. ' Adding 'Australia' to the list. ' Adding 'Europe' to the list. ' Adding 'North America' to the list. ' Adding 'South America' to the list. ' ' ' ' Unhandled Exception: System.ArgumentOutOfRangeException: Index was out of range. Must be non-negative and less than the size of the collection. ' Parameter name: index ' at System.ThrowHelper.ThrowArgumentOutOfRangeException(ExceptionArgument argument, ExceptionResource resource) ' at Example.Main()
Nesse caso, dois recursos são acessados de vários threads:In this case, two resources are accessed from multiple threads:
A coleção
continents
.Thecontinents
collection. Seu List<T>.Add método é chamado de vários threads.Its List<T>.Add method is called from multiple threads. Além disso, o thread principal ou primário pressupõe que a coleção está totalmente preenchida com sete elementos quando itera seus membros.In addition, the main or primary thread assumes the collection is fully populated with seven elements when it iterates its members.A
msg
cadeia de caracteres, que é concatenada de vários threads.Themsg
string, which is concatenated from multiple threads.
Para corrigir o erro, verifique se o estado compartilhado é acessado de forma segura para thread, da seguinte maneira.To correct the error, ensure that shared state is accessed in a thread-safe way, as follows.
Se seu aplicativo usar uma matriz ou um objeto de coleção, considere usar uma classe de coleção thread-safe, como os tipos no System.Collections.Concurrent namespace ou a System.Collections.Immutable versão fora de banda.if your app uses an array or collection object, consider using a thread-safe collection class, such as the types in the System.Collections.Concurrent namespace or the System.Collections.Immutable out-of-band release.
Verifique se o estado compartilhado (ou seja, os recursos que podem ser acessados por vários threads) é acessado de forma segura para thread, para que apenas um thread de cada vez tenha acesso exclusivo aos recursos.Ensure that shared state (that is, resources that can be accessed by multiple threads) is accessed in a thread-safe way, so that only one thread at a time has exclusive access to the resources. Um grande número de classes, como, CountdownEvent , Interlocked Monitor e Mutex , estão disponíveis para sincronizar o acesso aos recursos.A large number of classes, such as CountdownEvent, Interlocked, Monitor, and Mutex, are available to synchronize access to resources. Para obter mais informações, consulte Threading.For more information, see Threading. Além disso, o suporte a idiomas está disponível por meio da instrução Lock em C# e da construção SyncLock no Visual Basic.In addition, language support is available through the lock statement in C# and the SyncLock construct in Visual Basic.
O exemplo a seguir aborda o ArgumentOutOfRangeException e os outros problemas do exemplo anterior.The following example addresses the ArgumentOutOfRangeException and the other issues from the previous example. Ele substitui o List<T> objeto por um ConcurrentBag<T> objeto para garantir que o acesso à coleção seja thread-safe, use um CountdownEvent objeto para garantir que o thread do aplicativo continue somente após a execução de outros threads e use um bloqueio para garantir que apenas um thread possa acessar a
msg
variável por vez.It replaces the List<T> object with a ConcurrentBag<T> object to ensure that access to the collection is thread-safe, uses a CountdownEvent object to ensure that the application thread continues only after other threads have executed, and uses a lock to ensure that only one thread can access themsg
variable at a time.using System; using System.Collections.Concurrent; using System.Threading; public class Continent { public String Name { get; set; } public int Population { get; set; } public Decimal Area { get; set; } } public class Example { static ConcurrentBag<Continent> continents = new ConcurrentBag<Continent>(); static CountdownEvent gate; static String msg = String.Empty; public static void Main() { String[] names = { "Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America" }; gate = new CountdownEvent(names.Length); // Populate the list. foreach (var name in names) { var th = new Thread(PopulateContinents); th.Start(name); } // Display the list. gate.Wait(); Console.WriteLine(msg); Console.WriteLine(); var arr = continents.ToArray(); for (int ctr = 0; ctr < names.Length; ctr++) { var continent = arr[ctr]; Console.WriteLine("{0}: Area: {1}, Population {2}", continent.Name, continent.Population, continent.Area); } } private static void PopulateContinents(Object obj) { String name = obj.ToString(); lock(msg) { msg += String.Format("Adding '{0}' to the list.\n", name); } var continent = new Continent(); continent.Name = name; // Sleep to simulate retrieving remaining data. Thread.Sleep(25); continents.Add(continent); gate.Signal(); } } // The example displays output like the following: // Adding 'Africa' to the list. // Adding 'Antarctica' to the list. // Adding 'Asia' to the list. // Adding 'Australia' to the list. // Adding 'Europe' to the list. // Adding 'North America' to the list. // Adding 'South America' to the list. // // // Africa: Area: 0, Population 0 // Antarctica: Area: 0, Population 0 // Asia: Area: 0, Population 0 // Australia: Area: 0, Population 0 // Europe: Area: 0, Population 0 // North America: Area: 0, Population 0 // South America: Area: 0, Population 0
Imports System.Collections.Concurrent Imports System.Threading Public Class Continent Public Property Name As String Public Property Population As Integer Public Property Area As Decimal End Class Module Example Dim continents As New ConcurrentBag(Of Continent) Dim gate As CountdownEvent Dim msg As String = String.Empty Public Sub Main() Dim names() As String = { "Africa", "Antarctica", "Asia", "Australia", "Europe", "North America", "South America" } gate = new CountdownEvent(names.Length) ' Populate the list. For Each name In names Dim th As New Thread(AddressOf PopulateContinents) th.Start(name) Next ' Display the list. gate.Wait() Console.WriteLine(msg) Console.WriteLine() For ctr As Integer = 0 To names.Length - 1 Dim continent = continents(ctr) Console.WriteLine("{0}: Area: {1}, Population {2}", continent.Name, continent.Population, continent.Area) Next End Sub Private Sub PopulateContinents(obj As Object) Dim name As String = obj.ToString() SyncLock msg msg += String.Format("Adding '{0}' to the list.{1}", name, vbCrLf) End SyncLock Dim continent As New Continent() continent.Name = name ' Sleep to simulate retrieving remaining data. Thread.Sleep(25) continents.Add(continent) gate.Signal() End Sub End Module ' The example displays output like the following: ' Adding 'Africa' to the list. ' Adding 'Antarctica' to the list. ' Adding 'Asia' to the list. ' Adding 'Australia' to the list. ' Adding 'Europe' to the list. ' Adding 'North America' to the list. ' Adding 'South America' to the list. ' ' ' Africa: Area: 0, Population 0 ' Antarctica: Area: 0, Population 0 ' Asia: Area: 0, Population 0 ' Australia: Area: 0, Population 0 ' Europe: Area: 0, Population 0 ' North America: Area: 0, Population 0 ' South America: Area: 0, Population 0
ArgumentOutOfRangeException usa o COR_E_ARGUMENTOUTOFRANGE HRESULT, que tem o valor 0x80131502.ArgumentOutOfRangeException uses the HRESULT COR_E_ARGUMENTOUTOFRANGE, which has the value 0x80131502.
Para obter uma lista de valores de propriedade inicial para uma instância do ArgumentOutOfRangeException, consulte o ArgumentOutOfRangeException construtores.For a list of initial property values for an instance of ArgumentOutOfRangeException, see the ArgumentOutOfRangeException constructors.
Construtores
ArgumentOutOfRangeException() |
Inicializa uma nova instância da classe ArgumentOutOfRangeException.Initializes a new instance of the ArgumentOutOfRangeException class. |
ArgumentOutOfRangeException(SerializationInfo, StreamingContext) |
Inicializa uma nova instância da classe ArgumentOutOfRangeException com dados serializados.Initializes a new instance of the ArgumentOutOfRangeException class with serialized data. |
ArgumentOutOfRangeException(String) |
Inicializa uma nova instância da classe ArgumentOutOfRangeException com o nome do parâmetro que causa essa exceção.Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception. |
ArgumentOutOfRangeException(String, Exception) |
Inicializa uma nova instância da classe ArgumentOutOfRangeException com uma mensagem de erro especificada e a exceção interna que é a causa desta exceção.Initializes a new instance of the ArgumentOutOfRangeException class with a specified error message and the exception that is the cause of this exception. |
ArgumentOutOfRangeException(String, Object, String) |
Inicializa uma nova instância da classe ArgumentOutOfRangeException com o nome do parâmetro, o valor do argumento e uma mensagem de erro especificada.Initializes a new instance of the ArgumentOutOfRangeException class with the parameter name, the value of the argument, and a specified error message. |
ArgumentOutOfRangeException(String, String) |
Inicializa uma nova instância da classe ArgumentOutOfRangeException com o nome do parâmetro que causa essa exceção e uma mensagem de erro especificada.Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception and a specified error message. |
Propriedades
ActualValue |
Obtém o valor do argumento que causa essa exceção.Gets the argument value that causes this exception. |
Data |
Obtém uma coleção de pares de chave/valor que fornecem informações definidas pelo usuário adicionais sobre a exceção.Gets a collection of key/value pairs that provide additional user-defined information about the exception. (Herdado de Exception) |
HelpLink |
Obtém ou define um link para o arquivo de ajuda associado a essa exceção.Gets or sets a link to the help file associated with this exception. (Herdado de Exception) |
HResult |
Obtém ou define HRESULT, um valor numérico codificado que é atribuído a uma exceção específica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception. (Herdado de Exception) |
InnerException |
Obtém a instância Exception que causou a exceção atual.Gets the Exception instance that caused the current exception. (Herdado de Exception) |
Message |
Obtém a mensagem de erro e a representação de cadeia de caracteres do valor de argumento inválido ou apenas a mensagem de erro se o valor do argumento for nulo.Gets the error message and the string representation of the invalid argument value, or only the error message if the argument value is null. |
ParamName |
Obtém o nome do parâmetro que causa essa exceção.Gets the name of the parameter that causes this exception. (Herdado de ArgumentException) |
Source |
Obtém ou define o nome do aplicativo ou objeto que causa o erro.Gets or sets the name of the application or the object that causes the error. (Herdado de Exception) |
StackTrace |
Obtém uma representação de cadeia de caracteres de quadros imediatos na pilha de chamadas.Gets a string representation of the immediate frames on the call stack. (Herdado de Exception) |
TargetSite |
Obtém o método que gerou a exceção atual.Gets the method that throws the current exception. (Herdado de Exception) |
Métodos
Equals(Object) |
Determina se o objeto especificado é igual ao objeto atual.Determines whether the specified object is equal to the current object. (Herdado de Object) |
GetBaseException() |
Quando substituído em uma classe derivada, retorna a Exception que é a causa raiz de uma ou mais exceções subsequentes.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions. (Herdado de Exception) |
GetHashCode() |
Serve como a função de hash padrão.Serves as the default hash function. (Herdado de Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Define o objeto SerializationInfo com o valor de argumento inválido e informações adicionais de exceção.Sets the SerializationInfo object with the invalid argument value and additional exception information. |
GetObjectData(SerializationInfo, StreamingContext) |
Define o objeto SerializationInfo com o nome do parâmetro e informações adicionais de exceção.Sets the SerializationInfo object with the parameter name and additional exception information. (Herdado de ArgumentException) |
GetType() |
Obtém o tipo de runtime da instância atual.Gets the runtime type of the current instance. (Herdado de Exception) |
MemberwiseClone() |
Cria uma cópia superficial do Object atual.Creates a shallow copy of the current Object. (Herdado de Object) |
ToString() |
Cria e retorna uma representação de cadeia de caracteres da exceção atual.Creates and returns a string representation of the current exception. (Herdado de Exception) |
Eventos
SerializeObjectState |
Ocorre quando uma exceção é serializada para criar um objeto de estado de exceção que contém dados serializados sobre a exceção.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception. (Herdado de Exception) |