- ベストアンサー
Javaで素数の表を表示させたいのですが、うまく表示されません(>_<)
以前、Javaで素数の表を作ろうと、ここ↓ http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1432689724 で助けをお願いし、数名の方からご回答をいただきました。 「うまく書けません」という曖昧な事を言ってしまい、申し訳なかったと思います。 とりあえず、書いてくださったコードを一字一句理解することから始めようと思い、回答してくださったある方のプログラムを実行してみました。 (「Sosuu→sosuu」とだけ変更しました。) ---------------- import java.awt.*; import java.awt.event.*; public class sosuu extends Frame { static final int N=200; int k,x,y; // (x,y) は 数字の表示位置 public sosuu() { setTitle("エラトステネスの篩(ふるい)により素数を求める"); setLocation(170,0); setBackground(Color.WHITE); //画面を閉じるための処理 addWindowListener(new WindowAdapter() { public void windowClosing(WindowEvent e) { System.exit(0); } }); } public void paint(Graphics g) { Font f=new Font("MS 明朝",Font.BOLD,12); g.setFont(f); // フォントの設定 g.setColor(Color.red);// 数字を赤で表示 //初めはすべて赤字で表示 for (int i=0; i<20; i++) { for (int j=1; j<=10; j++) { x=10+50*j; y=100+i*25; int k; k=10*i+j; // 数字を揃えて表示するための操作 // subString(int beginindex, int endindex)は部分文字列を返す // beginindexは取りだす最初の文字位置、endindexは取りだす最後の文字位置 String str = " "+k; str =str.substring(str.length()-4,str.length()); g.drawString(str,x,y); } } //素数でないものを青字で表示 k=(int)Math.sqrt(N);// N までの素数を求めるとき, sqrt(N)までの数の // 倍数であるかどかを調べれば十分 g.setColor(Color.blue);//素数でない 数を青で表示 String str = new String(); //1は素数でないので除く str = " 1"; str =str.substring(str.length()-4,str.length()); g.drawString(str,60,100); for (int i=2; i<=k; i++) { int n=i; //iの整数倍 int nn=0;//iの倍数を作るのために while(n<=N){//N以下の時続ける x=60+50*((n-1)%10); //横の位置 y=100+25*((n-1)/10);//縦の位置 //初めてでてきた数値は素数、それ以外は素数でない if(n != i){ str = " "+n; str =str.substring(str.length()-4,str.length()); g.drawString(str,x,y); } n=i*(++nn); } } } public static void main(String[] args) { //インスタンスの生成 sosuu so=new sosuu(); //画面のサイズ so.setSize(630,650); //描画(つまりpaint()を呼ぶ) so.setVisible(true); } } ---------------- を、Eclipse(3.2.2)に貼り付けて、「実行→実行→Javaアプリケーション」で、アプレットを起動させてみました。 すると、何も表示されない真っ白な画面が出てきたのです(ToT) コードのどこかが間違っているのでしょうか? エラーがあると、豆電球にバッテンマークみたいなものが表示されると思うのですが、特にそういったものは表示されません。 何が原因で、アプレットを起動しても真っ白な画面しか出てこないのか、ご教授いただければ幸いです(>_<) よろしくお願いします<m(__)m>
- みんなの回答 (4)
- 専門家の回答
質問者が選んだベストアンサー
#2>この行で例外を吐いているみたい。 #2>> str =str.substring(str.length()-4,str.length()); ああ、それなら、きっと単純な話です。 少なくとも以下の3箇所、strに値をセットしている部分の、空白が4文字以上ありますか? 空白を ロ で表すとこんな感じ。 String str = "ロロロロ"+k; str = "ロロロロ1"; -------以下コード引用----- String str = " "+k; //1は素数でないので除く str = " 1"; str = " "+n;
その他の回答 (3)
- osu_neko09
- ベストアンサー率48% (56/115)
エラー拝見しました。同じものが何度か出力されているので、長くなっているようです。さて、エラーが出力されているのが下記の行、 str =str.substring(str.length()-4,str.length()); 日本語で書けばこんな感じでしょう。 変数strに、変数strの一部分を抽出してセットせよ。抽出する一部分は、 beginIndex:(変数strの現在の長さから4文字を引いた値)文字目から、 endIndex:(変数strの現在の長さ)文字目、つまり末尾まで、とする。 さて、空白の個数が4個ないと(3個でもいいのか)、(変数strの現在の長さから4文字を引いた値)が負になってしまいます。 substringで抽出する際には、以下の制限があるのです。 beginIndex が負の値である場合、endIndex がこの String オブジェクトの長さより大きい場合、あるいは beginIndex が endIndex より大きい場合には、例外IndexOutOfBoundsExceptionとする なお、下記のURLのJava レファレンスに、substringの仕様が書かれています。ご参考まで。 http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/String.html#substring%28int,%20int%29
お礼
返信がすごく遅くなってすいません(>_<) 皆様の回答の内容が、私にとって高度だったので、Javaの本を一冊勉強してから回答しようと思いました。 リンク先も拝見したのですが、「substringで抽出する際の制限」について、あんまり理解できませんでした。そもそも、substring自体が何なのかよくわからないレベルですからね(汗)・・・クラスらしいですが・・・。 もう少し勉強してから、osu_neko09さんの回答をじっくり検討したいと思います。 ありがとうございました<m(__)m>
- Yanch
- ベストアンサー率50% (114/225)
> を、Eclipse(3.2.2)に貼り付けて、「実行→実行→Javaアプリケーション」で、アプレットを起動させてみました。 このプログラムを見た限り、Javaアプレットではありません。 Javaアプリケーションです。 > すると、何も表示されない真っ白な画面が出てきたのです(ToT) 実行すると、例外を吐いているみたいですよ。 内容を確認して、コードを修正しましょう。 Exception in thread "AWT-EventQueue-0" java.lang.StringIndexOutOfBoundsException : String index out of range: -2 at java.lang.String.substring(String.java:1931) at sosuu.paint(sosuu.java:37) この行で例外を吐いているみたい。 > str =str.substring(str.length()-4,str.length());
お礼
あっ、そうですね、アプレットとアプリケーションは同じものだと思ってたのですが、「実行」メニュー→「実行」と進むと、確かに「Javaアプリケーション」と書いてますね! というか、すごいですね! 最初の4行でエラーの場所がわかるのですね(驚) 申し訳ないのですが、Javaの勉強を始めて半年の未熟者で、どう修正すればよいのかさっぱりなのです(>_<) よろしければ、修正方法を教えていただけないでしょうか?
- osu_neko09
- ベストアンサー率48% (56/115)
画面を見る限り、なにかエラーが発生していますので、 コンソールに赤字(と青字)で表示されている内容を補足で教えてください。
補足
すいません、すごく長く文字数制限に引っ掛かってしまうので、こちら↓ http://onnsei-okiba.radilog.net/article/481678.html をご覧いただければ幸いです。 よろしくお願いします<m(__)m>
お礼
いや、ないですね。「String str = "ロロロロ"+k;」の方は、半角1文字、「str = "ロロロロ1";」の方も、半角1文字しかありません。 osu_neko09さんのご回答を参考に、3箇所のstrを、空白4文字以上にしてみました。 ・・・// beginindexは取りだす最初の文字位置、endindexは取りだす最後の文字位置 String str = " "+k; ・・・//1は素数でないので除く str = " 1"; ・・・//初めてでてきた数値は素数、それ以外は素数でない if(n != i){ str = " "+n; すると、問題なく表示されたのです! すいません、もしよろしければ、理由の方を、教えていただけないでしょうか?