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

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

ただいまの
回答率

90.85%

  • Java

    12480questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

自分で例外を投げる

解決済

回答 4

投稿

  • 評価
  • クリップ 0
  • VIEW 545

wakataku1318

score 11

前提・実現したいこと

javaの例外処理についてです。
自分で例外を投げる方法が分かりません。
この問題ではidに100未満または999より大きい数字が入った場合に例外を投げるという処理を行いたいです。
その後、Kadai66クラスをtry-catchを例外処理するようにしたいです。

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

自分で例外を投げる方法がわかりません。

該当のソースコード

/**
*番号と名前を扱うMemberクラス
*/
class Member{
    private int id;
    private String name;


    public Member(int id , String name){
        if(id >= 100 && id <= 999){
            this.id = id;
        }else if(id < 100 && id > 999){
            throw new MyException("IDが正しくない");
        }   
        this.name = name;
    }

    public void who(){
        System.out.println(id + ":" + name);
    }
}



/**
*idの値の範囲を設定して例外を投げるKadai66クラス
*/
public class Kadai66{
    public static void main(String args[]){
        int id;
        String name;

        id = 200;
        name = "太郎";
        Member m1 = new Member(id,name);
        m1.who();

        try{
            id = 98;
            name = "二郎";
            Member m2 = new Member(id,name);
            m2.who();
        }
        catch(MyException e){
            System.err.println("IDが正しくありません.");
        }
    }
}

試したこと

Memberクラスのコンストラクタにて、idに代入する値が100未満または999より大きい場合に例外を投げる処理を書いてみました。

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

javaです。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

checkベストアンサー

+1

 ソースコード

変更箇所にはコメントいれました。

// <変更:MyExceptionクラスを追加しました>
class MyException extends Exception{
  public MyException(String msg){
    super(msg);
  }
}

/**
*番号と名前を扱うMemberクラス
*/
class Member{
    private int id;
    private String name;


    public Member(int id , String name) throws MyException { // <変更:throwsを追加しました>
        if(id >= 100 && id <= 999){
            this.id = id;
        } else { // <変更:ifを削除しました>
            throw new MyException("IDが正しくない");
        }
        this.name = name;
    }

    public void who(){
        System.out.println(id + ":" + name);
    }
}



/**
*idの値の範囲を設定して例外を投げるKadai66クラス
*/
public class Kadai66{
    public static void main(String args[]){
        int id;
        String name;



        try{
          // <変更:移動しました>
          id = 200;
          name = "太郎";
          Member m1 = new Member(id,name);
          m1.who();


          id = 98;
          name = "二郎";
          Member m2 = new Member(id,name);
          m2.who();
        } catch(MyException e){
            System.err.println("IDが正しくありません.");
        }
    }
}

 実行結果

$ javac Kadai66.java && java Kadai66
200:太郎
IDが正しくありません.

 変更点

  • MyExceptionクラスの作成
  • Memberのコンストラクタにthrowsを追加しMyExceptionを投げることを宣言
  • 論理的に問題があると思われるif文を削除
  • new Member()を使うものはMyExceptionを投げる可能性があるので、try節に移動した

 補足

「論理的に問題があると思われるif文」とは if(id < 100 && id > 999)のことです。

「100よりも小さく、999より大きい数」多分ないです。
多分したいことは「100よりも小さい、または、999より大きい数」だと思うので、
if(id < 100 || id > 999)です。ですが、else文で問題がないと思われるので削除しました。

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 13:54

    横から失礼します。

     // <変更:移動しました>
    部分は、何のための修正でしょうか?

    「最低限、意図通りに動くようにする」
    という意味では 修正してもしなくても良いように思えたため、気になりました。

    キャンセル

  • 2017/01/06 13:57 編集

    最低限は、`Member m1 = new Member(id,name);`を`try`の中に移動させないと、コンパイルが通りません。理由は`Member`コンストラクタが`throws MyException`するからです。


    id = 200;
    name = "太郎";

    は`try`の外でもいいのですが、あとはソースコードの見た目の問題です。

    キャンセル

  • 2017/01/06 14:07

    失礼しました。

    MyException は RuntimeException ではなく Exception を拡張しているため、
    仰る通り "new Member(id,name)" 部分は try 句の中に移動する必要がありますね。

    キャンセル

  • 2017/01/06 14:09 編集

    追記:
    >> MyException は RuntimeException ではなく Exception を拡張しているため、
    >> 仰る通り "new Member(id,name)" 部分は try 句の中に移動する必要がありますね。

    下のコメントは釈迦に説法でした。すみません


    >> 横から失礼します。
    質問者さんじゃなかったのですね。

    もう少し、雑談をします。移動なしでコードを書く方法についてです。
    その際は`MyException`を変更し、

    `class MyException extends RuntimeException{`

    というふうに`RuntimeException`を継承させます。

    Javaの正解では、`RuntimeException`を継承させた例外クラスは`try`で囲まなくてもよくなります。「非チェック例外」と呼ばれています。

    この非チェック例外(RuntimeException)の実用的な使われ方は、`java.lang.NullPointerException`などです。`NullPointerException`はいつも起こりうるので、いちいち`try`を書いてられません。ですので、非チェック例外というのが存在しているのだと思います。

    キャンセル

  • 2017/01/06 14:09

    わかりやすい回答ありがとうございます。
    自分で例外を投げる場合は、自分でクラスを作ることでできることがよくわかりました。
    その他の指摘についても自分の知識の浅さがよく感じられました。
    ありがとうございました。

    キャンセル

0

以下で、自分で例外を投げる事はできるように思えます。

class Member{
    private int id;
    private String name;


    public Member(int id , String name) throws Exception{
        if(id >= 100 && id <= 999){
            this.id = id;
        }else if(id < 100 || id > 999){
            throw new Exception("IDが正しくない");
        }   
        this.name = name;
    }

    public void who(){
        System.out.println(id + ":" + name);
    }
}



/**
*idの値の範囲を設定して例外を投げるKadai66クラス
*/
public class KON{
    public static void main(String args[]){
        int id;
        String name;

        id = 200;
        name = "太郎";


        try{
        Member m1 = new Member(id,name);
        m1.who();
            id = 98;
            name = "二郎";
            Member m2 = new Member(id,name);
            m2.who();
        }
        catch(Exception e){
            System.err.println("IDが正しくありません.");
        }
    }
}

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

学校の課題なら自分で解くべきです、人に答えを教えてもらっては意味がないですよ。
また、参考書等にも書いてある内容です。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

"または" は && じゃないですよ?

"||" です。

else if(id < 100 && id > 999)
の方を

else if(id < 100 || id > 999)

にする。

なぜって?

Truth-table から考えて、

どちらかを満たす場合発動するので、
tf か ft の場合 を true としたいのですから、

tt -> t
tf -> t
ft -> t
ff -> f

となるのは and か or なら "or" になるので、

|| を使います。

例外そのものは投げられています。

たぶん、ちゃんとした動きじゃないのは、

  1. 例外を投げる条件の文 else if(id < 100 && id > 999) が And ではなく Or になっていること
  2. 例外を処理する側 ( mainメソッド ) で、"太郎"さん用のものがtry...catch に入っていないこと

では?

なので、else if(id < 100 && id > 999) の && を || に修正し、

例外処理区域に "太郎"さん用のオブジェクトを...

とするか、

// for "Taro" 
try{
     id = 200;
     name = "太郎";
     Member m1 = new Member(id,name);
     m1.who();
}catch( MyException e ){

}

// for "Jiro"
try{
     id = 98;
     name = "二郎";
     Member m1 = new Member(id,name);
     m1.who();
}catch( MyException e ){

}

のように個別でやるか。

あと、MyExceptionってありますが、定義されていますよね?

存在しないクラスを使おうとしても無理ですから。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2017/01/06 14:11

    回答ありがとうございます。
    初歩的なミスをしていました・・・。
    ご指摘感謝致します。

    キャンセル

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

  • ただいまの回答率 90.85%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

関連した質問

同じタグがついた質問を見る

  • Java

    12480questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。