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

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

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

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

Q&A

解決済

2回答

758閲覧

コンパイルは成功したが、実行できない。(NullReferenceException)

KATANKUN

総合スコア4

C#

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

1グッド

1クリップ

投稿2022/10/06 22:51

下記のコードを作成したのですが、下のようなエラーが出てしまいました。どのようにコードを改善すれば実行できるようになるでしょうか。

コンパイル
csc test2.cs
実行
test2
エラー
ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。
場所 test2.Main()

C#

1コード 2using System.Windows.Forms; 3using System.Drawing; 4 5class test2 6{ 7 public static void Main() 8 { 9 Form fm=new Form(); 10 fm.Text="サンプル"; 11 fm.Width=600; fm.Width=300; 12 13 PictureBox[,] pb=new PictureBox[5,5]; 14 15 for(int i=0;i<5;i++) 16 { 17 for(int j=0;j<5;j++) 18 { 19 pb[i,j].Image=Image.FromFile("test2.bmp"); 20 pb[i,j].Top=i*pb[i,j].Height; 21 pb[i,j].Left=j*pb[i,j].Width; 22 pb[i,j].Parent=fm; 23 } 24 } 25 26 Application.Run(fm); 27 } 28}
takezoux2😍を押しています

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

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

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

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

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

退会済みユーザー

退会済みユーザー

2022/10/06 23:03

何を何で作っているか書きましょう。 (例: Visual Studio 2022 で Windows Forms アプリをターゲットフレームワーク .NET Framework 4.8 で作っています)
退会済みユーザー

退会済みユーザー

2022/10/07 22:12

質問者さん、無言ですが、回答したのでそれに対するフィードバックを返してください。役に立った/立たなかったぐらいはすぐに返せるのでは? 役に立たなかったならどこがダメかを書くとより期待に近い回答が出てくるかも。とにかく無言は NG です。
KATANKUN

2022/10/07 23:41

失礼いたしました。ご回答ありがとうございます。 SurferOnWwwさんのおっしゃる通り、どのような環境でコードを作成しているのかは非常に重要な情報です。書き忘れていたこと並びに謝罪いたします。 環境は以下の通りです。↓ vim version9.0でMicrosoft (R) Visual C# Compiler version 4.8.4161.0を使用しコンパイルしています。 回答の件ありがとうございます。参考になりました。確かにfor文内でインスタンスを生成しなければ三賞もできませんね。
退会済みユーザー

退会済みユーザー

2022/10/08 00:27

> vim version9.0でMicrosoft (R) Visual C# Compiler version 4.8.4161.0を使用しコンパイルしています。 質問欄を編集して追加情報として追記願います。このコメント欄はもともと質問の追記・修正を依頼する場で、初期画面では閉じていて見ない人もいますので。 このスレッドの課題は解決したようですので、解決に役に立った回答にベストアンサーをつけてクローズ願います。
KATANKUN

2022/10/08 02:44

了解足しました。ご親切に細部までご説明いただきありがとうございます。何分まだこちらのサイト利用した始めたばかりでして、あまり勝手がわかっていません。SurferOnWww様のおっしゃる通りにさせていただきたいと思います。
KATANKUN

2022/10/08 02:52

すいません。 質問欄を編集とクローズはどのように行えばいいでしょうか。
guest

回答2

0

ベストアンサー

配列の各要素が参照する PictureBox のインスタンスを生成してないからでしょう。

投稿2022/10/06 23:13

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

基礎からやりましょう

まずコードをざっと読むと、PictureBox[,] pb=new PictureBox[5,5];の直後のfor文でpb[i,j].Image=Image.FromFile("test2.bmp");と使っています。

このfor文内のpb[i,j].Image=Image.FromFile("test2.bmp");はどういう意味でしょうか。
『pbオブジェクト配列の[i,j] の位置にあるオブジェクトのImageプロパティに "test2.bmp"ファイルから読み込んだデータを設定する』みたいな感じですね。

では、このpb[i,j]にはどういうオブジェクトが入っていますか?
最初にnewしたオブジェクトはあくまでPictureBoxの配列を生成しているだけで、それぞれのオブジェクトはまだ生成されていません。
コップを数個並べただけで中身を注いでいない状態と一緒です。

そのため、[i,j]の位置にあるオブジェクトのImageプロパティを使おうとしてもそもそもオブジェクト自体がまだないので「おいおい兄ちゃん、オブジェクトがねーぞ?」と言っているわけです。

配列を使う場合は

1. 配列自体のオブジェクトを生成する (例: PictureBox[] ps = new PictureBox[2];) 2. 要素数分ループして以下の処理を行う 2.1. ps[i] = new PictureBox(); のようにして各オブジェクトを生成する

のような感じで行う。
もちろん(2)や(2.1)はループせずともできますが。

後、エラーメッセージも読みましょう

Error

1ハンドルされていない例外: System.NullReferenceException: オブジェクト参照がオブジェクト インスタンスに設定されていません。 2場所 test2.Main()

つまり、キャッチされていない例外が飛んできていて、その中身がSystem.NullReferenceExceptionなる例外です。
この例外は公式ドキュメントを読むと、

null オブジェクト参照を逆参照しようとした場合にスローされる例外。

とあります。つまり『オブジェクトを生成していないのに使おうとしていることが原因』だとわかる。
そして上に書いた基礎がわかっていればその周辺を探せばわかるはずです。

投稿2022/10/07 01:04

編集2022/10/07 01:08
BeatStar

総合スコア4958

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

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

KATANKUN

2022/10/08 02:50

細部に至るまで丁寧にご説明いただきありがとうございます。 参考にさせていただきます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問