トップページ⇒tech
1001コメント465KB

【初心者】Java質問・相談スレッド93【大歓迎】

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2006/10/22(日) 13:42:10
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/

これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、
wikiからのリンクをおたどりください。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 http://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。

前スレッド
【初心者】Java質問・相談スレッド92【大歓迎】
http://pc8.2ch.net/test/read.cgi/tech/1159700963/

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */
また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/

次スレは>>980あたりで。
0951デフォルトの名無しさん2006/11/20(月) 11:12:50
ちょっと教えて下さい。
Class A と Class B を作って A のメインクラスで B のオブジェクトを利用します。
それでしばらく使っていたんですが、ある時ふと、B のオブジェクトから A 非 static なメソッドを利用したいと思って、
そこで B のクラス内で A のオブジェクトを作るコードを書いて実行してみました。
実は実行するまでこのアプリは無限にオブジェクトをループで作り続けて実行できないと思っていたのですが、
実際は何も問題無くできたんです。
さて、どうして無限にオブジェクトができなかったんだろう?って疑問に思ったんですが、実際プログラムはどんな参照をして
動いていたんでしょうか。
お馬鹿な質問ですがよろしくお願いします。
0952デフォルトの名無しさん2006/11/20(月) 11:24:18
>>951
B のクラス内で A のオブジェクトを作ったからといって
A のメインクラスが実行されるわけではないから。
つまり、Bのクラス内で A のオブジェクトを作っただけ
なら、そのとき作られた A のオブジェクトの中で、「新
たに B のオブジェクトを作るロジック」が動作するわけ
ではない。
0953デフォルトの名無しさん2006/11/20(月) 11:29:51
>>952
ありがとうございます。
でも、どうして新たに B のオブジェクトを作ろうとしないのでしょうか。
A のクラス内には B b = new B(); が実行されているのに不思議だと思います。
勉強が足りなくてすみません。
0954デフォルトの名無しさん2006/11/20(月) 11:34:08
じゃあ足りるまで勉強して来い
0955デフォルトの名無しさん2006/11/20(月) 11:35:52
>>954
す、すみません!(;_;
分かりやすく教えて頂けると思ったので・・・・。
本にも聞いてみます!
0956ぴゅあ2006/11/20(月) 11:55:28
>>955
本に聞いてもすんなり答えてくれることは少ないかも?と思ったりもするけど…

AでBのオブジェクトを作っているのが何処か
BでAのオブジェクトを作っているのが何処か
>B のオブジェクトから A 非 static なメソッドを利用したい
という中で"AでBのオブジェクトを作っている"(相互に作り続ける)という流れを通っているか

書いたコードの流れをしっかり追ってみる

>>951が言わんとしているのはそういうところだろうし
>>954の言う"足りるまで勉強して来い"というのは
そういうところ(追え)でしょうねぇ?
0957ぴゅあ2006/11/20(月) 11:59:10
>そういうところ(追え)でしょうねぇ?
自分で書いたコードなんだから

というところ
0958デフォルトの名無しさん2006/11/20(月) 12:01:35
>>949
ぴゅあさん、レスありがとうございます。

丁寧な解説で、どのように再帰が動いているのか掴むことが出来ました。
宿題の方ですが、「末尾のreturnで戻るだけ」という事は、単純にmainメソッドの方で
このように呼び出せば良いという事でしょうか?

System.out.println("Min number: "+arrayMin(array, array.length));

また、maxの値ですが、

static int arrayMax(int[] a, int i){
if(i > 0){
int max = arrayMax(a, i-1);
if (max < a[i - 1]) {
max = a[i - 1];
}
return max;
}
return a[i];
}

とし、同じように

System.out.println("Max number: "+arrayMax(array, array.length));

と呼び出してやれば良いでしょうか。
0959ぴゅあ2006/11/20(月) 12:39:27
>>958
いやそれは
>System.out.println("Min number: "+arrayMin(array, array.length));
(当然ながら欲しいものだから)結果を表示しているというだけで

触るのはarrayMinメソッドの中
>>949の中で殆ど答えになるようなヒントは出ていると思いますけどね
>a[0]が返される(i-1=0)ときは比較対象がないんですから
>arrayMinメソッドを呼ぶ必要はなく
>末尾のreturnで戻るだけ

例として挙げた2つの結果をよく見比べ、
またiの値によってどう流れが変わるか絵に描いて考えてみたりするといいかも

たぶんその流れの部分を理解できるかが
再帰呼び出しの処理を理解する上での"キモ"かも

arrayMaxメソッドについては確認するまでもなく
arrayMinメソッドができれば簡単よね("最小値を採る"の代わりに"最大値を採る"にするだけだし)

あと、>>921の冒頭で書いたfor文内でやるのはちゃんとやって検証しておいた方がいいと思う
(簡単だからとか解ったつもりで頭でイメージするだけでなく、ちゃんとコードを書いて実行し、結果を得ること)
最小値,最大値を求めたりという場面はfor文内とかの方が多かったりするかも?

また、for文内で処理するとき、再帰呼び出しで出てきたようにa[0]或いはa[9]等、
1つはループから除外するとかという形になったりすると思うけど
(除外するという形の方が簡単で判り易いだろうと思うけど)
ループ内でa[0]或いはa[9]等を判断して場合分けするようなのもオマケでやっておくのもいいかも
ループ内での処理の仕方を知っておく上では損はないだろうと思います
(再帰呼び出しについて理解しようとしているということに限れば余計なことだろうけど)
まぁそれはarrayMin/arrayMaxメソッドの後にでもやろうと思えば…ってことで
0960デフォルトの名無しさん2006/11/20(月) 13:03:06
>>959
ありがとうございます。やってみます。
0961デフォルトの名無しさん2006/11/20(月) 15:04:37
>>957-958
ぴゅあさんありがとうございます。
B のオブジェクトが A のオブジェクトを作ったときに、作られた A のオブジェクトが B のオブジェクトを
作るコードの所を通っているかどうかを確認しなさいって事ですね。
今から暇を見て確認してみます。
それよりも、相互に作り続ける簡単なコードを書いてもいいかもですのでやってみます。
09629612006/11/20(月) 15:05:52
↑アンカー間違ってました。
>>956-957でした。
09639612006/11/20(月) 15:41:30
無駄にスレを消化する馬鹿だと人に言われるかもしれませんが実験してみました。
結果、StackOverflowError が発生して処理がストップしました。
少しずつ>>952さんの説明が理解できて来ました。ありがとうございます。
当り前な事でも馬鹿な実験でもしないと理解できない飲み込みの悪い新人でした。
お邪魔しました。
0964デフォルトの名無しさん2006/11/20(月) 15:44:12
昨日からJava始めたばかりですが、いきなり分からない事が出てきました。

//Exercise1.java

class Exercise1{
public static void main(String args[]){
float a;
a=2.0;
System.out.println("変数aの値は"+a+"です");
}
}

これでコンパイルすると、エラーが出ます。
検出値:double
期待値:float
となります。
doubleで宣言してやるとうまく行きましたが、どうしてfloatで宣言できないのでしょうか?
0965デフォルトの名無しさん2006/11/20(月) 15:51:02
>>964
2.0という値の型がdoubleだから。
2.0f と書くとfloatの定数になる。
0966デフォルトの名無しさん2006/11/20(月) 16:14:15
>>965
すいません。理解できません。
本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
それ以外にも違いがあるということでしょうか?
0967デフォルトの名無しさん2006/11/20(月) 16:16:33
>>966
double から float への変換は、精度が悪くなる変換なので
キャストしないとコンパイル時に怒られる。

float から float なら問題ないけど。
0968ぴゅあ2006/11/20(月) 16:22:55
なんだろ?

>>963
>当り前な事でも
誰が当たり前と決めたのか知らないけど
どんな些細なことでも実際にやってみることが大切だと思いますけどね
0969デフォルトの名無しさん2006/11/20(月) 16:33:58
>>967
せっかく答えて頂いたのに、私の理解力が追いついていません。
とりあえず、入門書を一通り読んでから、また来ます。
ありがとうございました。
0970デフォルトの名無しさん2006/11/20(月) 17:16:30
>>966
2.0 と書いただけだと double になるのよ。だから内部的には2進数で
   0100000000000000000000000000000000000000000000000000000000000000
として保持される。64ビットを使って表現してるわけですよ。さてここで
あえて float だと指定してすると(※ 2.0f と書く(>>965を参照))今度は
   01000000000000000000000000000000
というように32ビットの表現になるわけですよ。扱える桁数が違うとか、
数値の精度が違うというのは、こういうことです。
>>964>>966>>969は、わかりましたか?
09719702006/11/20(月) 17:20:42
あと、詳しいことは http://ja.wikipedia.org/wiki/IEEE754 でも見て勉強してくれ。
0972デフォルトの名無しさん2006/11/20(月) 17:33:26
>>969
float と double の違いは、扱える桁数にある
⇒ 桁数が多いほうから少ないほうへ不用意に変換すると、値が変わってしまうことがある
⇒ もしプログラマ側が意図していない変換だとバグの元になる (実際この手のバグでロケットが墜落している)
⇒ コンパイラが親切にも警告を出してくれる

OK?
0973デフォルトの名無しさん2006/11/20(月) 17:43:29
みなさん。
ちょっと解かったかもしれません。
つまり、
>>964でコンパイル出来るということは、32ビットで作業しているから。
本の作者は32ビットの環境でコンパイルしていたって事でしょうか?
Java のバージョンの問題?
OSの違い?
0974デフォルトの名無しさん2006/11/20(月) 17:43:50
精度や桁数がどうとかいう問題の前に、
ある型の変数に異なる型の値は入れられない、
というのを理解しているんだろーか。
0975デフォルトの名無しさん2006/11/20(月) 17:45:32
javaのバージョン (かな? コンパイラでバージョンアップと共にワーニングが厳しくなるのはよくある事)
もしくは本のバグ
0976デフォルトの名無しさん2006/11/20(月) 17:50:32
>>973
32bit の環境でコンパイルしたとか、OS が違うとかは考えにくい
java もしくは javac のバージョンが違うというのは、まあよくあること

最も多いのは、本の誤植もしくはバグ
0977デフォルトの名無しさん2006/11/20(月) 17:55:31
>>974
それは大丈夫だと思います。
int に 2.0 は入れられないということですよね。
int a;
a=2;
としなければいけないのは解かります。
2.0 は double で、2.0f とすれば float ということですね。
0978デフォルトの名無しさん2006/11/20(月) 18:07:54
本のバージョンは 1.4.1_01 で
私のバージョンは 1.5.0_09 でした。
Java のバージョン違いが原因?
とにかく、2.0 だと double になるというのが解かったので、本の float を double に置き換えながら、読み進めたいと思います。
0979デフォルトの名無しさん2006/11/20(月) 18:09:25
>>978
その本の名前を書いてちょ
0980デフォルトの名無しさん2006/11/20(月) 18:18:48
>>979
世界でいちばん簡単な
Java の e 本
Java の基本と考え方がわかる本

2003年6月1日 第1版第1刷発行

著者 堀江 幸生

発行 株式会社秀和システム

ISBN4-7980-0533-9 C3055

です。
0981デフォルトの名無しさん2006/11/20(月) 18:21:29
>>980
うーん、改訂入ってるんじゃないかな・・・
0982デフォルトの名無しさん2006/11/20(月) 18:30:01
質問です。

ttp://java.sun.com/applets/jdk/1.4/index.html

このページのGraphLayout (1, 2, 3, 4)のデモアプレットのソースが全部同じなんですけど
これのソースってどこかにないでしょうか?
0983デフォルトの名無しさん2006/11/20(月) 18:43:30
>>982
よく見ろよ
0984ぴゅあ2006/11/20(月) 18:57:38
>>978
>とりあえず、入門書を一通り読んでから、また来ます。
と言ってたからそれでいっか と思ってたけど、>>965,>>967で十分なものが出ているんじゃないかと思いました
(>float から float なら問題ないけど。
は"float aからfloat bへの代入…"とかいう表現の方がいいのかな?と思ったりはしたけど)

>>966では
>本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
ということだけど、"扱える桁数にある"というところもよく理解できていないような気もしたりします

解らなければ仕方ないのだろうけど
変に考え込み過ぎているんじゃないだろうか?という気もしたりです
コンパイラがエラーだと言っているんだから
解らないと思ううちは解らないなりに素直に従えばいいような気がしますけど
(いちおでも>>965,>>967の言ってることを把握できていれば)

また>>964に示されたコードはその本に書かれていたものなのでしょうか
あちしが選んで最初に買った唯一のJavaの書籍はかなり古いですが、>>965,>>967が言ってることはちゃんと解説されています(JDK 1.0.2頃に書かれたものらしい)
因みに最近主に使っているのは1.4.2_12で1.4.1よりは新しいけど、確認してみるとちゃんとエラーとして通知されるようです

>>964で
>これでコンパイルすると、エラーが出ます。
>検出値:double
>期待値:float
>となります。
と書かれているところから
"Exercise1.java:8: 精度が落ちている可能性"とか出ているだろうところを
落としてしまっているところにも理解に至れない問題があったりするのかも?
0985デフォルトの名無しさん2006/11/20(月) 23:00:42
>>984
>>964のコードは、本に書かれていた通りのものです。
float と double の違いについては殆ど触れられておらず、悩んだ挙句にここへ質問に来たわけです。
さっき、書店によって、他の本を見てきたところ、
「 float a=1.0f; 」と、数値の後に f をつける必要があるので注意と、ちゃんと書かれていました。
どうも、私の買った本に誤植があったということみたいです。

いろいろ教えてもらって、本当にありがとうございます。
こんなに親切なスレは初めてです。
0986デフォルトの名無しさん2006/11/20(月) 23:02:20
javaでwindowsのguiアプリって作れますか?
0987デフォルトの名無しさん2006/11/20(月) 23:06:59
applet
0988デフォルトの名無しさん2006/11/20(月) 23:14:28
>>983

同じだとおもうんですけど…
0989デフォルトの名無しさん2006/11/20(月) 23:18:26
>>986
できます
0990デフォルトの名無しさん2006/11/20(月) 23:27:51
>>988
HTML ファイルのソースをよく見ろよw
0991デフォルトの名無しさん2006/11/21(火) 02:16:15
アプレットにパラメータ与えられることを初めて知った俺うんこ
0992デフォルトの名無しさん2006/11/21(火) 03:35:58
これでpicoを二回実行しても一回しか音がならないのですが
どう直せばいいのですか?
public class SE {

static final int EXTERNAL_BUFFER_SIZE = 128000;
static AudioInputStream audioInputStream;
static AudioFormat audioFormat;
static DataLine.Info info;
static SourceDataLine line;
static File soundFile;
static SE se = new SE();
private SE(){
try{
soundFile = new File("se_saa01.wav");
audioInputStream = AudioSystem.getAudioInputStream(soundFile);
audioFormat = audioInputStream.getFormat();
info = new DataLine.Info(SourceDataLine.class,audioFormat);
line = (SourceDataLine)AudioSystem.getLine(info);
}catch(FileNotFoundException fe){ fe.printStackTrace();
}catch(IOException ie){ie.printStackTrace();
}catch(Exception e){
}
}
0993デフォルトの名無しさん2006/11/21(火) 03:36:46

public static void pico(){
try{
line.open(audioFormat);
line.start();

int nBytesRead = 0;
byte[] adData = new byte[EXTERNAL_BUFFER_SIZE];
while(nBytesRead != -1){
nBytesRead = audioInputStream.read(adData,0,adData.length);
if(nBytesRead >= 0){
int nByteWritten = line.write(adData,0,nBytesRead);
}
}
line.drain();
line.close();
}catch(Exception e){System.out.println(soundFile);}
}

}
0994デフォルトの名無しさん2006/11/21(火) 03:58:13
今日から始めた初心者です。if文について確認させてください。
{}を付けなかった場合のif範囲ですが、例えば以下のようなコードで…
 int i = 2;

 if (i == 1)
 System.out.println(1);
 System.out.println(2);
 if (i == 2)
 System.out.println(3);
 System.out.println(4);
この場合、コンソールには2,3,4が出力されます。
感覚的に3,4の出力を期待してしまうのですが、
これは特に{}で範囲を指定しない場合、
ifが見るのは直近の処理1つのみだからという認識でよいでしょうか?
0995ぴゅあ2006/11/21(火) 05:50:34
995
は?
0996ぴゅあ2006/11/21(火) 05:55:58
996
埋める。

| What search for?
|  It's cool!!!
| ┌────────────┐
| | How to eat you?       |
| |                   |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ
0997デフォルトの名無しさん2006/11/21(火) 05:57:44
>>992
どういう風にpicoを呼び出しているか分からないが、
そこに出ているソース以外には、SE.pico();SE.pico();しかないのなら、
二度目のpicoの呼び出しの時にはaudioInputStreamにはデータが残ってないから。
lineはpicoの呼び出しのたびに開いているのに、
audioInputStreamをSEのコンストラクタでしか開いていないのなら当然1回しか鳴らない。

>>994
if文で条件が成立したときに実行されるのは一つの単文か{}のブロックに囲まれた一つの複文。
どこまでがifの下についているか紛らわしいので、単文一つしかない時でも{}で囲めという規範の人もいる。
そのあたりはコーディング規約に従うか、無ければ個人の趣味に従うかすればいいと思う。
0998ぴゅあ2006/11/21(火) 05:59:41
| What search for?
|  It's cool!!!
| ┌────────────┐
| | How to eat you?       |
| |                   |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ
0999ぴゅあ2006/11/21(火) 06:01:05
久々の1000ゲット
| What search for?
|  It's cool!!!
| ┌────────────┐
| | How to eat you?       |
| |                   |
| └────────────┘
| [ オプション(O) ]   [ 検索(S) ]
|
`──────────┐ ┌───
           , '´l,  ..| ./
       , -─-'- 、i_  |/
    __, '´       ヽ、
   ',ー-- ●       ヽ、
    `"'ゝ、_          ',
      〈`'ー;==ヽ、〈ー- 、 !
       `ー´    ヽi`ヽ iノ
                ! /
              r'´、ヽ
              `´ヽノ
1000デフォルトの名無しさん2006/11/21(火) 06:01:38
うふふ
さいごのしょうしゃはかなりあかしらかしら〜
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。