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

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

ログ内検索
  • キーワードを複数指定する場合は 半角スペース で区切ってください。
  • 検索条件は、(AND)=[A かつ B] (OR)=[A または B] となっています。
  • [返信]をクリックすると返信ページへ移動します。
キーワード/ 検索条件 /
検索範囲/ 強調表示/ ON (自動リンクOFF)
結果表示件数/ 記事No検索/ ON
大文字と小文字を区別する

No.98259 の関連記事表示

<< 0 >>
■98259  Re[1]: C#の例外処理
□投稿者/ 魔界の仮面弁士 -(2021/10/25(Mon) 13:19:26)
    No98257 (Megumi さん) に返信
    > 以下のコードではフォームに貼り付けた Pb(PictureBox)に画像が読み込まれていないと例外が発生します。

    NullReferenceException は例外処理で拾って処理するものでは無く、
    開発者側で「そもそも発生させないように気を配る」類の代物なので、
    この場合は「Pb に画像が読み込まれているかどうか」を調べるべきかと思います。


     Bitmap canvas = new Bitmap(Pb.Width, Pb.Height);
     Pb.Image = canvas;
     Image img = Pb.Image;
     if (img != null) // 画像が読み込まれているか?
     {
      using (img)
      using (Graphics g = Graphics.FromImage(canvas))
      {
       g.TranslateTransform(120, 0);//ワールド変換行列を右に平行移動する
       g.DrawImage(img, new Rectangle(0, 0, img.Width, img.Height));
      }
     }


    > finally
    > {
    >  g.Dispose();  //これは OK なのに
    >  img.Dispose(); //現在のコンテキストに img という名前は存在しないコンパイルエラーが出る!
    >  Pb.Image = canvas;
    > }

    んんん……!? 『img という名前は存在しない』というエラーではなく、
    『未割り当てのローカル変数 'img' が使用されました。』ではありませんでしたか?

    g 変数の方は、代入行為が try 句の外で行われているので、
    g.Dispose() に到達した時点では、g が初期化済みであることが明確です。

    一方で img 変数は、try 句の「img = Pb.Image;」という代入行為が失敗していた場合において、
    変数の中身が、null さえもセットされていない状態ということになります。
    そのようなオブジェクトを操作することは許可されないため、未割当を示す CS0165 エラーになるはず。
記事No.98257 のレス /過去ログ170より / 関連記事表示
削除チェック/



<< 0 >>

パスワード/

- Child Tree -