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

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

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

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

Q&A

解決済

4回答

5051閲覧

自分で例外を投げる

wakataku1318

総合スコア19

Java

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

0グッド

0クリップ

投稿2017/01/06 04:38

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

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

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

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

java

1/** 2*番号と名前を扱うMemberクラス 3*/ 4class Member{ 5 private int id; 6 private String name; 7 8 9 public Member(int id , String name){ 10 if(id >= 100 && id <= 999){ 11 this.id = id; 12 }else if(id < 100 && id > 999){ 13 throw new MyException("IDが正しくない"); 14 } 15 this.name = name; 16 } 17 18 public void who(){ 19 System.out.println(id + ":" + name); 20 } 21} 22 23 24 25/** 26*idの値の範囲を設定して例外を投げるKadai66クラス 27*/ 28public class Kadai66{ 29 public static void main(String args[]){ 30 int id; 31 String name; 32 33 id = 200; 34 name = "太郎"; 35 Member m1 = new Member(id,name); 36 m1.who(); 37 38 try{ 39 id = 98; 40 name = "二郎"; 41 Member m2 = new Member(id,name); 42 m2.who(); 43 } 44 catch(MyException e){ 45 System.err.println("IDが正しくありません."); 46 } 47 } 48} 49

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

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

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

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

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

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

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

guest

回答4

0

ベストアンサー

ソースコード

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

java

1// <変更:MyExceptionクラスを追加しました> 2class MyException extends Exception{ 3 public MyException(String msg){ 4 super(msg); 5 } 6} 7 8/** 9*番号と名前を扱うMemberクラス 10*/ 11class Member{ 12 private int id; 13 private String name; 14 15 16 public Member(int id , String name) throws MyException { // <変更:throwsを追加しました> 17 if(id >= 100 && id <= 999){ 18 this.id = id; 19 } else { // <変更:ifを削除しました> 20 throw new MyException("IDが正しくない"); 21 } 22 this.name = name; 23 } 24 25 public void who(){ 26 System.out.println(id + ":" + name); 27 } 28} 29 30 31 32/** 33*idの値の範囲を設定して例外を投げるKadai66クラス 34*/ 35public class Kadai66{ 36 public static void main(String args[]){ 37 int id; 38 String name; 39 40 41 42 try{ 43 // <変更:移動しました> 44 id = 200; 45 name = "太郎"; 46 Member m1 = new Member(id,name); 47 m1.who(); 48 49 50 id = 98; 51 name = "二郎"; 52 Member m2 = new Member(id,name); 53 m2.who(); 54 } catch(MyException e){ 55 System.err.println("IDが正しくありません."); 56 } 57 } 58} 59

実行結果

sh

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

変更点

  • 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 04:48

編集2017/01/06 04:54
grovion

総合スコア145

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

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

KiyoshiMotoki

2017/01/06 04:54

横から失礼します。  // <変更:移動しました> 部分は、何のための修正でしょうか? 「最低限、意図通りに動くようにする」 という意味では 修正してもしなくても良いように思えたため、気になりました。
grovion

2017/01/06 04:57 編集

最低限は、`Member m1 = new Member(id,name);`を`try`の中に移動させないと、コンパイルが通りません。理由は`Member`コンストラクタが`throws MyException`するからです。 id = 200; name = "太郎"; は`try`の外でもいいのですが、あとはソースコードの見た目の問題です。
KiyoshiMotoki

2017/01/06 05:07

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

2017/01/06 05:09 編集

追記: >> MyException は RuntimeException ではなく Exception を拡張しているため、 >> 仰る通り "new Member(id,name)" 部分は try 句の中に移動する必要がありますね。 下のコメントは釈迦に説法でした。すみません >> 横から失礼します。 質問者さんじゃなかったのですね。 もう少し、雑談をします。移動なしでコードを書く方法についてです。 その際は`MyException`を変更し、 `class MyException extends RuntimeException{` というふうに`RuntimeException`を継承させます。 Javaの正解では、`RuntimeException`を継承させた例外クラスは`try`で囲まなくてもよくなります。「非チェック例外」と呼ばれています。 この非チェック例外(RuntimeException)の実用的な使われ方は、`java.lang.NullPointerException`などです。`NullPointerException`はいつも起こりうるので、いちいち`try`を書いてられません。ですので、非チェック例外というのが存在しているのだと思います。
wakataku1318

2017/01/06 05:09

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

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) の && を || に修正し、

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

とするか、

Java

1 2// for "Taro" 3try{ 4 id = 200; 5 name = "太郎"; 6 Member m1 = new Member(id,name); 7 m1.who(); 8}catch( MyException e ){ 9 10} 11 12// for "Jiro" 13try{ 14 id = 98; 15 name = "二郎"; 16 Member m1 = new Member(id,name); 17 m1.who(); 18}catch( MyException e ){ 19 20}

のように個別でやるか。

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

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

投稿2017/01/06 04:58

BeatStar

総合スコア4958

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

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

wakataku1318

2017/01/06 05:11

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

0

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

投稿2017/01/06 04:53

yona

総合スコア18155

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

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

0

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

java

1class Member{ 2 private int id; 3 private String name; 4 5 6 public Member(int id , String name) throws Exception{ 7 if(id >= 100 && id <= 999){ 8 this.id = id; 9 }else if(id < 100 || id > 999){ 10 throw new Exception("IDが正しくない"); 11 } 12 this.name = name; 13 } 14 15 public void who(){ 16 System.out.println(id + ":" + name); 17 } 18} 19 20 21 22/** 23*idの値の範囲を設定して例外を投げるKadai66クラス 24*/ 25public class KON{ 26 public static void main(String args[]){ 27 int id; 28 String name; 29 30 id = 200; 31 name = "太郎"; 32 33 34 try{ 35 Member m1 = new Member(id,name); 36 m1.who(); 37 id = 98; 38 name = "二郎"; 39 Member m2 = new Member(id,name); 40 m2.who(); 41 } 42 catch(Exception e){ 43 System.err.println("IDが正しくありません."); 44 } 45 } 46}

投稿2017/01/06 04:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問