以前、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>
No.3ベストアンサー
- 回答日時:
#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;
いや、ないですね。「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;
すると、問題なく表示されたのです!
すいません、もしよろしければ、理由の方を、教えていただけないでしょうか?
No.4
- 回答日時:
エラー拝見しました。
同じものが何度か出力されているので、長くなっているようです。さて、エラーが出力されているのが下記の行、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/ …
返信がすごく遅くなってすいません(>_<)
皆様の回答の内容が、私にとって高度だったので、Javaの本を一冊勉強してから回答しようと思いました。
リンク先も拝見したのですが、「substringで抽出する際の制限」について、あんまり理解できませんでした。そもそも、substring自体が何なのかよくわからないレベルですからね(汗)・・・クラスらしいですが・・・。
もう少し勉強してから、osu_neko09さんの回答をじっくり検討したいと思います。
ありがとうございました<m(__)m>
No.2
- 回答日時:
> を、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の勉強を始めて半年の未熟者で、どう修正すればよいのかさっぱりなのです(>_<)
よろしければ、修正方法を教えていただけないでしょうか?
No.1
- 回答日時:
画面を見る限り、なにかエラーが発生していますので、
コンソールに赤字(と青字)で表示されている内容を補足で教えてください。
この回答への補足
すいません、すごく長く文字数制限に引っ掛かってしまうので、こちら↓
http://onnsei-okiba.radilog.net/article/481678.h …
をご覧いただければ幸いです。
よろしくお願いします<m(__)m>
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# c言語 プログラムのエラー 1 2023/02/11 20:31
- C言語・C++・C# 宣言する関数の形が決まっている状態で、 str1とstr2の文字列をこの順に引っ付けてstrに保存し 2 2022/05/30 18:21
- C言語・C++・C# c言語配列の結合についてです。 なぜうまくいかないのでしょうか。 #include <stdio.h 4 2022/05/30 22:42
- C言語・C++・C# str[j++]の意味 2 2022/08/30 16:20
- C言語・C++・C# C#テキストボックスの文字を配列にいれてその後表示する 4 2022/07/17 04:47
- C言語・C++・C# プログラミングの授業の課題です 1 2023/01/17 22:15
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java javaでのプログラム(配列)について質問です. 2 2022/10/14 22:27
- Excel(エクセル) PHPプログラムをエクセルに張り付けると検索ボックスがでてくる! 3 2022/05/08 07:10
- 大学・短大 C言語線形リストの問題です 3 2022/12/22 00:45
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
java初心者の質問(3つの整数の...
-
メインが含まれていません
-
JAVA EOFの検出 (条件文で「...
-
Javaで電卓を作りたい
-
フィボナッチ数列 java
-
DataSet(DataTable)の使い方
-
iアプリでバイナリデータを16進...
-
西暦 -> 年号、年号 -> 西暦の...
-
後置インクリメントの計算過程...
-
JUnit4のアノテーションについて
-
intが負の時に投げる例外はあり...
-
式の型は配列型で int に解決済...
-
JTableのセルの背景色について
-
C++からC#のdllを参照する際、...
-
javaでカレンダー作成
-
複数のボタンを配置し、それぞ...
-
byte[]→int
-
JAVAでCの関数ポインタのような...
-
初心者ですが、今javaで簡単な...
-
classを使って座標軸を求めるコ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
式の型は配列型で int に解決済...
-
「配列定数は、イニシャライザ...
-
javaでcsvファイル読込時の改行...
-
java spring でエラーが出て困...
-
javaでカレンダー作成
-
Javaで電卓を作りたい
-
SwingでJtableのヘッダ行が表示...
-
JAVA エラー 式の開始が不正で...
-
JAVAでCの関数ポインタのような...
-
C#で実行時にメソッドの返り値...
-
(Swing)JTextFieldを半角のみ入...
-
c# デリゲート関連の命名について
-
Javaでポインタ的なことはでき...
-
複数のボタンを配置し、それぞ...
-
javaのエラーの意味がわかりま...
-
JUnit4のアノテーションについて
-
sin曲線とcos曲線を描くプログ...
-
intが負の時に投げる例外はあり...
-
Java 初心者 int型の取り扱い方
-
C++からC#のdllを参照する際、...
おすすめ情報