throwとthrowsの意味と使い分けを初心者向けに解説【Java入門講座】5-3 throwとthrows

Поділитися
Вставка
  • Опубліковано 5 жов 2024

КОМЕНТАРІ • 28

  • @user-lc9so5ct3d
    @user-lc9so5ct3d Місяць тому +1

    強制=tryの中で正常だろうとどんな場合でもcatchさせるという意味かと勘違いしていましたw
    catch(オリジナル例外 e)書いても、そのオブジェクトがnewされていなければ受け取りようがないですもんね。

    • @SekaChan
      @SekaChan  Місяць тому +1

      そうですね。
      ここはややこしいのでプログラムの動きと合わせて理解しておきましょう!

  • @ほいほい-r7h
    @ほいほい-r7h Рік тому +4

    いつも分かりやすい授業をありがとうございます!
    授業動画の希望で、「try-with-resources」の解説して頂きたいです。
    よろしくお願いいたします。

    • @SekaChan
      @SekaChan  Рік тому +4

      ほいほいさん、コメントありがとうございました!
      try-with-resources文の授業動画ですね。
      もし同じようなリクエストが集まったら、動画化を検討してみようと思います😄

  • @おじん-g6f
    @おじん-g6f 2 роки тому +14

    分かりやすすぎて他に教えたくない、、、

    • @SekaChan
      @SekaChan  2 роки тому

      おじんさん、コメントありがとうございます!
      分かりやすかったようで良かったです。
      無料で勉強できる場が広がったら素敵だなと思うので、気が向いたら他の人にも教えてあげてください✨

  • @bladreyf705
    @bladreyf705 Рік тому +2

    大学ではここまでかみ砕いて教えてくれなかったので助かります🙇‍♂🙇‍♂

    • @SekaChan
      @SekaChan  Рік тому +1

      深浦さん、コメントありがとうございました!
      僕が大学でJavaを学んだときはかなりザックリと教えられたので、すごく苦しんだ記憶がありますね😅
      この動画が理解に役立ったみたいで良かったです!

  • @式神アスカラングレー
    @式神アスカラングレー 2 роки тому +16

    「例外を強制に発生させる場合」というのは、例えばどんな場合の時でしょうか。
    (※曖昧な質問ですみません)

    • @SekaChan
      @SekaChan  2 роки тому +19

      式神アスカラングレーさん、コメントありがとうございます!
      これは鋭くて良い質問ですね!
      また、僕の説明不足でもあるなぁと感じてます。すみません🙏
      throwの使いどころは、独自の例外を発生させるケースが多いですね。
      実は、オリジナルの例外クラスを作ることができます。
      (Exceptionクラスを継承するだけで例外クラスとして扱えます)
      例えばログインを失敗した場合の例外クラスとして、次のようなLoginFailureExceptionを作ったとしましょう。
      class LoginFailureException extends Exception { ‥‥ }
      そして、実際にログインを失敗したときに
      throw new LoginFailureException();
      として例外を発生させるイメージです。
      LoginFailureExceptionクラスにメンバ変数としてエラーメッセージを持たせれば、ユーザID・パスワードが未入力の場合や間違えている場合などで表示内容を変えることもできます。
      深い話もしてしまいましたが、何となく使いどころをイメージしてもらえてたら嬉しいです😄

    • @式神アスカラングレー
      @式神アスカラングレー 2 роки тому +7

      @@SekaChan
      ご回答ありがとうございます。イメージできました!

  • @ミルク-e3x
    @ミルク-e3x 2 роки тому +3

    たすかる😭

    • @SekaChan
      @SekaChan  2 роки тому

      米村美咲さん、コメントありがとうございました!
      もし動画が役立ったのならとても嬉しいです😄

  • @mickey2761
    @mickey2761 11 місяців тому +3

    いつも動画ありがとうございます。質問です。
    1:20あたりでご説明されている。「パターン1」について、
    throw new IOException();
    と記載されている部分では、「e」というインスタンスを作成していないのにもかかわらず、
    catch(IOException e)
    の部分でいきなり使えるのはなぜなのでしょうか。「省略形だから」という説明で納得できないこともないですが、
    どこかでインスタンスが作成されているのでしょうか。

    • @SekaChan
      @SekaChan  11 місяців тому +4

      Mickeyさん、コメントありがとうございました。
      3:51あたりからの解説の通り、その記述は元々
      > IOException e = new IOException(); ‥ ①
      > throw e;
      を省略したものですね。
      ①において、右辺でnewしたタイミングでメモリ上にIOExceptionのインスタンスが生成されます。
      そのインスタンスへの参照値をいったん変数eに代入してそれをthrowできるし、変数eを使わずにnewしてそのままthrowすることもできるイメージですね。

  • @ryansteve917
    @ryansteve917 Рік тому +2

    パターン1でtry文の中にthrow new IO ExeptionしてさらにcatchでIOExeptionしてると、重複してる見え方になるのですが、わざわざパターン1でtry catch文は必要なのでしょうか?

    • @SekaChan
      @SekaChan  Рік тому +1

      コメントありがとうございました。
      結論からいっちゃうと、パターン1のtry-catch文は必要ですね。
      IOExceptionが発生するプログラムは、どこかでcatch文を書かないとコンパイルエラーになるためです。
      throw(投げる)とcatch(受け取る)は重複してるようにも見えますが、throwは例外オブジェクトを生成する記述でcatchは例外オブジェクトを受け取る記述なので、実は相互に対応してる記述といえます。

  • @たける-z2t
    @たける-z2t Рік тому +3

    例外を強制的に発生させる場合に関連した質問なのですが、独自の例外クラスを作成する際にthrowを使うと仰っていますが、例外オブジェクトをnewで発生させるのは元々Javaにその例外オブジェクトがないからですか?ArrayLndexOutOfBoundsExceptionやNullPointExceptionなどはJavaが例外オブジェクトを持っているからわざわざnew する必要がないということで合っていますか?

    • @SekaChan
      @SekaChan  Рік тому +1

      たけるさん、コメントありがとうございました!
      「元々その例外オブジェクトがないから」というよりは、「自動で例外オブジェクトが生成されないから」という表現の方が近いですね😄
      例えばArrayIndexOutOfBoundsExceptionが発生したときは、Javaの実行環境がArrayIndex~Exceptionのオブジェクトをnewして生成しthrowしてくれています。
      それを自分でやる必要があるイメージですね。

    • @たける-z2t
      @たける-z2t Рік тому

      @@SekaChan ありがとうございます!Javaが自動で生成してくれてたんですね! あと、throwで新たに例外オブジェクトを生成する際にそのコードが含まれたメソッドにthrowsが使われているのですが、これはセットで使われるものなのでしょうか?それともthrowsを使わずに自分で例外処理をする時は必要ないのでしょうか?

  • @icantspeakenglish10
    @icantspeakenglish10 Рік тому +2

    学習スピード落ちてきてしまった

  • @ミルク-e3x
    @ミルク-e3x 2 роки тому +4

    でもやっぱり何回みても分からんかった(>

    • @SekaChan
      @SekaChan  2 роки тому +1

      米村美咲さん、コメントありがとうございました!
      何回見ても分からなかったようで、動画の作り手として力不足を感じてます💦
      (でも正直に書いてくれてありがとうございます!)
      動画の内容に関することであれば、コメント欄で質問を受け付けてますよ👍
      5-2までの動画も参考にしてもらいつつ、分からないことがあれば聞いてくださいね。
      (↑概要欄にリンクがあります)

  • @takeshi2533
    @takeshi2533 2 роки тому +4

    コンパイルエラーが発生してしまうのですが、自分ではどこが違うのかわかりません、、
    エラー文
    ────────────────────────────────────────────────
    Exception in thread "main" java.lang.Error: Unresolved compilation problem:
    IOException の到達不可能な catch ブロック。この例外は、try ステートメント本文からはスローされません
    at lesson5_3.ThrowsMethod.main(ThrowsMethod.java:12)
    ────────────────────────────────────────────────
    ────────────────────────────────────────────────
    import java.io.IOException;
    public class WriteFile {
    public void open() {
    System.out.println("ファイルを開きます");
    }
    public void write() throws IOException {
    throw new IOException();
    }
    public void close() {
    System.out.println("ファイルを保存して閉じます");
    }
    }
    ────────────────────────────────────────────────
    ────────────────────────────────────────────────
    import java.io.IOException;
    public class ThrowsMethod {
    public static void main(String[] args) {
    WriteFile wf = new WriteFile();

    try {
    wf.open();
    wf.close();
    }catch(IOException e){
    System.out.println("IOExceptionが発生しました。");
    e.printStackTrace();
    } catch (Exception e) {
    System.out.println("Exceptionが発生しました。");
    e.printStackTrace();
    } finally {
    wf.close();
    }
    }
    }
    ───────────────────────────────────────────────────
    回答していただけたら、幸いです!

    • @SekaChan
      @SekaChan  2 роки тому +3

      Takeshiさん、コメントありがとうございました。
      これはエラーメッセージの通り、ThrowsMethodクラス内にあるIOExceptionのcatchブロックに到達することがない、ということですね。
      つまり、
      ①tryブロック内でIOExceptionを発生する可能性のあるメソッドを書き忘れていませんか?
      ②catchブロックで指定する例外はIOExceptionで合っていますか?
      と聞いてくれているエラーです😄
      これを踏まえてプログラムを見てみると、tryブロック内の wf.close() は wf.write() かなと思います。
      こうやって自分でプログラムを作って動かしてみるのは、エラーの見方や新しい気づきも得られてとても良いと思います!
      ぜひこのような勉強を続けていってください!

    • @takeshi2533
      @takeshi2533 2 роки тому +2

      @@SekaChan
      ご返信ありがとうございます。
      ご指摘の箇所を訂正したら、コンパイル通りました!
      菅原さんの動画のおかげですごく楽しく学習できているので、これからも動画参考にさせていただきます!