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

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

新規登録して質問してみよう
ただいま回答率
85.50%
Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

Q&A

解決済

2回答

10134閲覧

Java実行時エラー Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive

退会済みユーザー

退会済みユーザー

総合スコア0

Windows 7

Microsoft Windows 7は過去にリリースされたMicrosoft WindowsのOSであり、Windows8の1代前です。2009年の7月にリリースされ販売されました。Windows7の前はWindowsVistaで、その更に3年前にリリースされました。

Java

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

Windows

Windowsは、マイクロソフト社が開発したオペレーティングシステムです。当初は、MS-DOSに変わるOSとして開発されました。 GUIを採用し、主にインテル系のCPUを搭載したコンピューターで動作します。Windows系OSのシェアは、90%を超えるといわれています。 パソコン用以外に、POSシステムやスマートフォンなどの携帯端末用、サーバ用のOSもあります。

0グッド

0クリップ

投稿2017/03/28 11:38

###前提・実現したいこと
javaでRPGを作っています
ダメージ機能を実装し、ダメージが0だった際に以下のエラーメッセージが発生しました。

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

ちくわは、0ポイントのダメージを受けた Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive at java.util.Random.nextInt(Unknown Source) at part01.syugyou(part01.java:59) at part01.putCommand(part01.java:35) at part01.syugyou(part01.java:71) at part01.putCommand(part01.java:35) at part01.putCommand(part01.java:42) at part01.syugyou(part01.java:71) at part01.putCommand(part01.java:35) at part01.putCommand(part01.java:42) at part01.syugyou(part01.java:71) at part01.putCommand(part01.java:35) at part01.putCommand(part01.java:42) at part01.syugyou(part01.java:71) at part01.putCommand(part01.java:35) at part01.putCommand(part01.java:42) at part01.syugyou(part01.java:71) at part01.putCommand(part01.java:35) at part01.main(part01.java:12)

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

java

1public class part01 2{ 3 static String name = "ちくわ" ;// プレイヤーネーム 4 static int level = 30 ;//プレイヤーレベル 5 static int hp = 30 ; 6 static double gold = 50.0 ; 7 8 public static void main( String[] args ) throws java.io.IOException 9 { 10 putjosyou(); //序章 11 12 putCommand(); 13 14 if( hp == 0 ){ 15 return; 16 } 17 18 if( level < 40 ){ 19 putGameOver(); 20 }else{ 21 putend(); 22 } 23 } 24 25 //コマンド関数 26 public static void putCommand() throws java.io.IOException 27 { 28 put( "1.すぐに魔王を倒しに行く" ); 29 put( "2.修行する" ); 30 put( "3.宿屋に泊まる" ); 31 int c = inputCommand(); 32 if( c == '1'){ 33 put( "魔王が現れた!" ); 34 }else if ( c == '2'){ 35 syugyou(); 36 }else if( c == '3' ){ 37 if( gold >= 9.95 ){ 38 hp = level; 39 gold -= 9.95; 40 } 41 putStatus(); 42 putCommand(); 43 } 44 } 45 46 public static void syugyou() throws java.io.IOException 47 { 48 //ダメージ処理 49 java.util.Random r = new java.util.Random(); 50 int d = r.nextInt( level ); 51 hp -= d; 52 if( hp < 0 ){ 53 hp = 0; 54 } 55 put( name + "は、 " + d + "ポイントのダメージを受けた" ); 56 57 //ゴールド処理 58 java.util.Random m = new java.util.Random(); 59 int g = r.nextInt( d ); 60 put( g + "G手に入れた" ); 61 gold += g; 62 63 //レベル処理 64 int l = r.nextInt( 5 ) + 1; 65 level += l; 66 put( "レベルが " + level + " にあがった" ); 67 putStatus(); 68 if( hp == 0 ){ 69 put( "GAME OVER" ); 70 }else{ 71 putCommand(); 72 } 73 } 74 75 public static int inputCommand() throws java.io.IOException 76 { 77 int c = System.in.read(); 78 if( c == 10 || c == 13){ 79 return( inputCommand() ); 80 } 81 return( c ); 82 } 83 84 //序章の関数 85 public static void putjosyou() 86 { 87 put( "魔王が世界を滅ぼそうとしています。" ); 88 putStatus(); 89 } 90 91 public static void putStatus() 92 { 93 put( "--------------------------------------------" ); 94 put( " " + name + " Lv" + level + " HP" + hp + " " + gold + "G" ); 95 put( "--------------------------------------------" ); 96 } 97 98 public static void putGameOver () 99 { 100 put( name + "は魔王に敗れました" ); 101 put( "GAME OVER" ); 102 } 103 104 //エンディング関数 105 public static void putend() 106 { 107 String s0 = name + "は魔王を倒しました。" ; 108 put( s0 ); 109 110 System.out.print( "レベル" + level ); 111 112 if( level > 80 ){ 113 put( "なので楽勝でした" ); 114 }else if( level > 50 ){ 115 put( "なので倒せました" ); 116 }else{ 117 put( "でしたので苦戦しました"); 118 } 119 put( "GAME CLEAR!" ); 120 } 121 122 public static void put ( String str ) 123 { 124 System.out.println( str ); 125 } 126} 127

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

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

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

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

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

guest

回答2

0

ベストアンサー

全てのエラーの原因は、syugyou()メソッド内で
int g = r.nextInt( d );
put( g + "G手に入れた" );
gold += g;
しようとした時、dが0の場合エラーになる事から来ているのではないかと思います
その部分を適当に訂正して
int g=0;
if(d!=0){
g= r.nextInt( d );
put( g + "G手に入れた" );
gold += g;
}
に書き換えたのが以下です

java

1public class part01 2{ 3 static String name = "ちくわ" ;// プレイヤーネーム 4 static int level = 30 ;//プレイヤーレベル 5 static int hp = 30 ; 6 static double gold = 50.0 ; 7 8 public static void main( String[] args ) throws java.io.IOException 9 { 10 putjosyou(); //序章 11 12 putCommand(); 13 14 if( hp == 0 ){ 15 return; 16 } 17 18 if( level < 40 ){ 19 putGameOver(); 20 }else{ 21 putend(); 22 } 23 } 24 25 //コマンド関数 26 public static void putCommand() throws java.io.IOException 27 { 28 put( "1.すぐに魔王を倒しに行く" ); 29 put( "2.修行する" ); 30 put( "3.宿屋に泊まる" ); 31 int c = inputCommand(); 32 if( c == '1'){ 33 put( "魔王が現れた!" ); 34 }else if ( c == '2'){ 35 syugyou(); 36 }else if( c == '3' ){ 37 if( gold >= 9.95 ){ 38 hp = level; 39 gold -= 9.95; 40 } 41 putStatus(); 42 putCommand(); 43 } 44 } 45 46 public static void syugyou() throws java.io.IOException 47 { 48 //ダメージ処理 49 java.util.Random r = new java.util.Random(); 50 int d = r.nextInt( level ); 51 hp -= d; 52 if( hp < 0 ){ 53 hp = 0; 54 } 55 put( name + "は、 " + d + "ポイントのダメージを受けた" ); 56 57 //ゴールド処理 58 java.util.Random m = new java.util.Random(); 59 int g=0; 60 if(d!=0){ 61 g=r.nextInt( d ); 62 put( g + "G手に入れた" ); 63 gold += g; 64 } 65 66 //レベル処理 67 int l = r.nextInt( 5 ) + 1; 68 level += l; 69 put( "レベルが " + level + " にあがった" ); 70 putStatus(); 71 if( hp == 0 ){ 72 put( "GAME OVER" ); 73 }else{ 74 putCommand(); 75 } 76 } 77 78 public static int inputCommand() throws java.io.IOException 79 { 80 int c = System.in.read(); 81 if( c == 10 || c == 13){ 82 return( inputCommand() ); 83 } 84 return( c ); 85 } 86 87 //序章の関数 88 public static void putjosyou() 89 { 90 put( "魔王が世界を滅ぼそうとしています。" ); 91 putStatus(); 92 } 93 94 public static void putStatus() 95 { 96 put( "--------------------------------------------" ); 97 put( " " + name + " Lv" + level + " HP" + hp + " " + gold + "G" ); 98 put( "--------------------------------------------" ); 99 } 100 101 public static void putGameOver () 102 { 103 put( name + "は魔王に敗れました" ); 104 put( "GAME OVER" ); 105 } 106 107 //エンディング関数 108 public static void putend() 109 { 110 String s0 = name + "は魔王を倒しました。" ; 111 put( s0 ); 112 113 System.out.print( "レベル" + level ); 114 115 if( level > 80 ){ 116 put( "なので楽勝でした" ); 117 }else if( level > 50 ){ 118 put( "なので倒せました" ); 119 }else{ 120 put( "でしたので苦戦しました"); 121 } 122 put( "GAME CLEAR!" ); 123 } 124 125 public static void put ( String str ) 126 { 127 System.out.println( str ); 128 } 129}

投稿2017/03/28 11:47

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

退会済みユーザー

退会済みユーザー

2017/03/28 11:58

ありがとうございます! 解決しました ひとつ質問なんですが、 d! とはどういう意味でしょうか?教えていただけたら幸いです
退会済みユーザー

退会済みユーザー

2017/03/28 12:06 編集

d!=は、dが!=の右に来る値以外、という意味になります if(d!=0){ で、dが0ではない場合、 という意味になります x!=yで xとyが等しくない場合 という意味です boolean型のtrueかfalseまたはboolean型を返す何かの前に!とつけると 例:)!(s.equals("0")) で、その後に続く部分の判定を逆にする効果があります ! もあれば、!= もあるということだと思います
退会済みユーザー

退会済みユーザー

2017/03/28 12:03

なるほど! 意味としては else と同じ感じですね?
退会済みユーザー

退会済みユーザー

2017/03/28 12:09

else? ああなるほど if(a==0)のかわりに if(a!=0)とすると if(a==0){ //処理1 }else{ //処理2 } とした場合の処理2部分でしたい何かを if(a!=0){ //処理2 } でさせる事ができますね elseと同じ感じという言い方は初めて見ましたが、だいたいそのような認識で考え方としては合っていそうです
退会済みユーザー

退会済みユーザー

2017/03/28 12:12

ありがとうございました すっきりしました!
guest

0

スタックトレースを頑張って読みましょう。

syugyou メソッドで Random.nextInt() を使用している箇所で、IllegalArgumentException が発生しました。

そのメッセージは「bound must be positive」です。もうおわかりですね。

投稿2017/03/28 11:45

koko_u

総合スコア936

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

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

退会済みユーザー

退会済みユーザー

2017/03/28 12:00

回答ありがとうございます! 自分で考えてみたんですが、Random.nextInt() を使用している箇所が2つあってどちらなのかずっと考えていました...
swordone

2017/03/28 14:49

スタックトレースの先頭3行を抜粋しました。 >Exception in thread "main" java.lang.IllegalArgumentException: bound must be positive > at java.util.Random.nextInt(Unknown Source) > at part01.syugyou(part01.java:59) 2行目が例外発生個所で、3行目が2行目を呼び出している場所です。 part01.javaの59行目、syugyouメソッドの中から呼び出したRandom#nextIntが例外を発していることがわかります。 あとこのスタックトレースを見て気づいたのですが、再帰させすぎでは…
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問