アプリ版:「スタンプのみでお礼する」機能のリリースについて

以前、Javaで素数の表を作ろうと、ここ↓
http://detail.chiebukuro.yahoo.co.jp/qa/question …

で助けをお願いし、数名の方からご回答をいただきました。
「うまく書けません」という曖昧な事を言ってしまい、申し訳なかったと思います。

とりあえず、書いてくださったコードを一字一句理解することから始めようと思い、回答してくださったある方のプログラムを実行してみました。
(「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>

「Javaで素数の表を表示させたいのですが」の質問画像

A 回答 (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;
    • good
    • 0
この回答へのお礼

いや、ないですね。「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;

すると、問題なく表示されたのです!
すいません、もしよろしければ、理由の方を、教えていただけないでしょうか?

お礼日時:2009/11/12 03:01

エラー拝見しました。

同じものが何度か出力されているので、長くなっているようです。さて、エラーが出力されているのが下記の行、
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/ …
    • good
    • 0
この回答へのお礼

返信がすごく遅くなってすいません(>_<)
皆様の回答の内容が、私にとって高度だったので、Javaの本を一冊勉強してから回答しようと思いました。

リンク先も拝見したのですが、「substringで抽出する際の制限」について、あんまり理解できませんでした。そもそも、substring自体が何なのかよくわからないレベルですからね(汗)・・・クラスらしいですが・・・。

もう少し勉強してから、osu_neko09さんの回答をじっくり検討したいと思います。
ありがとうございました<m(__)m>

お礼日時:2009/12/03 05:58

> を、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());
    • good
    • 0
この回答へのお礼

あっ、そうですね、アプレットとアプリケーションは同じものだと思ってたのですが、「実行」メニュー→「実行」と進むと、確かに「Javaアプリケーション」と書いてますね!

というか、すごいですね!
最初の4行でエラーの場所がわかるのですね(驚)
申し訳ないのですが、Javaの勉強を始めて半年の未熟者で、どう修正すればよいのかさっぱりなのです(>_<)
よろしければ、修正方法を教えていただけないでしょうか?

お礼日時:2009/11/12 02:47

画面を見る限り、なにかエラーが発生していますので、


コンソールに赤字(と青字)で表示されている内容を補足で教えてください。

この回答への補足

すいません、すごく長く文字数制限に引っ掛かってしまうので、こちら↓
http://onnsei-okiba.radilog.net/article/481678.h …
をご覧いただければ幸いです。
よろしくお願いします<m(__)m>

補足日時:2009/11/12 02:16
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!