【初心者】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:50Class A と Class B を作って A のメインクラスで B のオブジェクトを利用します。
それでしばらく使っていたんですが、ある時ふと、B のオブジェクトから A 非 static なメソッドを利用したいと思って、
そこで B のクラス内で A のオブジェクトを作るコードを書いて実行してみました。
実は実行するまでこのアプリは無限にオブジェクトをループで作り続けて実行できないと思っていたのですが、
実際は何も問題無くできたんです。
さて、どうして無限にオブジェクトができなかったんだろう?って疑問に思ったんですが、実際プログラムはどんな参照をして
動いていたんでしょうか。
お馬鹿な質問ですがよろしくお願いします。
0952デフォルトの名無しさん
2006/11/20(月) 11:24:18B のクラス内で A のオブジェクトを作ったからといって
A のメインクラスが実行されるわけではないから。
つまり、Bのクラス内で A のオブジェクトを作っただけ
なら、そのとき作られた A のオブジェクトの中で、「新
たに B のオブジェクトを作るロジック」が動作するわけ
ではない。
0953デフォルトの名無しさん
2006/11/20(月) 11:29:51ありがとうございます。
でも、どうして新たに B のオブジェクトを作ろうとしないのでしょうか。
A のクラス内には B b = new B(); が実行されているのに不思議だと思います。
勉強が足りなくてすみません。
0954デフォルトの名無しさん
2006/11/20(月) 11:34:080955デフォルトの名無しさん
2006/11/20(月) 11:35:52す、すみません!(;_;
分かりやすく教えて頂けると思ったので・・・・。
本にも聞いてみます!
0956ぴゅあ
2006/11/20(月) 11:55:28本に聞いてもすんなり答えてくれることは少ないかも?と思ったりもするけど…
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ぴゅあさん、レスありがとうございます。
丁寧な解説で、どのように再帰が動いているのか掴むことが出来ました。
宿題の方ですが、「末尾の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いやそれは
>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ありがとうございます。やってみます。
0961デフォルトの名無しさん
2006/11/20(月) 15:04:37ぴゅあさんありがとうございます。
B のオブジェクトが A のオブジェクトを作ったときに、作られた A のオブジェクトが B のオブジェクトを
作るコードの所を通っているかどうかを確認しなさいって事ですね。
今から暇を見て確認してみます。
それよりも、相互に作り続ける簡単なコードを書いてもいいかもですのでやってみます。
0963961
2006/11/20(月) 15:41:30結果、StackOverflowError が発生して処理がストップしました。
少しずつ>>952さんの説明が理解できて来ました。ありがとうございます。
当り前な事でも馬鹿な実験でもしないと理解できない飲み込みの悪い新人でした。
お邪魔しました。
0964デフォルトの名無しさん
2006/11/20(月) 15:44:12//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:022.0という値の型がdoubleだから。
2.0f と書くとfloatの定数になる。
0966デフォルトの名無しさん
2006/11/20(月) 16:14:15すいません。理解できません。
本には、floatとdoubleの違いは、扱える桁数にある、と書かれていたのですが…
それ以外にも違いがあるということでしょうか?
0967デフォルトの名無しさん
2006/11/20(月) 16:16:33double から float への変換は、精度が悪くなる変換なので
キャストしないとコンパイル時に怒られる。
float から float なら問題ないけど。
0968ぴゅあ
2006/11/20(月) 16:22:55>>963
>当り前な事でも
誰が当たり前と決めたのか知らないけど
どんな些細なことでも実際にやってみることが大切だと思いますけどね
0969デフォルトの名無しさん
2006/11/20(月) 16:33:58せっかく答えて頂いたのに、私の理解力が追いついていません。
とりあえず、入門書を一通り読んでから、また来ます。
ありがとうございました。
0970デフォルトの名無しさん
2006/11/20(月) 17:16:302.0 と書いただけだと double になるのよ。だから内部的には2進数で
0100000000000000000000000000000000000000000000000000000000000000
として保持される。64ビットを使って表現してるわけですよ。さてここで
あえて float だと指定してすると(※ 2.0f と書く(>>965を参照))今度は
01000000000000000000000000000000
というように32ビットの表現になるわけですよ。扱える桁数が違うとか、
数値の精度が違うというのは、こういうことです。
>>964>>966>>969は、わかりましたか?
0971970
2006/11/20(月) 17:20:420972デフォルトの名無しさん
2006/11/20(月) 17:33:26float と 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もしくは本のバグ
0976デフォルトの名無しさん
2006/11/20(月) 17:50:3232bit の環境でコンパイルしたとか、OS が違うとかは考えにくい
java もしくは javac のバージョンが違うというのは、まあよくあること
最も多いのは、本の誤植もしくはバグ
0977デフォルトの名無しさん
2006/11/20(月) 17:55:31それは大丈夫だと思います。
int に 2.0 は入れられないということですよね。
int a;
a=2;
としなければいけないのは解かります。
2.0 は double で、2.0f とすれば float ということですね。
0978デフォルトの名無しさん
2006/11/20(月) 18:07:54私のバージョンは 1.5.0_09 でした。
Java のバージョン違いが原因?
とにかく、2.0 だと double になるというのが解かったので、本の float を double に置き換えながら、読み進めたいと思います。
0979デフォルトの名無しさん
2006/11/20(月) 18:09:25その本の名前を書いてちょ
0980デフォルトの名無しさん
2006/11/20(月) 18:18:48世界でいちばん簡単な
Java の e 本
Java の基本と考え方がわかる本
2003年6月1日 第1版第1刷発行
著者 堀江 幸生
発行 株式会社秀和システム
ISBN4-7980-0533-9 C3055
です。
0981デフォルトの名無しさん
2006/11/20(月) 18:21:29うーん、改訂入ってるんじゃないかな・・・
0982デフォルトの名無しさん
2006/11/20(月) 18:30:01ttp://java.sun.com/applets/jdk/1.4/index.html
このページのGraphLayout (1, 2, 3, 4)のデモアプレットのソースが全部同じなんですけど
これのソースってどこかにないでしょうか?
0983デフォルトの名無しさん
2006/11/20(月) 18:43:30よく見ろよ
0984ぴゅあ
2006/11/20(月) 18:57:38>とりあえず、入門書を一通り読んでから、また来ます。
と言ってたからそれでいっか と思ってたけど、>>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>>964のコードは、本に書かれていた通りのものです。
float と double の違いについては殆ど触れられておらず、悩んだ挙句にここへ質問に来たわけです。
さっき、書店によって、他の本を見てきたところ、
「 float a=1.0f; 」と、数値の後に f をつける必要があるので注意と、ちゃんと書かれていました。
どうも、私の買った本に誤植があったということみたいです。
いろいろ教えてもらって、本当にありがとうございます。
こんなに親切なスレは初めてです。
0986デフォルトの名無しさん
2006/11/20(月) 23:02:200987デフォルトの名無しさん
2006/11/20(月) 23:06:590988デフォルトの名無しさん
2006/11/20(月) 23:14:28同じだとおもうんですけど…
0989デフォルトの名無しさん
2006/11/20(月) 23:18:26できます
0990デフォルトの名無しさん
2006/11/20(月) 23:27:51HTML ファイルのソースをよく見ろよw
0991デフォルトの名無しさん
2006/11/21(火) 02:16:150992デフォルトの名無しさん
2006/11/21(火) 03:35:58どう直せばいいのですか?
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:46public 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範囲ですが、例えば以下のようなコードで…
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は?
0996ぴゅあ
2006/11/21(火) 05:55:58埋める。
| What search for?
| It's cool!!!
| ┌────────────┐
| | How to eat you? |
| | |
| └────────────┘
| [ オプション(O) ] [ 検索(S) ]
|
`──────────┐ ┌───
, '´l, ..| ./
, -─-'- 、i_ |/
__, '´ ヽ、
',ー-- ● ヽ、
`"'ゝ、_ ',
〈`'ー;==ヽ、〈ー- 、 !
`ー´ ヽi`ヽ iノ
! /
r'´、ヽ
`´ヽノ
0997デフォルトの名無しさん
2006/11/21(火) 05:57:44どういう風にpicoを呼び出しているか分からないが、
そこに出ているソース以外には、SE.pico();SE.pico();しかないのなら、
二度目のpicoの呼び出しの時にはaudioInputStreamにはデータが残ってないから。
lineはpicoの呼び出しのたびに開いているのに、
audioInputStreamをSEのコンストラクタでしか開いていないのなら当然1回しか鳴らない。
>>994
if文で条件が成立したときに実行されるのは一つの単文か{}のブロックに囲まれた一つの複文。
どこまでがifの下についているか紛らわしいので、単文一つしかない時でも{}で囲めという規範の人もいる。
そのあたりはコーディング規約に従うか、無ければ個人の趣味に従うかすればいいと思う。
0998ぴゅあ
2006/11/21(火) 05:59:41| It's cool!!!
| ┌────────────┐
| | How to eat you? |
| | |
| └────────────┘
| [ オプション(O) ] [ 検索(S) ]
|
`──────────┐ ┌───
, '´l, ..| ./
, -─-'- 、i_ |/
__, '´ ヽ、
',ー-- ● ヽ、
`"'ゝ、_ ',
〈`'ー;==ヽ、〈ー- 、 !
`ー´ ヽi`ヽ iノ
! /
r'´、ヽ
`´ヽノ
0999ぴゅあ
2006/11/21(火) 06:01:05| What search for?
| It's cool!!!
| ┌────────────┐
| | How to eat you? |
| | |
| └────────────┘
| [ オプション(O) ] [ 検索(S) ]
|
`──────────┐ ┌───
, '´l, ..| ./
, -─-'- 、i_ |/
__, '´ ヽ、
',ー-- ● ヽ、
`"'ゝ、_ ',
〈`'ー;==ヽ、〈ー- 、 !
`ー´ ヽi`ヽ iノ
! /
r'´、ヽ
`´ヽノ
1000デフォルトの名無しさん
2006/11/21(火) 06:01:38さいごのしょうしゃはかなりあかしらかしら〜
10011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。