カテゴリ: VB.NET 更新日: 2026/02/10

VB.NETのコレクション操作でよくあるエラーと解決策!初心者向けトラブル脱出ガイド

VB.NETのコレクション操作でよくあるエラーと解決策
VB.NETのコレクション操作でよくあるエラーと解決策

先生と生徒の会話形式で理解しよう

生徒

「先生、リストや配列を操作していると、急に画面が赤くなってプログラムが止まってしまいます。どうしてですか?」

先生

「それは『エラー』が発生したからですね。VB.NETでは、コレクションの扱い方を一つ間違えると、コンピュータが困って動けなくなってしまうんです。」

生徒

「何が原因なのかさっぱり分かりません。よくある間違いを知っていれば、すぐ直せるようになりますか?」

先生

「もちろんです!エラーは怖いものではなく、上達するためのヒントですよ。よくあるパターンとその対策を詳しく見ていきましょう!」

1. インデックスが範囲外です(IndexOutOfRangeException)

1. インデックスが範囲外です(IndexOutOfRangeException)
1. インデックスが範囲外です(IndexOutOfRangeException)

VB.NET初心者の方が最も頻繁に遭遇するエラーがこれです。配列やリストのインデックスとは、データの入っている「箱の番号」のことですが、存在しない番号を指定したときに発生します。

例えば、3つしかデータがないのに「10番目のデータを取ってきて」とお願いすると、コンピュータは「そんな番号の箱はありません!」と怒って止まってしまいます。

特に注意が必要なのは、VB.NETの数え方は「0」から始まるというルールです。3つのデータがある場合、番号は「0, 1, 2」となります。「3」を指定しただけでもエラーになるので、最大数より1少ない番号までしか使えないことを覚えておきましょう。

2. インデックスエラーの解決策と予防コード

2. インデックスエラーの解決策と予防コード
2. インデックスエラーの解決策と予防コード

このエラーを防ぐためには、操作する前に「今、データがいくつあるか」を確認することが大切です。


Dim members As New List(Of String) From {"田中", "佐藤", "鈴木"}

' 悪い例:存在しない3番(4つ目)にアクセスしようとする
' Console.WriteLine(members(3)) ' ここでエラー!

' 良い例:中身の数(Count)をチェックしてからアクセスする
Dim targetIndex As Integer = 2
If targetIndex < members.Count Then
    Console.WriteLine("データが見つかりました:" & members(targetIndex))
Else
    Console.WriteLine("指定された番号は存在しません。")
End If

データが見つかりました:鈴木

このように、Count(カウント)を使って、データの数を超えていないかチェックする癖をつけましょう。

3. インスタンス化を忘れた!Null参照エラー

3. インスタンス化を忘れた!Null参照エラー
3. インスタンス化を忘れた!Null参照エラー

次に多いのが「オブジェクト参照がオブジェクトインスタンスに設定されていません」というエラー(NullReferenceException)です。

これは、リストという「カバン」の名前だけ決めて、実物を用意(インスタンス化)し忘れたまま、中に物を入れようとしたときに起こります。

現実で例えるなら、架空のカバンの中に「財布を入れて」と言っているようなものです。まずは New というキーワードを使って、本物のカバンを机の上に用意してあげなければいけません。

4. Null参照エラーを回避する正しい書き方

4. Null参照エラーを回避する正しい書き方
4. Null参照エラーを回避する正しい書き方

変数を宣言するときは、必ず New を使って中身を空っぽの状態で作っておきましょう。


' エラーになる書き方
' Dim myFruits As List(Of String)
' myFruits.Add("リンゴ") ' 実行するとここでエラー!

' 正しい書き方
Dim myFruits As New List(Of String)
myFruits.Add("リンゴ")
Console.WriteLine("リストに果物を追加しました。")

リストに果物を追加しました。

As New と書くことで、変数を作ると同時にリストの実体も作成されます。これを忘れないようにするだけで、多くのエラーが消えてなくなります。

5. 繰り返しの中で中身を変えてしまうエラー

5. 繰り返しの中で中身を変えてしまうエラー
5. 繰り返しの中で中身を変えてしまうエラー

For Each 文を使ってリストの中身を一つずつ順番にチェックしている最中に、そのリストからデータを消したり、新しく追加したりすると、VB.NETは混乱してエラーを出します。

これは「列に並んでいる人を順番に数えている最中に、誰かが列から抜けたり割り込んだりすると、どこまで数えたか分からなくなる」のと似ています。

どうしても中身を消したい場合は、後ろの番号から逆向きに数える For 文を使うか、消したいものだけを別のリストにメモしておいて、ループが終わった後にまとめて消すといった工夫が必要です。

6. ループ中の削除エラーを回避するテクニック

6. ループ中の削除エラーを回避するテクニック
6. ループ中の削除エラーを回避するテクニック

安全にデータを削除するための「逆順ループ」の書き方を見てみましょう。


Dim numbers As New List(Of Integer) From {1, 2, 3, 4, 5}

' 逆から順番にチェックして、偶数なら消す
' Count - 1 から 0 まで、Step -1(1ずつ減らす)でループ
For i As Integer = numbers.Count - 1 To 0 Step -1
    If numbers(i) Mod 2 = 0 Then
        numbers.RemoveAt(i)
    End If
Next

Console.WriteLine("残った数:" & String.Join(", ", numbers))

残った数:1, 3, 5

このように、後ろから処理すれば、番号がずれても影響を受けないため、安全に削除が行えます。

7. 型が違います!データの入れ間違いエラー

7. 型が違います!データの入れ間違いエラー
7. 型が違います!データの入れ間違いエラー

リストを作るときに List(Of Integer) と決めたら、そこには数字(整数)しか入れることができません。間違えて文字を入れてしまうと、実行する前(プログラムを書いている途中)にエラーになります。

これを型安全(かたあんぜん)と呼びます。コンピュータが「ここは数字の部屋ですよ、文字は入れないでくださいね」と見張ってくれているおかげで、大きな事故を防げるようになっています。

もし何でも入れたい場合は Object(オブジェクト)という型を使えば可能ですが、中身を取り出すときに苦労するため、基本的には型をきっちり決めて使うのがVB.NETの正しい作法です。

8. Nothing(ナッシング)の扱いによるミス

8. Nothing(ナッシング)の扱いによるミス
8. Nothing(ナッシング)の扱いによるミス

検索機能などで「見つからなかったとき」に何が返ってくるかを把握していないと、次の処理でエラーになります。

例えば、リスト内を探して見つからなかった場合、結果が「空(Nothing)」になっていることがあります。その「空」の状態のまま、さらに何か命令を出そうとするとプログラムがパンクします。

検索した後は、必ず If result IsNot Nothing Then(もし結果が空じゃなければ)という確認を入れる習慣をつけましょう。

9. エラーが出たときの魔法の言葉「デバッグ」

9. エラーが出たときの魔法の言葉「デバッグ」
9. エラーが出たときの魔法の言葉「デバッグ」

どうしてもエラーが直らないときは、デバッグという作業を行います。これは、プログラムを一時停止して、その瞬間に変数の中身がどうなっているかを「のぞき見」する作業です。

Visual Studioなどの開発ツールを使えば、マウスを置くだけで「あ、今このリストの中身は空っぽだ!だからエラーになったんだ」と原因がすぐに分かります。エラーはあなたを攻撃しているのではなく、「ここを直せばもっと良くなるよ」と教えてくれている先生だと思いましょう。

10. トラブルを乗り越えて上達しよう

10. トラブルを乗り越えて上達しよう
10. トラブルを乗り越えて上達しよう

VB.NETのコレクション操作にはいくつかの落とし穴がありますが、そのほとんどが「数え間違い」「用意し忘れ」「ルール無視」によるものです。

今回紹介した3つの大きなエラー(範囲外、Null、ループ中の変更)を意識するだけで、あなたのプログラムの安定性は劇的に向上します。エラーが出ても焦らず、どこに原因があるのか一つずつチェックしてみてください。何度もエラーを直していくうちに、自然とエラーを出さない書き方が身についていきますよ!

カテゴリの一覧へ
新着記事
New1
ASP.NET
ASP.NETのクロスサイトスクリプティング(XSS)を完全解説!初心者でもわかる仕組みと対策
New2
VB.NET
VB.NETの文字列置換を完全解説!初心者でもわかるReplaceメソッドの使い方
New3
ASP.NET
ASP.NETのセキュリティ対策を完全ガイド!初心者でもわかるXSS・CSRF・SQLインジェクションの基本
New4
VB.NET
VB.NETで文字列を検索する方法をマスター!IndexOfとContainsの使い方を初心者向けに徹底解説
人気記事
No.1
Java&Spring記事人気No1
VB.NET
VB.NETのコレクション操作でよくあるエラーと解決策!初心者向けトラブル脱出ガイド
No.2
Java&Spring記事人気No2
VB.NET
VB.NETで文字列を連結する方法を完全ガイド!&演算子とString.Concatの使い方
No.3
Java&Spring記事人気No3
VB.NET
VB.NETの配列(Array)の作り方と基本操作を徹底解説!初心者でもわかる入門ガイド
No.4
Java&Spring記事人気No4
VB.NET
VB.NETの文字列操作を完全ガイド!初心者が覚えるべき基本と宣言方法
No.5
Java&Spring記事人気No5
VB.NET
VB.NETでコレクションをソートする方法を完全ガイド!並び替えの基本
No.6
Java&Spring記事人気No6
ASP.NET
ASP.NET MVCでセッションを使う方法を完全解説!初心者でもわかる状態管理入門
No.7
Java&Spring記事人気No7
ASP.NET
ASP.NETの認証の仕組みを完全解説!初心者でもわかるログインの基本
No.8
Java&Spring記事人気No8
ASP.NET
ASP.NETの認証と認可の違いを完全解説!初心者でもわかるOAuth・JWT・Azure ADの基本