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

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

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

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

Q&A

解決済

2回答

715閲覧

Java 例外処理について

potohuji-0517

総合スコア2

Java

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

0グッド

1クリップ

投稿2022/05/16 01:09

JavaでRPGゲームのプログラムを作っています。コマンドに表示されている数字以外の文字列を入力したときのエラーに対処する例外処理をしたいのですが、try,catchを書いてもtryを受け取るcatchがないとエラーメッセージが出てしまいます。
コードが長くなってしまいどこに入れたらいいかわかりません。ご回答お願い致します。

Main.java

1import java.io.BufferedReader; 2import java.io.IOException; 3import java.io.InputStreamReader; 4import java.util.Random; 5import java.util.Scanner; 6 7public class Main { 8 9 public static void main(String[] args) throws IOException { 10 11 //キャラクターの体力 12 Character Braver = new Character(550, "勇者"); 13 Character Enemy = new Character(9999, "魔王"); 14 15 System.out.println("魔王があらわれた!"); 16 17 boolean fin = false; //終了フラグ 18 19 //行動コマンド 20 Command:while (!fin) { 21 for (int i = 0; i < 1; i++) { 22 23 System.out.println(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる"); 24 25 //キーボード入力値を取得 26 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 27 int num = Integer.parseInt(br.readLine()); 28 29 //行動の分岐 30 switch (num) { 31 case 1: 32 33 System.out.println("勇者のこうげき!"); 34 System.out.println("ミス!ダメージをあたえることができない!"); 35 System.out.println(" "); 36 37 //Trueである限り攻撃し続ける 38 if (Enemy.getHP() <= 0) { 39 fin = true; 40 } 41 break; 42 43 case 2: 44 45 //特技のコマンド 46 System.out.println("1:メラミ 2:ホイミ 3:はやぶさ斬り 4:ぱふぱふ 5:もどる"); 47 int num1 = Integer.parseInt(br.readLine()); 48 49 switch (num1) { 50 case 1: 51 System.out.println(Braver.getName() + "はメラミをとなえた!"); 52 System.out.println(Enemy.getName() + "に78のダメージ!"); 53 System.out.println(" "); 54 55 Enemy.setHP((Enemy.getHP() - 20)); 56 if (Enemy.getHP() <= 0) { 57 fin = true; 58 } 59 break; 60 61 case 2: 62 System.out.println(Braver.getName() + "はホイミをとなえた!"); 63 System.out.println(Braver.getName() + "のHPが32回復した!"); 64 System.out.println(" "); 65 66 Braver.setHP((Braver.getHP() + 32)); 67 if (Enemy.getHP() <= 0) { 68 fin = true; 69 } 70 break; 71 72 case 3: 73 System.out.println(Braver.getName() + "のはやぶさのごとき高速の2回こうげき!"); 74 System.out.println(Enemy.getName() + "に合計56のダメージ!"); 75 System.out.println(" "); 76 77 Enemy.setHP((Enemy.getHP() - 56)); 78 if (Enemy.getHP() <= 0) { 79 fin = true; 80 } 81 break; 82 83 case 4: 84 System.out.println(Braver.getName() + "は" + Enemy.getName() + "にぱふぱふしてあげた!"); 85 System.out.println(Enemy.getName() + "は冷ややかな視線でこちらを見ている..."); 86 System.out.println(" "); 87 88 Enemy.setHP(Enemy.getHP()); 89 if (Enemy.getHP() <= 0) { 90 fin = true; 91 } 92 break; 93 94 //一つ前に戻るコマンド 95 case 5: 96 continue Command; 97 98 } 99 continue; 100 101 case 3: 102 103 //道具のコマンド 104 System.out.println("1:やくそう 2:うまのふん 3:てんばつの杖 4:もどる"); 105 int num2 = Integer.parseInt(br.readLine()); 106 107 switch (num2) { 108 case 1: 109 110 System.out.println(Braver.getName() + "はやくそうをつかった!"); 111 System.out.println(Braver.getName() + "のHPが30回復した!"); 112 System.out.println(" "); 113 114 Braver.setHP((Braver.getHP() + 30)); 115 if (Enemy.getHP() <= 0) { 116 fin = true; 117 } 118 break; 119 120 case 2: 121 122 System.out.println(Braver.getName() + "はうまのふんをつかった!"); 123 System.out.println("しかしなにも起こらなかった。"); 124 System.out.println(" "); 125 126 Enemy.setHP(Enemy.getHP()); 127 if (Enemy.getHP() <= 0) { 128 fin = true; 129 } 130 break; 131 132 case 3: 133 134 System.out.println(Braver.getName() + "はてんばつの杖をふりかざした!"); 135 System.out.println("あたりにはげしい旋風が巻き起こる!魔王に45ダメージ!"); 136 System.out.println(" "); 137 138 Enemy.setHP((Enemy.getHP() - 45)); 139 if (Enemy.getHP() <= 0) { 140 fin = true; 141 } 142 break; 143 144 case 4: 145 //一つ前に戻るコマンド 146 continue Command; 147 148 } 149 continue; 150 151 case 4: 152 //逃げるコマンド 153 System.out.println("勇者はにげだした!"); 154 System.out.println("しかしまわりこまれてしまった!"); 155 System.out.println(" "); 156 } 157 break; 158 } 159 160 if (!fin) { 161 for(int j = 0; j < 1; j++){ 162 163 //値をランダムに取得し、対応した行動を表示する 164 Random rand = new Random(); 165 int val = rand.nextInt(5); 166 167 switch (val) { 168 case 0: 169 System.out.println(Enemy.getName() + "のこうげき!"); 170 System.out.println(Braver.getName() + "に51のダメージ!"); 171 System.out.println(" "); 172 173 Braver.setHP((Braver.getHP() - 50)); 174 nowHp(Braver,Enemy); 175 break; 176 177 case 1: 178 System.out.println(Enemy.getName() + "のゆびからいてつくはどうがほとばしる!"); 179 System.out.println(Braver.getName() + "にかかっているすべてのじゅもんのききめがなくなった!"); 180 System.out.println(" "); 181 182 nowHp(Braver,Enemy); 183 break; 184 185 case 2: 186 System.out.println(Enemy.getName() + "はイオナズンをとなえた!"); 187 System.out.println(Braver.getName() + "に118のダメージ!"); 188 System.out.println(" "); 189 190 Braver.setHP((Braver.getHP() - 120)); 191 nowHp(Braver,Enemy); 192 break; 193 194 case 3: 195 System.out.println(Enemy.getName() + "はじごくからいかずちをよびよせた!"); 196 System.out.println(Braver.getName() + "に255のダメージ!"); 197 System.out.println(" "); 198 199 Braver.setHP((Braver.getHP() - 255)); 200 nowHp(Braver,Enemy); 201 break; 202 203 case 4: 204 System.out.println(Enemy.getName() + "はふてきにわらっている。"); 205 System.out.println(" "); 206 207 nowHp(Braver,Enemy); 208 break; 209 } 210 continue; 211 212 } 213 } 214 215 if (Braver.getHP() <= 0) { 216 fin = true; 217 } 218 } 219 220 if (Braver.getHP() <= 0) { 221 System.out.println(Braver.getName() + "はちからつきた..."); 222 } 223 } 224 225 //残りHPを表示するメソッド 226 static void nowHp(Character Braver,Character Enemy) { 227 228 if(Braver.getHP() > 0){ 229 System.out.println(Braver.getName() +" HP:"+Braver.getHP()); 230 }else{ 231 System.out.println(Braver.getName() +" HP:0"); 232 } 233 } 234 235}

Character.java

1public class Character { 2 Character(int hp,String name){ 3 this.setHP(hp); 4 this.setName(name); 5 } 6 7 private int HP = 0; 8 private String Name = ""; 9 public int getHP() { 10 return HP; 11 } 12 public void setHP(int hp) { 13 HP = hp; 14 } 15 public String getName() { 16 return Name; 17 } 18 public void setName(String name) { 19 Name = name; 20 } 21}

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

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

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

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

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

m.ts10806

2022/05/16 01:31

現状だと「エラーの通りではないでしょうか」くらいしか言えません。 せめて例外処理を書いているところは出しましょう。 それか現象が再現する最小限のコードを改めて書き直してみるとか(それで気づけることもあるでしょう)
Zuishin

2022/05/16 01:34

> try,catchを書いてもtryを受け取るcatchがないとエラーメッセージが出てしまいます。 catch を書けばいいのでは?
guest

回答2

0

あなたもおっしゃる通り、ちょっと長すぎますね。
そのせいで見通しも悪くて、改造もしにくいです。

とりあえず以下の個所を関数化するとよいかと思いますよ。

java

1 //キーボード入力値を取得 2 BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 3 int num = Integer.parseInt(br.readLine());

ここをこんな感じに

java

1 //キーボード数字を取得 2 int num = keyBoardInput(4)

で、keyBoardInput関数は、1から引数までの数字を押されたらその値を返す関数にします。
それ以外の場合は、再入力をさせます。

そう考えていくと、これってもしかしたら、ここもまとめといたほうが使い勝手がよいのでは?って思ったりします。

java

1System.out.println(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる");

java

1 // コマンド入力 2 int num = inputCommand(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる", 4)

関数inputCommandは、それだけが単体で動くようなmainを作ってみてテストしてくださいね。

投稿2022/05/16 02:56

KeisukeOkada

総合スコア43

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

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

0

ベストアンサー

このへんのコードを

java

1System.out.println(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる"); 2 3//キーボード入力値を取得 4BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 5int num = Integer.parseInt(br.readLine());

以下のようにするといいんじゃないでしょうか。(コンパイル確認していません)

java

1//キーボード入力値を取得 2BufferedReader br = new BufferedReader(new InputStreamReader(System.in)); 3int num; 4while (true) { 5 System.out.println(Braver.getName() + "はどうする? 1:たたかう 2:とくぎ 3:どうぐ 4:にげる"); 6 try { 7 num = Integer.parseInt(br.readLine()); 8 break; 9 } catch (NumberFormatException exception) { 10 // 何もしないでループを続ける 11 } 12}

投稿2022/05/16 01:34

int32_t

総合スコア20882

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

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

potohuji-0517

2022/05/16 02:22

ありがとうございます。文字列を入力するとループするようになりました。 ただ、表示されている数値以上の数値を入力するとループせずに敵の行動に移ってしまいます。 case2以降はラベルを用いて一番最初に戻るようにしてあるのですが、最初の選択肢ではそれが出来ません。 どのようにしたら上手く繰り返すのか教えていただけないでしょうか。
int32_t

2022/05/16 03:40

> 表示されている数値以上の数値を入力するとループせずに敵の行動に移ってしまいます。 num に代入した後、numが1〜4の場合だけbreakすればいいですね。
potohuji-0517

2022/05/16 04:07

完璧にできました!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問