ArgumentOutOfRangeException ArgumentOutOfRangeException ArgumentOutOfRangeException ArgumentOutOfRangeException Class

Definition

引数の値が、呼び出されたメソッドで定義されている許容範囲外である場合にスローされる例外。 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
[System.Runtime.InteropServices.ComVisible(true)]
[Serializable]
public class ArgumentOutOfRangeException : ArgumentException
type ArgumentOutOfRangeException = class
    inherit ArgumentException
    interface ISerializable
Public Class ArgumentOutOfRangeException
Inherits ArgumentException
Inheritance
Attributes
ComVisibleAttribute SerializableAttribute
Implements

Examples

次の例では、招待されたゲストに関する情報を格納するクラスを定義します。The following example defines a class to contain information about an invited guest. ゲストが、21 歳未満の場合、ArgumentOutOfRangeException例外がスローされます。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

Remarks

ArgumentOutOfRangeExceptionメソッドが呼び出され、メソッドに渡される引数の少なくとも 1 つでない例外がスローされますnull引数の想定される値のセットのメンバーではない無効な値が含まれています。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. ParamNameプロパティは、無効な引数を識別し、ActualValueプロパティ、値が存在する場合は、無効な値を識別します。The ParamName property identifies the invalid argument, and the ActualValue property, if a value is present, identifies the invalid value.

通常、ArgumentOutOfRangeException開発者のエラーの結果します。Typically, an ArgumentOutOfRangeException results from developer error. 例外を処理する代わりに、 try / catchブロック、例外の原因を除去する必要があります、または例外をスローする場合は、引数がメソッドの呼び出しによって返されるか、メソッドに渡される前に、ユーザーが入力をメソッドに渡される前に、の引数を検証する必要があります。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 幅広く使用されます。ArgumentOutOfRangeException is used extensively by:

条件で、ArgumentOutOfRangeException例外がスローされます、次が含まれます。The conditions in which an ArgumentOutOfRangeException exception is thrown include the following:

コレクションのメンバーのインデックス番号を取得して、インデックス番号が無効です。You are retrieving the member of a collection by its index number, and the index number is invalid.
これは、最も一般的な原因をArgumentOutOfRangeException例外。This is the most common cause of an ArgumentOutOfRangeException exception. 通常は、インデックス番号は有効な 3 つの理由のいずれかの。Typically, the index number is invalid for one of three reasons:

  • コレクションには、メンバーがないと、コードが行われていることを前提とします。The collection has no members, and your code assumes that it does. 次の例は、要素を持たないコレクションの最初の要素の取得を試みます。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
    

    例外を防ぐためには、確認するかどうか、コレクションのCountプロパティがすべてのメンバーを取得する前に次のコード フラグメントは、0 より大きい。To prevent the exception, check whether the collection's Count 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
    

    場合によっては、これが発生するなど、メソッドを呼び出すことによってではなく、存在しないインデックスを使用して、コレクションにメンバーを追加しようとしているため、 Add、この目的のために存在します。In some cases, this 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 as Add, that exists for this purpose. 呼び出すのではなく、存在しないインデックスを使用してコレクションに要素を追加しようとしている次の例、List<T>.Addメソッド。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()
    

    次のコード フラグメントには、このエラーが修正されています。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
    
  • 項目のインデックスが負の値を取得しようとしています。You're attempting to retrieve an item whose index is negative. これは通常、特定の要素のインデックスのコレクションを検索した結果し、誤って検索が成功したことを想定するために発生します。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. 次の例への呼び出しで、List<T>.FindIndex(Predicate<T>)メソッドは、"Z"に等しい文字列には、-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. ただし、これは無効なインデックス値です。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
    

    例外を防ぐためには、返されるインデックスがより大きい、またはコレクションから項目を取得する前に 0 に等しい、次のコード フラグメントはことを確認することで、検索が成功したことを確認します。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
    
  • インデックスがコレクションの値と等しい要素を取得しようとしているCountプロパティでは、次の例として示します。You're attempting to retrieve an element whose index is equal to the value of the collection's Count 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
    

    .NET Framework のコレクションが 0 から始まるインデックスを使用して、コレクションの最初の要素は、インデックス 0、およびインデックス位置にある最後の要素のため、 Count - 1。Because collections in the .NET Framework use zero-based indexing, the first element of the collection is at index 0, and the last element is at index Count - 1. インデックス位置にある最後の要素をアクセスすることを確認して、エラーを排除できるCount- 1、次のコードのようです。You can eliminate the error by ensuring that you access the last element at index Count - 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   
    

文字列操作メソッドを呼び出すことによって、文字列操作を実行しようとして、文字列の開始インデックスが存在しません。You are attempting to perform a string operation by calling a string manipulation method, and the starting index does not exist in the string.
などのようにメソッドのオーバー ロードString.CompareString.CompareOrdinalString.IndexOfIndexOfAnyString.InsertString.LastIndexOfString.LastIndexOfAnyRemove、またはString.Substringの開始インデックスを指定することができます、操作は、インデックスは、文字列内の有効な位置である必要があります。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. 有効なインデックスの範囲は 0 ~ String.Length - 1。Valid indexes range from 0 to String.Length - 1.

この 4 つの一般的な原因があるArgumentOutOfRangeException例外。There are four common causes of this ArgumentOutOfRangeException exception:

  • 空の文字列。 で、使用しているまたはString.Emptyします。You are working with an empty string., or String.Empty. ため、そのString.Lengthプロパティ インデックス スローして操作をしようとすると、0 を返します、ArgumentOutOfRangeException例外。Because its String.Length property returns 0, any attempt to manipulate it by index throws an ArgumentOutOfRangeException exception. 次の例では、定義、GetFirstCharacterを文字列の最初の文字を返すメソッド。The following example, defines a GetFirstCharacter method that returns the first character of a string. 渡される最終的な文字列として、文字列が空の場合、メソッドは、メソッドをスローする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()
    

    テストで例外を取り除くことができるかどうか、文字列のString.Lengthまたは呼び出すことで 0 より大きい、IsNullOrEmpty文字列がないことを確認するメソッドnullまたは空です。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 not null or empty. 次のコード フラグメントは、後者の場合は。The following code fragment does the latter. この場合は、文字列がnullまたは空の場合、GetFirstCharacterメソッドは u+0000 を返します。In this case, if the string is null or empty, the GetFirstCharacter 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
    
  • 、その文字列内の部分文字列の位置に基づいて、文字列を操作して、部分文字列が実際に検出されたかどうかを確認に失敗しました。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.

    次の例では、2 つの単語のフレーズの 2 番目の単語を抽出します。The following example extracts the second word of a two-word phrase. スローされます、ArgumentOutOfRangeExceptionという語句が 1 つだけの単語から成る、埋め込みスペース文字含まれていない場合は例外です。It throws an ArgumentOutOfRangeException exception if the phrase consists of only one word, and therefore does not contain an embedded space character. これへの呼び出し、String.IndexOf(String)メソッドは、検索に失敗しました、おり、この無効な値に渡されますことを示す-1 を返します、String.Substring(Int32)メソッド。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()
    

    例外を取り除くには、文字列操作メソッドを呼び出す前に、文字列検索メソッドによって返される値を検証します。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
    

-

現在の文字列の範囲外にある部分文字列を抽出しようとしました。You've attempted to extract a substring that is outside the range of the current string.
このメソッドは、部分文字列にし、部分文字列の文字の数、文字列の末尾に進まないでくださいれた部分文字列の開始位置を指定する必要はすべての部分文字列を抽出します。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. これはありません、インデックスの部分文字列の最後の文字。Note that this is not the index of the last character in the substring.

ArgumentOutOfRangeException正しく計算したしない部分文字列の文字数であるために、例外はここでスローされます通常します。An ArgumentOutOfRangeException exception is typically thrown in this case because you've incorrectly calculated the number of characters in the substring. ような検索メソッドを使用している場合String.IndexOf最初と最後の部分文字列の位置を識別するために。If you are using a search method like String.IndexOf to identify the starting and ending positions of a substring:

  • 終了位置の文字がによって返される場合String.IndexOf、部分文字列内に含まれる数式で部分文字列の終了位置が指定されますIf 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  
    
  • 終了位置の文字がによって返される場合String.IndexOf、部分文字列から除外するのには、数式で部分文字列の終了位置が指定されますIf 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   
    

次の例では、定義、FindWordsメソッドを使用する、String.IndexOfAny(Char[], Int32)スペースおよび句読点を識別するためにメソッドが文字列でによってマークされ、文字列内にある単語を含む配列を返します。The following example defines a FindWords 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++;
         }
         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'

負の数は正の数値と 0 のみが必要な引数を持つメソッドに渡したことや、負の数または正の数値だけを必要とする引数を持つメソッドに 0 を渡したこと。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.
たとえば、Array.CreateInstance(Type, Int32, Int32, Int32)メソッドでは、2 次元配列の各次元で要素の数を指定することが必要です。 各次元の有効な値の範囲は 0 ~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. 次の例では、ディメンションの引数は負の値があるため、メソッドがスローされますが、ArgumentOutOfRangeException例外。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

エラーを修正するには、無効な引数の値は、負でないことを確認します。To correct the error, ensure that the value of the invalid argument is non-negative. 次のコード フラグメントは、有効な値を提供することでこれを実行できます。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)   

また、入力を検証できが有効でない場合は、いくつかのアクションを実行できます。You can also validate the input and, if it is invalid, take some action. 次のコード フラグメントでは、メソッドを呼び出すことではなく、エラー メッセージが表示されます。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

競合状態は、マルチ スレッドを非同期的に実行して、配列またはコレクションを更新するタスクがあるアプリに存在します。A race condition exists in an app that is multithreaded or has tasks that execute asynchronously and that updates an array or collection.
次の例では、List<T>オブジェクトのコレクションをContinentオブジェクト。The following example uses a List<T> object to populate a collection of Continent objects. スローされます、ArgumentOutOfRangeException例では、コレクションが完全に設定する前に、コレクション内で 7 つの項目を表示する場合は例外です。It throws an ArgumentOutOfRangeException exception 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()

この場合、2 つのリソースは複数のスレッドからアクセスします。In this case, two resources are accessed from multiple threads:

  • continents のコレクション。The continents collection. そのList<T>.Addメソッドが複数のスレッドから呼び出されます。Its List<T>.Add method is called from multiple threads. さらに、メインまたはプライマリ スレッドでは、そのメンバーを反復処理時に 7 つの要素のコレクションの完全設定前提としています。In addition, the main or primary thread assumes the collection is fully populated with seven elements when it iterates its members.

  • msg 、複数のスレッドから連結された文字列。The msg string, which is concatenated from multiple threads.

エラーを修正するには、共有状態が次のようにアクセス、スレッド セーフな方法でことを確認します。To correct the error, ensure that shared state is accessed in a thread-safe way, as follows.

  • アプリは、配列またはコレクション オブジェクトを使用している場合は、型など、スレッド セーフなコレクション クラスを使用することを検討してください、System.Collections.Concurrent名前空間またはSystem.Collections.Immutableアウトオブ バンド リリースします。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.

  • 一度に 1 つのスレッドがあるリソースへの排他アクセスできるように、スレッド セーフな方法で共有状態 (つまり、複数のスレッドによってアクセスできるリソース) にアクセスすることを確認します。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. クラスの数が多いようCountdownEventInterlockedMonitorMutexリソースへのアクセスを同期化します。A large number of classes, such as CountdownEvent, Interlocked, Monitor, and Mutex, are available to synchronize access to resources. 詳細については、次を参照してください。スレッド処理します。For more information, see Threading. さらに、言語のサポートを利用、ロック(C#) ステートメント、 SyncLock Visual Basic で作成します。In addition, language support is available through the lock statement in C# and the SyncLock construct in Visual Basic.

次の例のアドレス、ArgumentOutOfRangeException例外と、前の例から、その他の問題。The following example addresses the ArgumentOutOfRangeException exception and the other issues from the previous example. 置き換えられます、List<T>オブジェクトをConcurrentBag<T>コレクションへのアクセスがスレッド セーフであることを確認を使用するオブジェクト、CountdownEventアプリケーション スレッドが他のスレッドが実行され、ロックを使用して、後でのみを続けるようにするオブジェクト1 つのスレッドがアクセスできること、msg一度に変数。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 the msg 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 値は 0x80131502 HRESULT COR_E_ARGUMENTOUTOFRANGE を使用します。ArgumentOutOfRangeException uses the HRESULT COR_E_ARGUMENTOUTOFRANGE, which has the value 0x80131502.

インスタンスの初期プロパティ値の一覧についてはArgumentOutOfRangeExceptionを参照してください、ArgumentOutOfRangeExceptionコンス トラクター。For a list of initial property values for an instance of ArgumentOutOfRangeException, see the ArgumentOutOfRangeException constructors.

Constructors

ArgumentOutOfRangeException() ArgumentOutOfRangeException() ArgumentOutOfRangeException() ArgumentOutOfRangeException()

ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the ArgumentOutOfRangeException class.

ArgumentOutOfRangeException(SerializationInfo, StreamingContext) ArgumentOutOfRangeException(SerializationInfo, StreamingContext) ArgumentOutOfRangeException(SerializationInfo, StreamingContext) ArgumentOutOfRangeException(SerializationInfo, StreamingContext)

シリアル化したデータを使用して、ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the ArgumentOutOfRangeException class with serialized data.

ArgumentOutOfRangeException(String) ArgumentOutOfRangeException(String) ArgumentOutOfRangeException(String) ArgumentOutOfRangeException(String)

この例外の原因である引数の名前を指定して、ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception.

ArgumentOutOfRangeException(String, Exception) ArgumentOutOfRangeException(String, Exception) ArgumentOutOfRangeException(String, Exception) ArgumentOutOfRangeException(String, Exception)

エラー メッセージ、およびこの例外の原因である例外を指定して、ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 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) ArgumentOutOfRangeException(String, Object, String) ArgumentOutOfRangeException(String, Object, String) ArgumentOutOfRangeException(String, Object, String)

パラメーター名、引数の値、および指定されたエラー メッセージを使用して、ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 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) ArgumentOutOfRangeException(String, String) ArgumentOutOfRangeException(String, String) ArgumentOutOfRangeException(String, String)

この例外の原因となるパラメーターの名前と、指定したエラー メッセージを使用して、ArgumentOutOfRangeException クラスの新しいインスタンスを初期化します。 Initializes a new instance of the ArgumentOutOfRangeException class with the name of the parameter that causes this exception and a specified error message.

Properties

ActualValue ActualValue ActualValue ActualValue

この例外の原因である引数値を取得します。 Gets the argument value that causes this exception.

Data Data Data Data

例外に関する追加のユーザー定義情報を提供する、キー/値ペアのコレクションを取得します。 Gets a collection of key/value pairs that provide additional user-defined information about the exception.

(Inherited from Exception)
HelpLink HelpLink HelpLink HelpLink

この例外に関連付けられているヘルプ ファイルへのリンクを取得または設定します。 Gets or sets a link to the help file associated with this exception.

(Inherited from Exception)
HResult HResult HResult HResult

特定の例外に割り当てられているコード化数値である HRESULT を取得または設定します。 Gets or sets HRESULT, a coded numerical value that is assigned to a specific exception.

(Inherited from Exception)
InnerException InnerException InnerException InnerException

現在の例外の原因となる Exception インスタンスを取得します。 Gets the Exception instance that caused the current exception.

(Inherited from Exception)
Message Message Message Message

エラー メッセージおよび無効な引数値の文字列形式を取得します。引数値が 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 ParamName ParamName ParamName

この例外の原因である引数の名前を取得します。 Gets the name of the parameter that causes this exception.

(Inherited from ArgumentException)
Source Source Source Source

エラーの原因となるアプリケーションまたはオブジェクトの名前を取得または設定します。 Gets or sets the name of the application or the object that causes the error.

(Inherited from Exception)
StackTrace StackTrace StackTrace StackTrace

呼び出し履歴で直前のフレームの文字列形式を取得します。 Gets a string representation of the immediate frames on the call stack.

(Inherited from Exception)
TargetSite TargetSite TargetSite TargetSite

現在の例外がスローされたメソッドを取得します。 Gets the method that throws the current exception.

(Inherited from Exception)

Methods

Equals(Object) Equals(Object) Equals(Object) Equals(Object)

指定したオブジェクトが、現在のオブジェクトと等しいかどうかを判断します。 Determines whether the specified object is equal to the current object.

(Inherited from Object)
GetBaseException() GetBaseException() GetBaseException() GetBaseException()

派生クラスでオーバーライドされた場合、それ以後に発生する 1 つ以上の例外の主要な原因である Exception を返します。 When overridden in a derived class, returns the Exception that is the root cause of one or more subsequent exceptions.

(Inherited from Exception)
GetHashCode() GetHashCode() GetHashCode() GetHashCode()

既定のハッシュ関数として機能します。 Serves as the default hash function.

(Inherited from Object)
GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext) GetObjectData(SerializationInfo, StreamingContext)

無効な引数値と追加の例外情報を使用して SerializationInfo オブジェクトを設定します。 Sets the SerializationInfo object with the invalid argument value and additional exception information.

GetType() GetType() GetType() GetType()

現在のインスタンスのランタイム型を取得します。 Gets the runtime type of the current instance.

(Inherited from Exception)
MemberwiseClone() MemberwiseClone() MemberwiseClone() MemberwiseClone()

現在の Object の簡易コピーを作成します。 Creates a shallow copy of the current Object.

(Inherited from Object)
ToString() ToString() ToString() ToString()

現在の例外の文字列形式を作成して返します。 Creates and returns a string representation of the current exception.

(Inherited from Exception)

Events

SerializeObjectState SerializeObjectState SerializeObjectState SerializeObjectState

例外がシリアル化され、例外に関するシリアル化されたデータを含む例外状態オブジェクトが作成されたときに発生します。 Occurs when an exception is serialized to create an exception state object that contains serialized data about the exception.

(Inherited from Exception)

Applies to

See Also