質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

Q&A

解決済

4回答

22635閲覧

C#でのOverflowが直せない。

yukkuri_emilin

総合スコア8

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

Windows Forms

Windows Forms(WinForms)はMicrosoft .NET フレームワークに含まれる視覚的なアプリケーションのプログラミングインターフェイス(API)です。WinFormsは管理されているコードの既存のWindowsのAPIをラップすることで元のMicrosoft Windowsのインターフェイスのエレメントにアクセスすることができます。

0グッド

0クリップ

投稿2017/06/14 13:08

###前提・実現したいこと
C#のWindowsFormApplicationで簡単なゲームを作ろうとしているのですがOverflowが発生するのですが原因がわからないので教えてください。
try(){}catch(){}文も効かずにとても困っています。

###発生している問題・エラーメッセージ

System.StackOverflowException

###該当のソースコード

C#

1using System; 2using System.Collections.Generic; 3using System.ComponentModel; 4using System.Data; 5using System.Drawing; 6using System.Linq; 7using System.Text; 8using System.Threading.Tasks; 9using System.Windows.Forms; 10 11namespace WindowsForm音ゲー 12{ 13 public partial class Form1 : Form 14 { 15 string[] catchcode; 16 public string[] TextBOX1 17 { 18 get 19 { 20 string[] returna = catchcode; 21 listBox1.SelectedValue.ToString(); 22 return returna; 23 } 24 set 25 { 26 listBox1.SelectedValue.ToString(); 27 } 28 } 29 public string SelectTitle 30 { 31 get 32 { 33 return listBox1.SelectedValue.ToString(); 34 } 35 36 } 37 public Form1() 38 { 39 try 40 { 41 InitializeComponent(); 42 System.IO.DirectoryInfo di = new System.IO.DirectoryInfo(@"music/"); 43 System.IO.FileInfo[] files = di.GetFiles("*.csv", System.IO.SearchOption.AllDirectories); 44 int ib = 0; 45 while (true) 46 { 47 if (ib == files.Length) 48 { 49 break; 50 } 51 listBox1.Items.Add(System.IO.Path.GetFileNameWithoutExtension(files[ib].FullName)); 52 ib++; 53 } 54 } 55 catch (Exception e) { 56 MessageBox.Show("Error"+e); 57 } 58 } 59 60 private void Form1_Load(object sender, EventArgs e) 61 { 62 63 } 64 65 private void button1_Click(object sender, EventArgs e) 66 { 67 using (var sr = new System.IO.StreamReader("music/"+listBox1.SelectedItem + ".csv")) 68 { 69 while (!sr.EndOfStream) 70 { 71 var line = sr.ReadLine(); 72 catchcode = line.Split(','); 73 } 74 } 75 Form2 form2 = new Form2(); 76 form2.Show(); 77 } 78 79 } 80} 81

###試したこと
課題に対してアプローチしたことを記載してください

###補足情報(言語/FW/ツール等のバージョンなど)
より詳細な情報

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ebiryo

2017/06/14 23:49

どういった状況で発生するか(ボタンを押下した時、Window が表示される時etc)を書いていただくとより回答しやすいかと思います
selpo

2017/06/15 02:37

Form1はpartial classなので、自動生成されたファイルの方も貼っていただけると回答しやすいです。System.StackOverflowExceptionは主に関数呼び出しの階層が深すぎるために起きます。どこかで無限に再起している可能性があります。
yukkuri_emilin

2017/06/15 11:19

ボタンを押してForm2を表示させようとするときにエラーを起こしてしまいますね・・・
guest

回答4

0

StackOverflowExceptionはスタック領域が不足した場合に発生します。

大きなスタック変数を確保していたり、再帰呼び出しを行ったりすると容易に不足します。必ずしも例外が発生した場所が原因ではありませんので、スタックの呼び出し履歴を参考にコードを精査しながら原因となっている場所を探すことが必要です。

またプログラムのバグによりスタック領域のメモリを書き換えてしまった場合にも発生します。この場合はスタックの呼び出し履歴に表示されている内容も正しくないので、プログラム全体を精査する必要があります。C#のようなマネージド言語でスタック領域を壊す事は殆ど無いので、アンマネージドコードを記述している部分や、サードパーティーのライブラリの使用方法の誤りの可能性が高いです。

StackOverflowExceptionはその性質上、ソースコードの一部分だけを抜粋して提示しても原因を調べることが出来ません。StackOverflowExceptionが再現するビルド可能なサンプルコードを提示するか、あるいは全ソースコードを公開しないと、原因までは特定できないと思って下さい。

投稿2017/06/15 08:29

Kunihiro_Narita

総合スコア472

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

ベストアンサー

短いコードですのでまずはVisual Studioでステップ実行(F10)することで、どの行をでスタックオーバーフローがおきかたを質問者さん自身でしらべ、それを明記することをお勧めします。そうすれば考えられる原因についてヒントが得られるでしょう。

蛇足:
ところで、ごくたまにあるのですがエラーが発生した時点の正確なソースでないソースをうっかり張り付ける方がいらっしゃいます。そういうことをしてしまうと絶対に原因がわかりませんのでご注意ください。

(コードをみると実装の途中のようで、エラーかなにかの原因を調べようとしているようなコードが見受けられるので一応念のため・・・)

投稿2017/06/15 04:37

KSwordOfHaste

総合スコア18394

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

yukkuri_emilin

2017/06/15 11:21

言われた通りにステップ実行したらCsvファイルの読み込み部分でエラーを起こしていました。 的確な指示ありがとうございます!
guest

0

Form2の方で問題が起きている可能性が高いので、そちらを貼ってください。

また、System.StackOverflowExceptionは、一度起きると致命的で正常な動作に復帰することが困難なため、仕様上catchすることができません。
https://msdn.microsoft.com/ja-jp/library/system.stackoverflowexception(v=vs.110).aspx
一応、デバッグ実行して呼び出し履歴を見れば、どこで再帰呼出しがされているかは分かると思います。

関係ないですが、プロパティTextBOX1のsetが、値のセットを行っていないようです。おそらくsetは不要だと思います。

投稿2017/06/15 12:31

selpo

総合スコア41

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

回答にはなりませんが…
ソースをコピーし、適当にリストボックス、フォーム2、ボタン、CSVファイルを用意し実行してみたのですが私の環境では再現できませんでした。
やはり、ほかの方が言われているようにもう少し詳細な情報が必要だと考えます。
ソースを含め、一応CSVの形式とか、伝えられる情報をできるだけ多く提示していただきたいと思います。

投稿2017/06/15 10:41

suzu_cat

総合スコア81

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問