C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: Splitで分割した文字列が追加できない


(過去ログ 126 を表示中)

[トピック内 7 記事 (1 - 7 表示)]  << 0 >>

■74840 / inTopicNo.1)  Splitで分割した文字列が追加できない
  
□投稿者/ ぽちょ (1回)-(2015/02/01(Sun) 12:14:25)

分類:[C#] 

ある文字列をSplitで分割し、別の文字列に追加しようとするとエラーとなってしまいます。

aaa = bbb.Groups[ "ccc" ].Value.Split(',');
ddd += aaa[1];

[エラー]
型 'System.IndexOutOfRangeException' のハンドルされていない例外が xxx.exe で発生しました

追加情報: インデックスが配列の境界外です。

aaa[1]をMessageBox.Showで表示すると正常に表示されますので、分割に失敗しているわけではなさそうなんですが、文字列を追加しようとするとエラーとなります。

よろしくお願い致します。

引用返信 編集キー/
■74841 / inTopicNo.2)  Re[1]: Splitで分割した文字列が追加できない
□投稿者/ WebSurfer (490回)-(2015/02/01(Sun) 12:21:22)
No74840 (ぽちょ さん) に返信

> aaa = bbb.Groups[ "ccc" ].Value.Split(',');

Split メソッドの引数が違うのでは?

String.Split メソッド (Char[])
https://msdn.microsoft.com/ja-jp/library/b873y76a(v=vs.110).aspx


#bbb.Groups[ "ccc" ].Value で何が取得できるのか分かりません。質問する際は
 その程度の情報は書きましょう。(上記は、String 型のオブジェクトだろう想
 像して上記を書きました)
引用返信 編集キー/
■74842 / inTopicNo.3)  Re[1]: Splitで分割した文字列が追加できない
□投稿者/ Azulean (430回)-(2015/02/01(Sun) 12:32:25)
2015/02/01(Sun) 12:36:38 編集(投稿者)

No74840 (ぽちょ さん) に返信
> aaa = bbb.Groups[ "ccc" ].Value.Split(',');
> ddd += aaa[1];

ddd って何者でしょうか?
IndexOutOfRangeException の呼び出し履歴(StackTrace)は String 型のどこかを指し示していますか?
デバッグ中に止まる行は ddd += aaa[1]; の行でしょうか?

ところで、Groups[] が出てくることから、Regex クラスを使って、Match クラスのオブジェクトを取得しているとみなしています。

https://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.match.groups
https://msdn.microsoft.com/ja-jp/library/hchbwda2
https://msdn.microsoft.com/ja-jp/library/system.text.regularexpressions.group


No74841 (WebSurfer さん) に返信
> Split メソッドの引数が違うのでは?
>
> String.Split メソッド (Char[])
> https://msdn.microsoft.com/ja-jp/library/b873y76a(v=vs.110).aspx

合っています。
params キーワードがついているので 1 個で渡そうと、複数で渡そうと、コンパイラが勝手に配列に置き換えます。

Split('a') → コンパイラが Split(new char[] {'a'}) とみなす。
Split('a', 'b', 'c') → コンパイラが Split(new char[] {'a', 'b', 'c'}) とみなす。
引用返信 編集キー/
■74843 / inTopicNo.4)  Re[2]: Splitで分割した文字列が追加できない
□投稿者/ ぽちょ (2回)-(2015/02/01(Sun) 12:57:31)
Azuleanさん

>ddd って何者でしょうか?

aaa[1]を結合したい別の文字列です。


>IndexOutOfRangeException の呼び出し履歴(StackTrace)は String 型のどこかを指し示していますか?
>デバッグ中に止まる行は ddd += aaa[1]; の行でしょうか?

止まるのは ddd += aaa[1]; です。

splitで分割した文字列を通常の文字列に追加しようとしているだけなんですが・・・
なんでこんな事に成るんでしょうか?(^^;)
引用返信 編集キー/
■74846 / inTopicNo.5)  Re[3]: Splitで分割した文字列が追加できない
□投稿者/ Azulean (431回)-(2015/02/01(Sun) 14:14:51)
No74843 (ぽちょ さん) に返信
> splitで分割した文字列を通常の文字列に追加しようとしているだけなんですが・・・
> なんでこんな事に成るんでしょうか?(^^;)

正直、周辺コードがない、環境に関する情報がない現状で原因を推測することは難しいです。
aaa.Length が 2 以上にならない条件、状況があるのでは?

MessageBox.Show で aaa[1] を表示して成功するとき、ddd += aaa[1]; が問題なく通過するのであれば、
タイミング・状況依存、あるいはビルドされている or 実行されているバイナリが想定と違う可能性ぐらいしか今の時点では示せません。

なお、手元で以下のようなコードを書く限り、Windows 8.1 Update (x64) + VS2013Update4 + .NET 4.5.2 環境では問題なく動きます。

static void Main(string[] args)
{
    string targetText = "1,22,333";
    string ddd = "sampletext=";

    Regex regex = new Regex("^(?<ccc>.+)$");
    Match bbb = regex.Match(targetText);
    string[] aaa = bbb.Groups["ccc"].Value.Split(',');
    ddd += aaa[1];

    Console.WriteLine(ddd);
}

引用返信 編集キー/
■74847 / inTopicNo.6)  Re[2]: Splitで分割した文字列が追加できない
□投稿者/ WebSurfer (491回)-(2015/02/01(Sun) 15:56:42)
No74842 (Azulean さん) に返信

> 合っています。
> params キーワードがついているので 1 個で渡そうと、複数で渡そうと、コンパイラが勝手に配列に置き換えます。

> params キーワードがついているので 1 個で渡そうと、複数で渡そうと、コンパイラが勝手に配列に置き換えます。

その通りですね。失礼しました。


No74843 (ぽちょ さん) に返信

> 止まるのは ddd += aaa[1]; です。

ddd += aaa[1]; の行にブレークポイントを置いてデバッグ実行し、配列 aaa の数を見た時(ブ
レークポイントで止まったらマウスのカーソルを aaa に持っていくなどすると表示されます)、
期待通り aaa[1] は存在するのでしょうか?

"System.IndexOutOfRangeException インデックスが配列の境界外です。" という例外を出すには、
たとえば Azulean さんの提示されたサンプルコードでは targetText が "1,22,333" ではなくて
"1" としたような場合(aaa[0] しか存在しない)なのですが・・・

引用返信 編集キー/
■74848 / inTopicNo.7)  Re[3]: Splitで分割した文字列が追加できない
□投稿者/ ぽちょ (3回)-(2015/02/01(Sun) 18:33:24)
Azuleanさん
WebSurfer さん

仰る通りチェックした部分は全部aaa[1]がたまたま存在していたのですが、ループする中で存在しない場合があり、そこでエラーが起こっておりました。

おかげ様で問題は解決しました。
ありがとうございました。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -