ArgumentOutOfRangeException Classe
Definizione
Eccezione generata quando il valore di un argomento non è compreso nell'intervallo consentito di valori, come definito dal metodo richiamato.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
- Ereditarietà
- Ereditarietà
- Attributi
- Implementazioni
Esempio
Nell'esempio seguente viene definita una classe che contiene informazioni su un Guest invitato.The following example defines a class to contain information about an invited guest. Se il Guest è più giovane di 21, ArgumentOutOfRangeException viene generata un'eccezione.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
Commenti
ArgumentOutOfRangeExceptionViene generata un'eccezione quando viene richiamato un metodo e almeno uno degli argomenti passati al metodo non è null
e contiene un valore non valido che non è un membro del set di valori previsto per l'argomento.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. La ParamName proprietà identifica l'argomento non valido e la ActualValue proprietà, se è presente un valore, identifica il valore non valido.The ParamName property identifies the invalid argument, and the ActualValue property, if a value is present, identifies the invalid value.
In genere, viene ArgumentOutOfRangeException restituito un errore di sviluppatore.Typically, an ArgumentOutOfRangeException results from developer error. Anziché gestire l'eccezione in un try
/ catch
blocco, è necessario eliminare la cause dell'eccezione o, se l'argomento viene restituito da una chiamata al metodo o da un input da parte dell'utente prima che venga passato al metodo che genera l'eccezione, è necessario convalidare gli argomenti prima di passarli al metodo.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 viene utilizzato estensivamente da:ArgumentOutOfRangeException is used extensively by:
Classi negli System.Collections System.IO spazi dei nomi e.Classes in the System.Collections and System.IO namespaces.
Metodi di manipolazione delle stringhe nella String classe.String manipulation methods in the String class.
Di seguito sono riportate le condizioni in cui ArgumentOutOfRangeException viene generata un'eccezione:The conditions in which an ArgumentOutOfRangeException exception is thrown include the following:
Si sta recuperando il membro di una raccolta in base al numero di indice e il numero di indice non è valido.You are retrieving the member of a collection by its index number, and the index number is invalid.
Questa è la ragione più comune di un' ArgumentOutOfRangeException eccezione.This is the most common cause of an ArgumentOutOfRangeException exception. In genere, il numero di indice non è valido per uno dei quattro motivi seguenti:Typically, the index number is invalid for one of four reasons:
La raccolta non contiene membri e il codice presuppone che sia presente.The collection has no members, and your code assumes that it does. Nell'esempio seguente viene effettuato un tentativo di recuperare il primo elemento di una raccolta senza elementi: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
Per evitare l'eccezione, controllare se la proprietà della raccolta
Count
è maggiore di zero prima di tentare di recuperare i membri, come fa il frammento di codice seguente.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
In alcuni casi, l'eccezione può verificarsi perché si sta tentando di aggiungere un membro a una raccolta utilizzando un indice che non esiste, anziché chiamando il metodo, ad esempio
Add
, esistente a questo scopo.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. Nell'esempio seguente viene effettuato un tentativo di aggiungere un elemento a una raccolta utilizzando un indice inesistente anziché chiamare il List<T>.Add metodo.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()
Il seguente frammento di codice corregge questo errore: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
Si sta tentando di recuperare un elemento il cui indice è negativo.You're attempting to retrieve an item whose index is negative. Questo problema si verifica in genere perché è stata eseguita una ricerca in una raccolta per l'indice di un determinato elemento e si presuppone erroneamente che la ricerca abbia esito positivo.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. Nell'esempio seguente, la chiamata al List<T>.FindIndex(Predicate<T>) metodo non riesce a trovare una stringa uguale a "Z" e pertanto restituisce-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. Tuttavia, si tratta di un valore di indice non valido.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
Per evitare l'eccezione, verificare che la ricerca abbia esito positivo assicurandosi che l'indice restituito sia maggiore o uguale a zero prima di tentare di recuperare l'elemento dalla raccolta, come fa il frammento di codice seguente.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
Si sta tentando di recuperare un elemento il cui indice è uguale al valore della proprietà della raccolta
Count
, come illustrato nell'esempio seguente.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
Poiché le raccolte in .NET utilizzano l'indicizzazione in base zero, il primo elemento della raccolta si trova in corrispondenza dell'indice 0 e l'ultimo elemento si trova in corrispondenza dell'indice
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. È possibile eliminare l'errore assicurandosi di accedere all'ultimo elemento in corrispondenza dell'indiceCount
1, come fa il codice seguente.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
Si sta tentando di eseguire un'operazione di stringa chiamando un metodo di manipolazione delle stringhe e l'indice iniziale non esiste nella stringa.You are attempting to perform a string operation by calling a string manipulation method, and the starting index does not exist in the string.
Gli overload di metodi come String.Compare ,, String.CompareOrdinal String.IndexOf , IndexOfAny , String.Insert , String.LastIndexOf , String.LastIndexOfAny , Remove o String.Substring che consentono di specificare l'indice iniziale dell'operazione richiedono che l'indice sia una posizione valida all'interno della stringa.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. Gli indici validi sono compresi tra 0 e String.Length -1.Valid indexes range from 0 to String.Length - 1.
Questa eccezione è costituita da quattro cause comuni ArgumentOutOfRangeException :There are four common causes of this ArgumentOutOfRangeException exception:
Si sta utilizzando una stringa vuota o String.Empty .You are working with an empty string, or String.Empty. Poiché la String.Length proprietà restituisce 0, qualsiasi tentativo di modificarlo in base all'indice genera un' ArgumentOutOfRangeException eccezione.Because its String.Length property returns 0, any attempt to manipulate it by index throws an ArgumentOutOfRangeException exception. Nell'esempio seguente viene definito un
GetFirstCharacter
metodo che restituisce il primo carattere di una stringa.The following example, defines aGetFirstCharacter
method that returns the first character of a string. Se la stringa è vuota, poiché la stringa finale passata al metodo è, il metodo genera un' ArgumentOutOfRangeException eccezione.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()
È possibile eliminare l'eccezione verificando se la stringa è String.Length maggiore di zero oppure chiamando il IsNullOrEmpty metodo per assicurarsi che la stringa non sia
null
o vuota.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. Il seguente frammento di codice esegue quest'ultimo.The following code fragment does the latter. In questo caso, se la stringa ènull
o vuota, ilGetFirstCharacter
metodo restituisce 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
Si sta modificando una stringa basata sulla posizione di una sottostringa all'interno di tale stringa e non è stato possibile determinare se la sottostringa è stata effettivamente trovata.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.
Nell'esempio seguente viene estrata la seconda parola di una frase a due parole.The following example extracts the second word of a two-word phrase. Genera un' ArgumentOutOfRangeException eccezione se la frase è costituita da una sola parola e pertanto non contiene un carattere di spazio incorporato.It throws an ArgumentOutOfRangeException exception if the phrase consists of only one word, and therefore does not contain an embedded space character. Questo problema si verifica perché la chiamata al String.IndexOf(String) metodo restituisce-1 per indicare che la ricerca ha avuto esito negativo e il valore non valido viene quindi passato al String.Substring(Int32) metodo.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()
Per eliminare l'eccezione, convalidare il valore restituito dal metodo di ricerca della stringa prima di chiamare il metodo di manipolazione delle stringhe.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
Si è provato a estrarre una sottostringa che non rientra nell'intervallo della stringa corrente.You've attempted to extract a substring that is outside the range of the current string.
Per tutti i metodi che estraggono sottostringhe è necessario specificare la posizione iniziale della sottostringa e, per le sottostringhe che non continuano fino alla fine della stringa, il numero di caratteri nella sottostringa.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. Si noti che questo non è l' Indice dell'ultimo carattere della sottostringa.Note that this is not the index of the last character in the substring.
ArgumentOutOfRangeExceptionIn questo caso viene in genere generata un'eccezione perché il numero di caratteri nella sottostringa è stato calcolato in modo errato.An ArgumentOutOfRangeException exception is typically thrown in this case because you've incorrectly calculated the number of characters in the substring. Se si usa un metodo di ricerca come String.IndexOf per identificare le posizioni iniziale e finale di una sottostringa:If you are using a search method like String.IndexOf to identify the starting and ending positions of a substring:
Se il carattere nella posizione finale restituita da deve String.IndexOf essere incluso nella sottostringa, la posizione finale della sottostringa viene fornita dalla formulaIf 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 il carattere nella posizione finale restituita da String.IndexOf deve essere escluso dalla sottostringa, la posizione finale della sottostringa viene fornita dalla formulaIf 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
Nell'esempio seguente viene definito un
FindWords
metodo che usa il String.IndexOfAny(Char[], Int32) metodo per identificare gli spazi e i segni di punteggiatura in una stringa e restituisce una matrice che contiene le parole trovate nella stringa.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'
È stato passato un numero negativo a un metodo con un argomento che richiede solo numeri positivi e zero oppure è stato passato un numero negativo o zero a un metodo con un argomento che richiede solo numeri positivi.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.
Per il metodo, ad esempio, Array.CreateInstance(Type, Int32, Int32, Int32) è necessario specificare il numero di elementi in ogni dimensione di una matrice bidimensionale. i valori validi per ogni dimensione possono variare da 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. Tuttavia, poiché l'argomento Dimension nell'esempio seguente presenta un valore negativo, il metodo genera un' ArgumentOutOfRangeException eccezione.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
Per correggere l'errore, verificare che il valore dell'argomento non valido sia non negativo.To correct the error, ensure that the value of the invalid argument is non-negative. A tale scopo, è possibile fornire un valore valido, come il frammento di codice seguente.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)
È anche possibile convalidare l'input e, se non è valido, eseguire un'azione.You can also validate the input and, if it is invalid, take some action. Nel frammento di codice seguente viene visualizzato un messaggio di errore anziché chiamare il metodo.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
Un race condition esiste in un'applicazione con multithreading o con attività eseguite in modo asincrono e che aggiorna una matrice o una raccolta.A race condition exists in an app that is multithreaded or has tasks that execute asynchronously and that updates an array or collection.
Nell'esempio seguente viene usato un List<T> oggetto per popolare una raccolta di
Continent
oggetti.The following example uses a List<T> object to populate a collection ofContinent
objects. Genera un'eccezione ArgumentOutOfRangeException se l'esempio tenta di visualizzare i sette elementi nella raccolta prima che la raccolta venga popolata completamente.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()
In questo caso, è possibile accedere a due risorse da più thread:In this case, two resources are accessed from multiple threads:
Raccolta
continents
.Thecontinents
collection. Il List<T>.Add metodo viene chiamato da più thread.Its List<T>.Add method is called from multiple threads. Inoltre, il thread principale o primario presuppone che la raccolta sia completamente popolata con sette elementi quando esegue l'iterazione dei relativi membri.In addition, the main or primary thread assumes the collection is fully populated with seven elements when it iterates its members.msg
Stringa concatenata da più thread.Themsg
string, which is concatenated from multiple threads.
Per correggere l'errore, verificare che sia possibile accedere allo stato condiviso in modo thread-safe, come indicato di seguito.To correct the error, ensure that shared state is accessed in a thread-safe way, as follows.
Se l'app usa un oggetto Array o Collection, provare a usare una classe di raccolte thread-safe, ad esempio i tipi nello System.Collections.Concurrent spazio dei nomi o la System.Collections.Immutable versione fuori 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.
Verificare che sia possibile accedere a uno stato condiviso, ovvero alle risorse accessibili da più thread, in modo thread-safe, in modo che solo un thread alla volta abbia accesso esclusivo alle risorse.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. Un numero elevato di classi, ad esempio CountdownEvent , Interlocked , Monitor e Mutex , è disponibile per sincronizzare l'accesso alle risorse.A large number of classes, such as CountdownEvent, Interlocked, Monitor, and Mutex, are available to synchronize access to resources. Per ulteriori informazioni, vedere Threading.For more information, see Threading. Inoltre, il supporto del linguaggio è disponibile tramite l'istruzione Lock in C# e il costrutto SyncLock in Visual Basic.In addition, language support is available through the lock statement in C# and the SyncLock construct in Visual Basic.
Nell'esempio seguente vengono illustrati gli ArgumentOutOfRangeException argomenti e gli altri problemi dell'esempio precedente.The following example addresses the ArgumentOutOfRangeException and the other issues from the previous example. Sostituisce l' List<T> oggetto con un ConcurrentBag<T> oggetto per garantire che l'accesso alla raccolta sia thread-safe, usa un CountdownEvent oggetto per garantire che il thread dell'applicazione continui solo dopo l'esecuzione di altri thread e usi un blocco per garantire che un solo thread possa accedere alla
msg
variabile alla volta.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 HRESULT COR_E_ARGUMENTOUTOFRANGE, che ha il valore 0x80131502.ArgumentOutOfRangeException uses the HRESULT COR_E_ARGUMENTOUTOFRANGE, which has the value 0x80131502.
Per un elenco di valori di proprietà iniziali per un'istanza di ArgumentOutOfRangeException, vedere il ArgumentOutOfRangeException costruttori.For a list of initial property values for an instance of ArgumentOutOfRangeException, see the ArgumentOutOfRangeException constructors.
Costruttori
ArgumentOutOfRangeException() |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException.Initializes a new instance of the ArgumentOutOfRangeException class. |
ArgumentOutOfRangeException(SerializationInfo, StreamingContext) |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException con dati serializzati.Initializes a new instance of the ArgumentOutOfRangeException class with serialized data. |
ArgumentOutOfRangeException(String) |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException con il nome del parametro che causa l'eccezione.Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception. |
ArgumentOutOfRangeException(String, Exception) |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException con un messaggio di errore e l'eccezione che ha causato l'eccezione corrente.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) |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException con il nome del parametro, il valore dell'argomento e un messaggio di errore specificato.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) |
Inizializza una nuova istanza della classe ArgumentOutOfRangeException con il nome del parametro che causa l'eccezione e un messaggio di errore specificato.Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception and a specified error message. |
Proprietà
ActualValue |
Ottiene il valore dell'argomento che causa l'eccezione.Gets the argument value that causes this exception. |
Data |
Ottiene una raccolta di coppie chiave/valore che forniscono informazioni definite dall'utente aggiuntive sull'eccezione.Gets a collection of key/value pairs that provide additional user-defined information about the exception. (Ereditato da Exception) |
HelpLink |
Ottiene o imposta un collegamento al file della Guida associato all'eccezione.Gets or sets a link to the help file associated with this exception. (Ereditato da Exception) |
HResult |
Ottiene o imposta HRESULT, un valore numerico codificato che viene assegnato a un'eccezione specifica.Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception. (Ereditato da Exception) |
InnerException |
Ottiene l'istanza di Exception che ha causato l'eccezione corrente.Gets the Exception instance that caused the current exception. (Ereditato da Exception) |
Message |
Ottiene il messaggio di errore e la rappresentazione in forma di stringa del valore dell'argomento non valido, oppure solo del messaggio di errore se il valore dell'argomento è null.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 |
Ottiene il nome del parametro che ha causato questa eccezione.Gets the name of the parameter that causes this exception. (Ereditato da ArgumentException) |
Source |
Ottiene o imposta il nome dell'oggetto o dell'applicazione che ha generato l'errore.Gets or sets the name of the application or the object that causes the error. (Ereditato da Exception) |
StackTrace |
Ottiene una rappresentazione di stringa dei frame immediati nello stack di chiamate.Gets a string representation of the immediate frames on the call stack. (Ereditato da Exception) |
TargetSite |
Ottiene il metodo che genera l'eccezione corrente.Gets the method that throws the current exception. (Ereditato da Exception) |
Metodi
Equals(Object) |
Determina se l'oggetto specificato è uguale all'oggetto corrente.Determines whether the specified object is equal to the current object. (Ereditato da Object) |
GetBaseException() |
Quando ne viene eseguito l'override in una classe derivata, restituisce l'Exception che è la causa radice di una o più eccezioni successive.When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions. (Ereditato da Exception) |
GetHashCode() |
Funge da funzione hash predefinita.Serves as the default hash function. (Ereditato da Object) |
GetObjectData(SerializationInfo, StreamingContext) |
Imposta l'oggetto SerializationInfo con il valore dell'argomento non valido e le informazioni aggiuntive sull'eccezione.Sets the SerializationInfo object with the invalid argument value and additional exception information. |
GetObjectData(SerializationInfo, StreamingContext) |
Imposta l'oggetto SerializationInfo con il nome del parametro e informazioni aggiuntive sull'eccezione.Sets the SerializationInfo object with the parameter name and additional exception information. (Ereditato da ArgumentException) |
GetType() |
Ottiene il tipo di runtime dell'istanza corrente.Gets the runtime type of the current instance. (Ereditato da Exception) |
MemberwiseClone() |
Crea una copia superficiale dell'oggetto Object corrente.Creates a shallow copy of the current Object. (Ereditato da Object) |
ToString() |
Crea e restituisce una rappresentazione di stringa dell'eccezione corrente.Creates and returns a string representation of the current exception. (Ereditato da Exception) |
Eventi
SerializeObjectState |
Si verifica quando un'eccezione viene serializzata per creare un oggetto di stato eccezione contenente i dati serializzati relativi all'eccezione.Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception. (Ereditato da Exception) |