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

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

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

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

Q&A

解決済

3回答

14271閲覧

Java 実行時エラー IlligalArgumentException: bound must be positive

Rino-T_C

総合スコア95

Java

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

0グッド

0クリップ

投稿2015/08/04 05:42

現在Javaでランダム生成した最長閉路を描画する課題をやっています。

現在次のようなエラーが返されてどこが間違っているのかが検討つきません...

java.lang.IllegalArgumentException: bound must be positive
at java.util.Random.nextInt(Random.java:388)
at Heiro_ln.init(Heiro_ln.java:20)
at sun.applet.AppletPanel.run(AppletPanel.java:434)
at java.lang.Thread.run(Thread.java:745)

そもそもIlligalArgumentExceptionってどんなエラーなのでしょうか....?

以下にプログラムを載せておきます。

java

1import java.applet.Applet; 2import java.awt.*; 3import java.util.*; 4import java.util.List; 5 6public class Heiro_ln extends Applet{ 7 8 int max = 0; 9 int dis_now; 10 int fact_n = 0; 11 Random rnd = new Random(); 12 int n = rnd.nextInt(3)+2; 13 ArrayList<Point> points = new ArrayList<Point>(); 14 List<List<Integer>> list; 15 16 public void init(){ 17 18 19 for(int i = 0; i < 3*(n+1); i++){ 20 points.add(new Point(rnd.nextInt((int)System.currentTimeMillis()%100) + 10, rnd.nextInt((int)System.currentTimeMillis()%100) +10)); 21 } 22 23 list = nPn(n-1); 24 fact_n = fact(n); 25 longest(0); 26 } 27 28 //描画 29 30 public void paint(Graphics g){ 31 int px[] = new int[n+1]; 32 int py[] = new int[n+1]; 33 34 for(int i = 2*(n+1); i < 3*(n+1); i++){ 35 Point pt = points.get(i); 36 px[i-2*(n+1)] = 5*pt.x; 37 py[i-2*(n+1)] = 5*pt.y; 38 } 39 //座標を描画 40 for(int i = 0; i < n ; i++){ 41 String string_x = String.valueOf(px[i]); 42 String string_y = String.valueOf(py[i]); 43 g.drawString("("+string_x+","+string_y+")", 10+55*i, 10); 44 } 45 g.drawPolyline(px, py, n+1); 46 } 47 48 //距離を求める 49 50 public int distance(){ 51 int toatal_distance = 0; 52 int dis[] = new int[n]; 53 for(int i = n+1; i < (n+1)*2 - 1; i++){ 54 int dx = 0; 55 int dy = 0; 56 Point pt_p = points.get(i); 57 Point pt_a = points.get(i+1); 58 dx = pt_a.x - pt_p.x; 59 dy = pt_a.y - pt_p.y; 60 dis[i-n-1] = (int)Math.sqrt(dx*dx + dy*dy); 61 } 62 for(int j = 0; j < n; j++){ 63 toatal_distance += dis[j]; 64 } 65 return toatal_distance; 66 } 67 68 69 public static List<List<Integer>> nPn(Integer n) { 70 71 if (n == null || n < 0){ 72 return null; 73 } 74 75 List<List<Integer>> Ans = new ArrayList<List<Integer>>(); 76 77 if (n == 0) { 78 Ans.add(new ArrayList<Integer>(Arrays.asList(0))); 79 return Ans; 80 } 81 List<List<Integer>> preAns = nPn(n - 1); 82 83 for (List<Integer> permutation : preAns) { 84 for (int i = 0; i <= n; ++i) { 85 permutation.add(i, n); 86 Ans.add(new ArrayList<Integer>(permutation)); 87 permutation.remove(n); 88 } 89 permutation.clear(); 90 } 91 preAns.clear(); 92 93 return Ans; 94 } 95 96 //階乗計算 97 public int fact(int t){ 98 int result = 1; 99 for(int i = t; i > 0; i--){ 100 result *= i; 101 } 102 return result; 103 } 104 105 106 //最短距離を求める 107 public int longest(int k){ 108 109 110 for(int i = n+1; i < 2*(n+1)-2; i++){ 111 points.set(i, points.get((list.get(k)).get(i-n-1))); 112 } 113 points.set(2*(n+1)-1, points.get((list.get(k)).get(0))); 114 115 dis_now = distance(); 116 if(max == 0){ 117 max = dis_now; 118 }else if(dis_now > max){ 119 max = dis_now; 120 121 for(int i = 2*(n+1); i < 3*(n+1)-2; i++){ 122 points.set(i, points.get((list.get(k)).get(i-2*(n+1)))); 123 } 124 points.set(3*(n+1)-1, points.get((list.get(k)).get(0))); 125 } 126 127 128 if(k < fact_n - 1){ 129 return longest(k+1); 130 }else{ 131 return 0; 132 } 133 } 134} 135

原因がわかる方、よろしくお願いします!

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

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

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

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

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

guest

回答3

0

ベストアンサー

「bound must be positive」と出力されている通り、RandomクラスのメソッドnextIntの引数は常に正の値(=positive)である必要があります。
これを踏まえてコードを読んでみると、initメソッド内でnextIntメソッドへ以下の値を渡しているのに気づきます。

java

1(int)System.currentTimeMillis()%100

System.currentTimeMillis()はlong型の値を返すメソッドで、これをint型に直すとオーバーフローが発生して負の値になる可能性があります。
%演算子での剰余計算では符号は反転しないため、最終的にnextIntメソッドの引数が負の値になってしまったのではないでしょうか。

投稿2015/08/04 05:50

hy3

総合スコア594

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

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

hy3

2015/08/04 06:02

maisumakunさんの指摘の通り、負数だけでなく0になった場合も例外が発生するようです。 念のため、補足いたします。
Rino-T_C

2015/08/04 06:13

回答ありがとうございます!! Random rnd_x = new Random(); Random rnd_y = new Random(); int x = rnd_x.nextInt(101)+10; int y = rnd_y.nextInt(101)+10; points.add(new Point(x, y)); long型になるSystem.currentTimeMillis()%100を上のように書き換えたらちゃんと動くようになりました! ありがとうございました!
guest

0

エラーメッセージの通り、nextInt()は正の値しか取ることができません。System.currentTimeMillis()の返り値がちょうど100で割り切れた場合、0が渡ってエラーとなります。

投稿2015/08/04 05:47

maisumakun

総合スコア145064

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

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

Rino-T_C

2015/08/04 05:56

回答ありがとうございます! あまり考えずに使っていたので、そのようなところに原因があったとは... 勉強になります!
guest

0

すでにベストアンサーが出ているので、一応、補足ですが、
IllegalArgumentExceptionは、メソッドの引数に、
何かそのメソッドが受け付けられない値が渡された場合に発生します。

大抵は、そのメソッドのJavaDocに書いてあります。今回の場合、以下の通りです。

例外: IllegalArgumentException - n が正でない場合

JavaDocを参照する習慣をつけると良いと思います。

また、何処が間違っているか見当がつかないと言うことでしたが、
at Heiro_ln.init(Heiro_ln.java:20)
とあるので、20行目であること、その上に
at java.util.Random.nextInt(Random.java:388)
とあるので、その行のRandomクラスのnextIntメソッドの呼び出しで
問題が発生したことまでは分かります。

例外のスタックトレースは有用な情報の塊なので、
読めるようになった方が良いと思います。
このページが参考になるのではと思います。

投稿2015/08/04 06:36

eripong

総合スコア1546

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

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

Rino-T_C

2015/08/04 06:41

アドバイスありがとうございます! スタックトレースを読むことで原因がみえてくるということは、わかってはいたのですが、読もうとしても知らないことが多いもので.... 参考になるサイトが教えていただけるのはすごくありがたいです! eripongさんのように順序だてて読めるよう頑張ってみますね!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.51%

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

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

質問する

関連した質問