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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさんNGNG
過去ログ、関連スレッド、よくある質問とその回答、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/

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

以下のエラーが表示されて、途方にくれているあなたは、下のページへ。
「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
http://www.wikiroom.com/java/?path%2Cclasspath

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

/* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。
質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */

また、当スレで質問をするかたは、回答をもらえたときに、
wikiの更新をして頂ければ、忝なく存じます。

JavaScriptの質問は、ここでは受け付けていません。
Web製作板をご利用ください。http://pc5.2ch.net/hp/
0153デフォルトの名無しさんNGNG
>>151はコンパイラが何かをわかっていないド素人
0154デフォルトの名無しさんNGNG
麻宮騎亜のマンガ
0155デフォルトの名無しさんNGNG
>>153
コンパイラってなんでつか?
0156デフォルトの名無しさんNGNG
>>153
どういう意味か分からんが、
Javaって言語仕様レベルで定数式の扱い規定されてなかったっけ?
0157デフォルトの名無しさんNGNG
>>155
麻宮騎亜のマンガ
0158デフォルトの名無しさんNGNG
>>157相手にされないからってしつこいのが哀れみを誘ってるぞ。
0159デフォルトの名無しさんNGNG
アニメーションGIFを表示する時の、ImageReaderで
各ページの相対XY座標を取得する方法を教えてください。
1ページ目がフルサイズCGで、2ページ目以降が部分CG
だと、その部分CGのXY位置をどこにすればいいのか
分からないのです。
0160デフォルトの名無しさんNGNG
>>158
麻宮騎亜のマンガ
0161デフォルトの名無しさんNGNG
>>152
J2SE 5.0(旧1.5)以降であれば printf 使えるので

byte[] array = "2ちゃんねる".getBytes("EUC-JP");
for (int i = 0; i < array.length; i++) {
 System.out.printf("%02X", array[i] & 0xFF);
}
System.out.println();
0162デフォルトの名無しさんNGNG
>>148と>>151どっちが嘘なんですか?
0163デフォルトの名無しさんNGNG
>>156
定数式の扱いは規定されてて、
浮動小数点数型の演算は strictfp 宣言無しで FP厳密でなければならないとか
文字列の定数式は intern() して一意なインスタンスを共有するとか書いてあるけど
コンパイル時に定数式を計算して値に置き換えろ、って規定は無かったと思われ。
勘違いだったらスマソ

でもまぁ、普通のコンパイラは定数式を値に置き換えると思うけど。
0164デフォルトの名無しさんNGNG
>>163
今Javapで逆汗してみたら値に置き換えていないね。
驚きました。
0165デフォルトの名無しさんNGNG
>>164
C:\temp\test>copy Test.java con
public class Test {
public static void main( String[] args ){
int x = 0;
x = 5+7+9+10;
System.out.println(x);
}
}

1 個のファイルをコピーしました。

C:\temp\test>javac Test.java

したのを javap したら以下のようになった。
0166デフォルトの名無しさんNGNG
>>164
そりゃだって変数だもん。
値に置き換えてるようだったら窓から投げ捨てる。
final修飾子が付いてりゃ値に置き換えてくれると思うがね。
0167デフォルトの名無しさんNGNG
C:\temp\test>javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: bipush 31
4: istore_1
5: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
12: return

}
ちゃんと値に置き換えてるように見えるけど。
0168デフォルトの名無しさんNGNG
C:\temp\test>javap -c Test
Compiled from "Test.java"
public class Test extends java.lang.Object{
public Test();
Code:
0: aload_0
1: invokespecial #1; //Method java/lang/Object."<init>":()V
4: return

public static void main(java.lang.String[]);
Code:
0: iconst_0
1: istore_1
2: bipush 31
4: istore_1
5: getstatic #2; //Field java/lang/System.out:Ljava/io/PrintStream;
8: iload_1
9: invokevirtual #3; //Method java/io/PrintStream.println:(I)V
12: return

}
ちゃんと値に置き換えてるように見えるけど。
0169166NGNG
ゴメン。ちょっと勘違い。
0170デフォルトの名無しさんNGNG
>>168
final修飾子つけたんですか?





ゲラゲラ
0171デフォルトの名無しさんNGNG
>>167
x = 0; は消えてないみたいだけど、
x = 5+7+9+10; は x = 31; 相当になってるみたいね。
0172デフォルトの名無しさんNGNG
>>170
       (  _,, -''"      ',             __.__       ____
   ハ   ( l         ',____,、      (:::} l l l ,}      /      \
   ハ   ( .',         ト───‐'      l::l ̄ ̄l     l        │
   ハ   (  .',         |              l::|二二l     |  ハ こ  .|
       ( /ィ         h         , '´ ̄ ̄ ̄`ヽ   |  ハ や │
⌒⌒⌒ヽ(⌒ヽ/ ',         l.l         ,'  r──―‐tl.   |  ハ つ │
        ̄   ',       fllJ.        { r' ー-、ノ ,r‐l    |  ! め │
            ヾ     ル'ノ |ll       ,-l l ´~~ ‐ l~`ト,.  l        |
             〉vw'レハノ   l.lll       ヽl l ',   ,_ ! ,'ノ   ヽ  ____/
             l_,,, =====、_ !'lll       .ハ. l  r'"__゙,,`l|     )ノ
          _,,ノ※※※※※`ー,,,       / lヽノ ´'ー'´ハ
       -‐'"´ ヽ※※※※※_,, -''"`''ー-、 _,へ,_', ヽ,,二,,/ .l
              ̄ ̄ ̄ ̄ ̄       `''ー-、 l      ト、へ
0173デフォルトの名無しさんNGNG
>>170
final つけたら 2行目の代入文でコンパイル時エラー出ると思うけど。
ソースは >>165 にあるから、自分で試してみれば?
0174デフォルトの名無しさんNGNG
× final つけたら 2行目の代入文でコンパイル時エラー出ると思うけど。
○ final つけたら 2つ目の代入文でコンパイル時エラー出ると思うけど。
0175デフォルトの名無しさんNGNG
文字列に関しては定数式によって生成される文字列はリテラルと同様に
扱う旨、規格に明記されている。でも整数リテラル等に関して記述がない
からこのあたりを行うかどうかはコンパイラの実装依存ってことでOK?
0176デフォルトの名無しさんNGNG
>>175
文字列も intern しろとは書いてあるが、
実行時に連結してはいけないとか、
コンパイル時に連結しなければならないと書いてないんだけどね。

整数リテラルに関して記述が無いってのが >>163 や >>175 の見落としだって可能性もあるし。
0177デフォルトの名無しさんNGNG
どうやらそうみたいね…
caseラベルとかでの定数式の扱いから、
定数式はコンパイル時に確定しないといけないんだと思ってた。
# いや、確定はするんだけど、ごめん、うまくいえないな…
0178デフォルトの名無しさんNGNG
あうち、>>177は>>175に対して書いたんだけど…
>>176の可能性もまぁあることはあるわな。
0179デフォルトの名無しさんNGNG
>>176 文字列に関してはコンパイル時に評価。
Strings computed by constant expressions (§15.28) are
computed at compile time and then treated as if they were literals.
0180デフォルトの名無しさんNGNG
垂直同期をとった画面更新をしたいんだけど、

GraphicsEnvironment ge = GraphicsEnvironment.getLocalGraphicsEnvironment();
GraphicsDevice gd = ge.getDefaultScreenDevice();
DisplayMode dm = gd.getDisplayMode();
int rr = dm.getRefreshRate();
if (rr == DisplayMode.REFRESH_RATE_UNKNOWN) rr = 60;

new java.util.Timer().scheduleAtFixedRate(new TimerTask(){
public void run(){
repaint();
}
}, 0, 4000 / rr);

だとうまくいかないっす。
どうすりゃいいんすか?
0181デフォルトの名無しさんNGNG
>>179
それって仕様なのか例なのか、わからんトコロに書いてあるので微妙。

例えば同じところで System.out.print((hello == ("Hel"+lo)) + " "); が false になってるけど、
"Hel" + lo(値は"lo") が最適化の結果 true になってはいけないとは思えないし。
0182デフォルトの名無しさんNGNG
>>180
それどこが垂直同期とってるんだ?
時間管理してるだけじゃないのか?

垂直同期取るためにはフルスクリーンにしてflipするべし
それ以外は垂直同期取れないのでタイマ管理が必要になる

ついでにリフレッシュレートは確実にいじれないので
フルスクリーンモードだからといってそのまま使わずに
垂直同期周波数をチェックして時間管理を入れるべし

垂直同期+時間管理だとティアリングは発生しないものの、
(おもに2Dゲームでは)がたつきが気になると思う
どうせウインドウモードではティアリング発生するのだから
たとえば60Hz以外と判断したときは垂直同期取らないとか
オプションで自由にいじらせるとかそういった考慮が必要
0183デフォルトの名無しさんNGNG
>>181
今回の例は冒頭に
This example illustrates six points:
とあるように、ある規則をを例示するための
例であることが明示されているから、ただの
一実装例だと判断するのは間違いでしょ。
http://java.sun.com/docs/books/jls/second_edition/html/lexical.doc.html#101083

あと、あの言語仕様を通して読むと、ある例が出され、その範囲をはみ出す例外が
存在するときは必ず明記されているから、それがないときはまあmustと
考えていいとおもう。一部のRFCみたいにmust/should/mayの使い分けが
強制されてないから文脈で判断するしかない曖昧さは残るけどね。
0184デフォルトの名無しさんNGNG
>>183
しかし、その部分以外には
> 実行時に連結してはいけないとか、
> コンパイル時に連結しなければならない
と読める部分が無いのは相当弱いと思われ。

例証でしか書かれていない部分まで「言語仕様」として読んでよいものか微妙。
0185デフォルトの名無しさんNGNG
>>181
|例えば同じところで System.out.print((hello == ("Hel"+lo)) + " "); が false になってるけど、
|"Hel" + lo(値は"lo") が最適化の結果 true になってはいけないとは思えないし。
おいおい... さすがにJavaの規格としてこの手の非互換性を許す
ようなことはないだろ...
言葉遊びや文章の揚げ足取りもいいけど、
なんのための文章がかかれているかってことはよみとってやれよ
0186デフォルトの名無しさんNGNG
>>185
いや、その部分はさらに微妙なんだが。

System.out.print((hello == ("Hel"+lo)) + " "); が false になる部分の説明は
> Strings computed at run time are newly created and therefore distinct.
としか書いてなくて、"Hel" + lo は実行時に計算しなければならないとは一切書いてないし
他の部分にも そんな記述は無いはず。
0187185NGNG
>>186
だからね、俺がいいたいのは、どこにかいてある・書いてない
じゃなくて、その6項目がなければ181が自分でいうようにコンパイラの動作に
非互換性が生じるのよ。
で、この手の基本的なレベルで非互換性が
出るようなことはありえないだろ?だからそこは例じゃなくて仕様
が書いてあると読み取ってあげるのが普通じゃないの?
0188デフォルトの名無しさんNGNG
>>187
非互換といえば、1.3 までの javac が言語仕様に従わずに
import SimpleName; を容認してたのが
1.4 から容認しなくなったのでも非互換が生じたけど。

言語仕様というのは完全で漏れが無い事を目指して作るものだから、
書いてない事は仕様でないと考えるべきだと思われ。

もっとも、実装するときは仕様に書いてある例と同じ出力にするだろうけど。
0189デフォルトの名無しさんNGNG
俺も>>185のいうことに同意だな
コンパイラの最適化でこの例の結果が変わるとは思えない。
むしろコンパイラの仕様がこの例の通りにならなかったら単にバグでしょ
0190デフォルトの名無しさんNGNG
>>189
欠陥が有るとしたら仕様書のほうにあるんじゃないのか?
0191デフォルトの名無しさんNGNG
ぬるぽ
0192185NGNG
|非互換といえば、1.3 までの javac が言語仕様に従わずに
|import SimpleName; を容認してたのが
|1.4 から容認しなくなったのでも非互換が生じたけど。
これは実装レベルでの話で別の話。いま話しているのは
規格レベルで非互換性を許すかどうか。

|言語仕様というのは完全で漏れが無い事を目指して作るものだから、
|書いてない事は仕様でないと考えるべきだと思われ。
だから、書いてあるじゃん。あれを仕様だととらずに
ただの例だと読み取るのはそうとうアレ。
This examplesの指す範囲はあくまでもその上のコードと出力結果だろう。
例を先に出す構成は悪文だとは思うがね。
0193デフォルトの名無しさんNGNG
> System.out.print((hello == ("Hel"+lo)) + " ");

これって見ての通り、リテラル+リテラルじゃなくて、
リテラル+変数だからfalseで当たり前の例なんだよね。
0194デフォルトの名無しさんNGNG
>>193
仕様をよく読むとそれには二通りの解釈が成り立つ。
0195デフォルトの名無しさんNGNG
>>192
> 規格レベルで非互換性を許すかどうか。
いわゆる「解釈の違い」って奴ですよ。規格自体は変わらない。
0196デフォルトの名無しさんNGNG
ヌルポ
0197デフォルトの名無しさんNGNG
>>195
それは、規格に漏れがあるということであり、
㋖∠の欠陥じゃないか?
0198デフォルトの名無しさんNGNG
>>191,196
ガッ
0199デフォルトの名無しさんNGNG
>>191
ペッ
0200デフォルトの名無しさんNGNG
何とか一日で200レス達成しました。
協力してくださった皆さんどうもありがとうございます。
0201デフォルトの名無しさんNGNG
Javaは釣りネタに事欠かないなぁw
0202180NGNG
>>182
ありがとう。
フルスクリーンにしてBufferStrategy使ったらできました。
でもこれだとコンポーネントが表示されなくなるな。
垂直同期はあきらめるか。
0203デフォルトの名無しさんNGNG
結局、言語仕様を好意的に読むと、元ネタの>>165は
コンパイル時にx=31になるでFA?
0204デフォルトの名無しさんNGNG
>>201
さびしい土曜日ですね。
0205デフォルトの名無しさんNGNG
>>183
構成の話をすれば、
JLS は明示的で抽象的な仕様が書いてあって、
それから暗黙に導かれるルールが例とかで補足されるのは結構あるけど、

あの二つは先行する明示的な仕様から導くのは無理だし。
0206デフォルトの名無しさんNGNG
>>203
それは言語仕様的にはコンパイラはx=31にしても良いし、しなくても良いでFA。

今やってるのは文字列連結の定数式だけだから。
0207デフォルトの名無しさんNGNG
>>204
仕事ですが何か
0208デフォルトの名無しさんNGNG
しかし、あの例って確かに微妙だわ。
あの例をすなおに解釈すると、
hello
Other.hello
"Hel"+"lo"の演算結果というかコンパイラの最適化結果
は、同じインスタンスを指していて
"Hel"+loの演算結果
だけは、別インスタンスということになる。
で、真の値intern値は5つとも共通と、、、。
0209デフォルトの名無しさんNGNG
>>207
釣りが?
さらに寂しいね。
0210デフォルトの名無しさんNGNG
>>209
無職がうらやましいよ
0211デフォルトの名無しさんNGNG
>>210
2chで釣りするのが仕事なら、無職でもいいや。
0212デフォルトの名無しさんNGNG
>>211
釣士ですらスレの趣旨に沿って書き込んでるのに、お前はなんだ?
ん?




ていうか、俺が釣ってましたw
>>201は無関係だと思う。
0213デフォルトの名無しさんNGNG
ニートの発想って、ホント貧相

日本の代表的なニート
ttp://www.gazo-box.com/wara/img-box/img20040724044408.jpg
0214デフォルトの名無しさんNGNG
>>206
それが FA だとすると
1 + 2 だと必ずしもコンパイル時に計算しなくてもいいけど
1 + 2 + "" だと絶対にコンパイル時に計算しなきゃいけないんだよね。

なんか統一感ないね。
0215デフォルトの名無しさんNGNG
>>214
お前の頭の悪さは格別だな。
0216デフォルトの名無しさんNGNG
おれも>>214と同じように感じるよ
何か統一感ないね
というか言語仕様でコンパイラ最適化を思わせる例がでていて
ほかのリテラルに適用されないってどうよ?
0217デフォルトの名無しさんNGNG
あの、くだらない質問で申し訳ないんですけど、classloaderにdefineclass
ってあるじゃないですか。んで、それはバイト列としてバイトコードをわたせば
クラスとかができるらしいんですね。
 で、VMが現在実行中、もしくは、これはから実行されていくバイトコードを
得る事ができたら、ネットワークに投げたりして、完璧な遠隔実行とか可能
だと思うんです(性能は別として)。そんな事できるんでしょか?そういった機能
をVMにインプリメントするとか。
 defineclassはクラスを作るから、そんなんじゃなくて、実行するためバイトコードを
バシバシ渡せるメソッドとかがあれば最高。
 私の妄想でしょうか?
0218デフォルトの名無しさんNGNG
既にそういうクラスローダーあるけど?
0219デフォルトの名無しさんNGNG
servlet/jspのセッションの消滅時に処理をはさむことは
できますでしょうか?
できるとすればどのようにすればいいでしょうか?
ブラウザが閉じられたりタイムアウトしたときにログにメッセージを表示したり
したいと思ってます。
0220デフォルトの名無しさんNGNG
できる
リスナー登録
ブラウザを閉じるタイミングだとJavaScript併用かな
タイムアウトはOK
0221デフォルトの名無しさんNGNG
【Java】Apache Jakarta Commons
http://pc5.2ch.net/test/read.cgi/tech/1094954163/
0222デフォルトの名無しさんNGNG
>>219
エラーページを作るってのはどうよ?
<%@ %> 内で指定するディれくてぃぶでそういうのが遭ったと思うが
0223デフォルトの名無しさんNGNG
>>219
ログインしていないときは、
そのページでログインしているかどうかをif文で判定して、
java.util.Loggerなどでログを残しつつ
例外も投げ、
エラーページにforwardするってのもありだと思うが。
0224デフォルトの名無しさんNGNG
>>222-223
なんか的外れ・・・
0225デフォルトの名無しさんNGNG
もちつけ。
ttp://page9.auctions.yahoo.co.jp/jp/auction/k6437674
0226デフォルトの名無しさんNGNG
>>220
セッション情報をファイルに書き込むようにしたら、リスナーが呼ばれなくなったことがあってウツ。
Tomcat4.0のころだったと思うが。
今はどうなのかな。
0227デフォルトの名無しさんNGNG
>>225
死体・・・クリック注意。
0228デフォルトの名無しさんNGNG
>>225
発砲スチロールあんどラテックス製か
よくできてるな
0229デフォルトの名無しさんNGNG
実物じゃないので、逆に怖い。
本物はリアリティー優先で怖さは優先されてないからな。
0230デフォルトの名無しさんNGNG
>>217
URLClassLoader
0231デフォルトの名無しさんNGNG
>>230
>>218
ありがとうございます。

 えーと、こういった感じ(クラスとかそういう単位じゃなく)、実行中の生バイトーコードを
VMから得るメソッド、与えて実行させるメソッドってのがないかな?って思ってる
んです。知ってる方いないでしょうか?
 サードパティーとかどっかの自作クラスとかでもかまいません。
 おねがいします。
0232デフォルトの名無しさんNGNG
×バイトーコード
○バイトコード
0233デフォルトの名無しさんNGNG
DBの接続情報などを外部ファイル化するとして、
そのファイルをクラス階層に置くべきか否かで指針となるものってありますか?
0234デフォルトの名無しさんNGNG
>>233
環境に依存する情報は、クラス階層におくべきではない。
0235デフォルトの名無しさんNGNG
メソッド ×
メソッドー ○
0236デフォルトの名無しさんNGNG
クラス階層っていうのがなんのことかわからんが。
リソースにするのなら、クラスパスが通るところに置くべきだし。
0237デフォルトの名無しさんNGNG
×バイトコード
○バイトコドー
0238デフォルトの名無しさんNGNG
>>236
DBの接続情報なんかをリソースにするのはいかんだろ。
クラスパスが通るところというのは、環境依存しない情報しかおくべきではないだろう。
たとえば、メッセージリソースとかな。
0239デフォルトの名無しさんNGNG
>>231
>実行中の生バイトーコードをVMから得るメソッド
Debugger Interfaceとか。
http://java.sun.com/j2se/1.4/ja/docs/ja/guide/jpda/jvmdi-spec.html#GetBytecodes

>与えて実行させるメソッド
メソッドだけではバイトコードとしては存在できないので
適当なクラスを作ってそれのメソッドとする。
動的にクラスを作るライブラリとしてはBCELとかjavassistとか。
0240デフォルトの名無しさんNGNG
>>238
じゃあ、クラスパス通らないところにおいて、絶対パスでファイル読み込みか?
そのほうが良くないだろ。
メッセージリソースも、ロケールという環境に依存するわけだが。

クラスパスが通るところ、つまりリソースにしないとして、設定ファイルはどこに置くんだ?
レジストリ?大げさだな。
0241デフォルトの名無しさんNGNG
>>231
> 実行中の生バイトーコードをVMから得るメソッド、

Class#getResourceAsStream()

>与えて実行させるメソッドってのがないかな?って思ってる

Classオブジェクトが得られれば後はどうにでもできる。

動的に「バイトコードを作る」のなら>>239

リフレクションについてもっと調べてから出直してこい。

君に、ある程度の知識と説明能力が無けりゃ何がやりたいのかこっちがが理解できん。
0242デフォルトの名無しさんNGNG
>>240
メッセージリソースはクラス階層に置き、
環境依存パラメータは絶対パスでファイル読みということだ。
どっちもリソースにしてしまうと、複数環境へ配布するときに煩雑になるぞ。
0243デフォルトの名無しさんNGNG
>>241
1行おき、やめれ。
0244デフォルトの名無しさんNGNG
>>242
クラス階層って何だ?
たとえばclassesディレクトリ直下とかいう意味?
0245デフォルトの名無しさんNGNG
>>242
じゃあその絶対パスはソース直書きか?
さらに複数環境に対応できんな。
複数環境に配布するからこそ、クラスパスだと思うのだが。
0246デフォルトの名無しさんNGNG
>>242
おまえはクラスパスとリソースについて、勉強しなおす必要があるな。
0247デフォルトの名無しさんNGNG
相対パスで書けるじゃん
たとえば servlet.getServletContext().getRealPath("hoge") みたいに
0248デフォルトの名無しさんNGNG
>>247
Webではないアプリケーションはどうするんだ?

そんなんWebの場合はコンテナの設定ファイルが使えるから、設定ファイルの話ははっきりいって関係なかろう。
Tomcatであればデータベースの設定なんかcontext.xmlにJNDIリソース登録するわけだし。
0249デフォルトの名無しさんNGNG
>>242を好意的に解釈すると
環境依存パラメータを記述したファイルを-Dオプションで絶対パス指定するのかも知れない。
0250デフォルトの名無しさんNGNG
>>245
実行時パラメータで渡すのが吉。
複数環境ということは、当然DBの接続情報も変わるわけだが、
クラス階層にあるリソースファイルを環境単位に用意するのは、
気持ち悪いでしょ?

>>247
サーブレットなら、それでもいいね。
0251デフォルトの名無しさんNGNG
たとえばeclipseはどうやって解決してるのか?って話だろ。
0252デフォルトの名無しさんNGNG
配布先がWindows系とUnix系両方だったとすると、
やはり、実行時パラメータで渡すだろう。
そのためのバッチファイル&シェルを用意すると。
■ このスレッドは過去ログ倉庫に格納されています