1 名前:デフォルトの名無しさん [2008/03/01(土) 18:16:51 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作板をご利用ください。pc10.2ch.net/hp/ 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/ これからJavaでプログラミングを始めたいが、何をすればいいかわからない人も、 wikiからのリンクをおたどりください。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド112【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1202467704/ /* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。 質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */ また、当スレで質問をするかたは、回答をもらえたときに、 wikiの更新をして頂ければ、忝のう存じます。 次スレは>>980 あたりで。
411 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 13:41:38 ] JMonkeyEngineってのがある
412 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:42:43 ] クラスの停止について質問です。 今ゲームを作っていて、オープニング画面とゲーム画面の2つをつくりました。 まずオープニングをJFrameに表示、その後キーボード入力でオープニング画面を消してから ゲーム画面を表示するという構想で進めてます。 そこでオープニング画面のクラスを停止させたいのですが、やり方がわかりませんでした。 そもそも一度実行したクラスを停止させること自体無理なのでしょうか?
413 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:44:28 ] クラスを停止?何言ってるんだ
414 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:47:12 ] クラスの停止とか、色々と勘違いしていると思うが・・・ 後で再描画するならばsetVisible(false)で非表示にする 二度と表示しないならばdispose() で破棄する
415 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:51:44 ] JPanelを2つ作って、片方を表示させた後、同じ場所にもう一方のJPanelをすり替えて表示させたいです。 今表示しているJPanelを消す=JPanelを継承しているクラスを停止させるという表現しかできませんでした。
416 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:53:14 ] JFrame の GUI に今あるアプレットが使えると思ってはめ込んでみたんだけど どうもドロップダウンしたメニューがアプレットの後ろに描画されてしまう様子。 アプレットは JRootPane を使っているはずだがこれが原因?
417 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:53:42 ] >>414 ありがとうございます。 さっそくやってみます。
418 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 14:57:46 ] それをJPanelの交換により行うってのはどうなんだろう。 JPanelを継承した、例えばExJPanelに画面の状態を表すオブジェクトを保持させてればいいんじゃね? public final class ExJPanel extends JPanel { private Mode mode = new StartMode(); public void paint(Graphics g) { mode.paint(g); mode = mode.nextMode(); } } public interface Mode { void paint(Graphics g); Mode nextMode(); } みたいな
419 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:16:03 ] >>412 CardLayout使えば?
420 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:24:18 ] >>418 JPanelの継承やってみます。ありがとうございます。 >>419 cardLayoutも調べているうちに見つけたのですが、脳みそが足らないばかりに うまくいきませんでした。教えて下さったのにすいません。
421 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:29:18 ] まあ、Swingは最初は覚えること多いから仕方ない. ゲームのオープニング画面みたいな起動画面であれば、すぐに表示するべきだから、別JPanelでいいと思う。 画面を出している間に、ゲーム用のコンポーネントを裏側で作るってのは正しいしね。 俺は乗せ換えでいいと思うよ。 1.JFrameにメインのコンポーネントを乗せる。 2.メインコンポーネントに、タイトル画面コンポーネントを設定して描画 3. スタートボタンなどが押されたらメインフレームからタイトルコンポーネントを抜いて差し替える
422 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:48:44 ] SplashScreen とは違うことをやりたいの?
423 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:49:48 ] ゲームのオープニング画面はスプラッシュスクリーンとは別物だろ
424 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 15:57:55 ] JPanel p = (JPanel)getContentPane(); JPanel p1, p2; p.add(p1); …… p.setVisible(false); p.remove(p1); p.add(p2); p.setVisible(true); 俺なんか、全部交換。
425 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:11:55 ] >>412 ですが無事完成しました。 みなさんアドバイス本当にありがとうございました。
426 名前:416 mailto:sage [2008/03/13(木) 16:16:16 ] JApplet の内容を JPanel に分離してそっちを JFrame と共有するようにしたら メニューが裏に廻らなくなった。マジかよ。
427 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 16:37:00 ] >>426 JApplet自身は重量コンポーネントだからじゃない?
428 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 17:06:37 ] >422 Splashにボタンとかつけられたっけ? 自前でWindowを使って作るならばできるだろうけど
429 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 22:45:03 ] あるクラスに含まれるクラスを再帰的に抽出する方法ってあるでしょうか? 擬似コードを書くと、 Target hoge=new Target(); Class[] classes; classes=hoge.getClass().***.getAllClasses(); みたいな感じのことができるといいなあと思っているのですが。
430 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:09:23 ] 含まれるの意味が解らん 依存クラス数なら適当なMetrics測定ツール使えばいい
431 名前:429 mailto:sage [2008/03/13(木) 23:42:26 ] >>430 別の言い方をすると、あるクラスがimportしているクラスを 再帰的に取得したいといことです。 (あるクラスがimportしているクラス、そのクラスの import対象のクラスがそれぞれimportしているクラス…というように、 依存関係のクラスオブジェクトをすべて取得する) いっそclassファイルをバイト列のイメージにして文字列から解析した方が早いでしょうか?
432 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:43:42 ] importはincludeじゃないぞ……
433 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:54:37 ] >>431 importと依存は関係ないぞ。 java.lang.Classにはそういう情報を得る手段はないから、バイトコード を解析するしかないんじゃないかねー。
434 名前:デフォルトの名無しさん mailto:sage [2008/03/13(木) 23:54:50 ] MyClassLoaderで何とかならないかね
435 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 00:52:46 ] ダイナミックプロキシを使ってインスタンス化したオブジェクトのクラス名になる $1 とか $2 とか、 この番号に何か名前って付いてますか?
436 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 01:08:15 ] >431 で、解析して何がしたいんだ?
437 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 08:33:31 ] アノテーションの引数にオブジェクトを指定できないのは何でですか? @Foo(new Bar()) とかしたいんですけど。
438 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 09:05:14 ] そういう仕様だから
439 名前:デフォルトの名無しさん [2008/03/14(金) 14:10:18 ] fileクラスのrenameToで成功してもgetNameで名前が変わってないんですがどうしてでしょうか
440 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 14:15:02 ] >>439 細かいけど、Fileな javadocよく読めば分かると思うけど、Fileはimmutableだから
441 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 14:15:16 ] >>439 java.io.File はファイルそのものを表現してるんじゃなくてファイル名を表現してるから、 renameTo でファイルそのものの名前が変わっても影響を受けない。
442 名前:デフォルトの名無しさん [2008/03/14(金) 14:26:29 ] >>440 >>441 ありがとうございます。もっと調べてみます。
443 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:29:04 ] >>410 >>411 そうか。マルチプラットフォームではああいうゲームは無理か。 ところで、JavaのアプリとCのアプリで共有メモリーってさすがに無理だよね。 データをプロセス間で共有する場合、どういうことするんですか?
444 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:35:10 ] つDB
445 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 21:59:31 ] つパイプ
446 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:01:16 ] つソケット
447 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:06:56 ] >>443 ファイルを介してファイルマッピングという形でなら、たぶんできるんじゃない? 使い物になるかどうかは微妙かもしれないけど
448 名前:デフォルトの名無しさん mailto:sage [2008/03/14(金) 22:18:48 ] >>443 lab.moyo.biz/wiki/index.php?Java%2F%E8%A8%AD%E8%A8%88%2F%E4%BB%96%E8%A8%80%E8%AA%9E%E3%82%A4%E3%83%B3%E3%82%BF%E3%83%BC%E3%83%95%E3%82%A7%E3%83%BC%E3%82%B9
449 名前:デフォルトの名無しさん [2008/03/15(土) 09:11:19 ] プロトコルハンドラって何に使うものなんですか? よろしくお願いします。
450 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 09:39:52 ] ttp://www.google.co.jp/search?sourceid=navclient&hl=ja&ie=UTF-8&rls=GGLD,GGLD:2005-13,GGLD:ja&q=%e3%83%97%e3%83%ad%e3%83%88%e3%82%b3%e3%83%ab%e3%83%8f%e3%83%b3%e3%83%89%e3%83%a9
451 名前:デフォルトの名無しさん [2008/03/15(土) 09:51:11 ] JFileChooserで、 ・ディレクトリ選択 ・でも、普通のファイルも見れる ようにしたいんですけどどうすればいいですかね? ディレクトリ選択するようにすると、普通のファイルは見えなくなるし、 普通のファイル見えるようにするとディレクトリ選択できなくなるんですけど
452 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 09:59:35 ] ディレクトリ選択でファイルを見せる意味が分からん
453 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 10:03:46 ] ファイルが見えるとなんのディレクトリかよくわかるじゃん
454 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 10:07:05 ] 試して無いけど、approveSelectionメソッドをオーバーライドすればいけるんじゃね? setFileSelectionModeでFILES_AND_DIRECTORIESを指定してさ。
455 名前:デフォルトの名無しさん [2008/03/15(土) 10:13:37 ] 此処で良いのか疑問ですが質問です。 OS:WindowsXP IE6/Firefox/2.0.0.12 Sun Java Standerd Edition 6 バージョン6 アップデート5 (ビルド1.6.0_06-b13) 先日アップデートした処、Javaの起動で「Javaコンソール」を表示しないと実行されません。 コンソールを非表示でJavaの実行は無理なのでしょうか? どうか教えて下さい。
456 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 10:15:05 ] うん、できた。 public class JDirectoryChooser extends JFileChooser { @Override public void approveSelection() { if (getSelectedFile().isFile()) return; super.approveSelection(); } public static void main(String[] args) { JFileChooser c = new JDirectoryChooser(); c.showOpenDialog(null); } }
457 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 10:57:35 ] u5ってu4のセキュリティフィックスだよね。 そろそろ入れようと思ってたけどなんか色々問題あるみたいだね。
458 名前:451 [2008/03/15(土) 11:39:37 ] >>456 c.setFileSelectionMode(JFileChooser.DIRECTORIES_ONLY); を一行追加してみても、だめでした。 さらに public boolean accept(File f){return true;} を追加してみてもだめでした。
459 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 11:44:41 ] ちゃんと>>456 の書き込み読んでる?
460 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:37:06 ] 内部クラスの中に内部クラスを作ったりって普通にしますか? 経験も積んでないのですが少し気持ちが悪い気がして質問しました。
461 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 13:59:26 ] 全くしない訳ではないが普通しない
462 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 14:00:19 ] forの中にforを書いたりって普通にしますか? のようなものかと 2段くらいはすることもあるけど、頻繁には使わない 3段以上は滅多にやらない 人にもよるかも
463 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 14:05:29 ] 必要があれば使うみたいな x,y,z,tなんて4次元だしw
464 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 14:17:38 ] そうでしたか。やはり熟練者の方の意見は勉強になります。 ありがとうございました。
465 名前:デフォルトの名無しさん [2008/03/15(土) 15:32:42 ] import java.io.*; class hoge{ public static void main(String args[]){ if(args.length <= 0){ System.out.println("specify the file name correctly"); System.exit(1); } try{ int i; for(i = 0; i < args.length; i++){ BufferedReader br = new BufferedReader(new FileReader(args[i])); String str; while((str = br.readLine()) != null){ System.out.println(str); } } br.close(); } catch(IOException e){ System.out.println("input/output error"); } } } コマンドライン引数からファイルを受け取って表示するプログラムですが、 br.close()の行で "シンボルを解決できない" というエラーが出ます。なぜエラーが出るのかわかりません。 br.close()を削除すれば実行できるのですが・・・。
466 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:38:49 ] >>465 br.close(); の前の閉じ括弧 '}' が一個多い。 それで br がスコープから外れて「シンボルを解決できない」といわれてる。
467 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:39:21 ] スコープを勉強しろ
468 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:51:21 ] {}の組み合わせは力ずくでは良くないがな
469 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 15:54:06 ] メモ帳でもつかって無い限りこんな間違いしないと思うんだけどな
470 名前:465 [2008/03/15(土) 16:20:48 ] >465の質問者ですが br.close()の 前の閉じ括弧を’ } ' を取り除いても エラーが出ます。 その閉じ括弧はfor文の閉じ括弧になっています。 閉じ括弧を除いた場合のエラーは hoge.java:13: 'try' への 'catch' または 'finally' がありません。 hoge.java:27: 'catch' への 'try' がありません。 hoge.java:32: '}' がありません。 です。
471 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:22:21 ] 日本語も読めねーのかよw
472 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 16:47:25 ] >>470 br.close(); の前の閉じ括弧を一つ取り除いた後、 br.close(); の後に一つ閉じ括弧つけろ。
473 名前:デフォルトの名無しさん [2008/03/15(土) 17:43:23 ] 環境 Windows xp, jdk 1.5 ポリシファイルで全部のファイルの読み込みを可能にしました。 swingアプレットを作ったのですが、 プロンプトからだと画像やボタンが表示できました。 しかしブラウザから起動するとボタン等は表示できますが 画像が表示できません。(読み込めていない様子) どうしたらできるのでしょうか? 一応、ソースの怪しい所を貼り付けておきます。 import...... /* <applet code="TimerTest2.class" width=500 height=250> </applet> */ ___javaソースの一部___ public class Test2 extends JApplet implements ActionListener{ フィールドなので省略 public void init(){ icon0 = new ImageIcon("07.gif"); ___起動させるhtmlファイル___ <html> <head></head> <body> <p> <APPLET code="Test2.class"width=500 height=250></APPLET> </body> </html> _______________ htmlファイルは短いので全て載せました。
474 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:48:22 ] >>473 HTMLに画像を読み込むコードが無いから。
475 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 17:54:21 ] >>473 Javaコンソールからエラーの内容確認
476 名前:デフォルトの名無しさん [2008/03/15(土) 17:59:06 ] 自宅サーバ板のTomcatでwww鯖ってスレに質問したんですが、 なんか過疎ってるのでこちらに再掲します。 Debian etchでTomcat5.5使おうとしてるんですけど、 SEVERE: 設定記述子 test.xml を配備中のエラーです org.apache.commons.logging.LogConfigurationException: java.security.AccessControlException: access denied (java.io.FilePermission /usr/share/tomcat5.5-webapps/test/WEB-INF/classes/logging.properties read) (Caused by java.security.AccessControlException: access denied (java.io.FilePermission /usr/share/tomcat5.5-webapps/test/WEB-INF/classes/logging.properties read)) こんなエラーが出ます。 サンプルアプリは動いていて、自分で作ったやつがエラーになります。 パーミッションはサンプルと同じでrootのみに与えています。 そもそも、logging.propertiesというファイルはサンプルアプリになかったのですが、 classesに777でlogging.propertiesを作っても同じエラーが出ます。 どなたか解決策を教えてもらえないでしょうか?
477 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 18:12:29 ] >>473 たぶんこうだ new ImageIcon(getClass().getResource("07.gif"))
478 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 18:34:02 ] >>476 その上位ディレクトリに x パーミッション付いてるのかよ。 # su tomcatuser -c "cd /usr/share/tomcat5.5-webapps/test/WEB-INF/classes"
479 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 18:44:13 ] >>473 そもそも画像はどこ?
480 名前:デフォルトの名無しさん [2008/03/15(土) 18:53:59 ] >>476 /var/cache/tomcat5.5/Catalina/localhost# lla /usr/share/tomcat5.5-webapps/test/WEB-INF/ 合計 24 drwxr-xr-x 5 root root 4096 2008-03-15 17:43 . drwxr-xr-x 3 root root 4096 2008-03-15 17:19 .. drwxr-xr-x 2 root root 4096 2008-03-15 17:38 classes drwxr-xr-x 2 root root 4096 2008-03-15 17:20 lib drwxr-xr-x 3 root root 4096 2008-03-15 17:28 src -rw-r--r-- 1 root root 637 2008-03-15 17:43 web.xml となっています。
481 名前:465 [2008/03/15(土) 19:21:25 ] 465です。 解決しました。 ありがとう。
482 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 20:22:16 ] >>476 policyファイルで弾かれてるんじゃない?Debian etchなら、 /etc/tomcat5.5/policy.d/の下に*.policyってファイルがあるから、 それ読んでほげほげしてみるといいかも。
483 名前:デフォルトの名無しさん [2008/03/15(土) 20:43:54 ] 476です。 >>477 さんのやり方で解決できました。 みなさん 親切にありがとうございました。
484 名前:デフォルトの名無しさん [2008/03/15(土) 21:14:50 ] >>482 ありがとうございます。 04webappsの grant codeBase "file:${catalina.home}/bin/tomcat-juli.jar" の中に permission java.io.FilePermission "<webアプリのpath>", "read"; を追加したところ、上記のエラーは消えました。
485 名前:デフォルトの名無しさん mailto:sage [2008/03/15(土) 21:16:29 ] 04webappsじゃなくて04webapps.policyでした
486 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 00:58:16 ] swingに関して質問させてください JFrameのサイズを指定する際にまわりの枠を気にしないで済む様にInsetsを利用しています。 しかし、JMenuBarを追加すると、その分の幅はInsetsで考慮されていないようです。 JMenuBarの上下方向の幅を取得するにはどうすればよいのでしょうか? あと、BufferStrategyを使いたいのですが、JPanelでは使えないんでしょうか? よく、JavaのGUIの勉強をすると、JFrameの上にJPanelを張って、その上にさらに何かを張ってと階層状にするべきと見かけますが、BufferStrategyを使う場合はJFrame上にべた書きすべきでしょうか?
487 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:12:38 ] >>486 中身のサイズに合わせてJFrameのサイズを決めたいならpackすればJFrameの方がそれに合わせてくれる。 packではだめなレイアウトマネージャを使っていたり、どうしても自分でフレームサイズを決めたいというのなら、 JFrame#getJMenuBar()でJMenuBarコンポーネントを得てgetSize().heightでメニューバーの高さを取得できる。 ただし、フレームが表示されてないと大きさは取れないので、ダミー的に表示してサイズ計算後setSizeで変更してやる。 JFrame f = ... f.setVisible(true); Dimension d = f.getJMenuBar().getSize(); Insets i = f.getInsets(); f.setSize(contentWidth + i.left + i.right, contentHeight + d.height + i.top + i.bottom); みたいな感じで。 BufferStrategyを使いたいならjava.awt.Canvasをコンテントペインに乗っけてやれば大抵うまくいく。 swingコンポーネントにAWTコンポーネントを乗せるのは抵抗があるかもしれないけれど。
488 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 02:32:41 ] 幅の情報は要らないからgetSize().heightでなくgetHeight()で十分だった
489 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 03:26:29 ] リアルタイムのゲームを作っているのですが、 数秒ごとにカクカク止まってしまいます。 ガベージコレクションのせいかと思ったのですが、 空きメモリのこぎりグラフとは無関係にカクカクします。 速いマシンだと全く気にならないレベルなのですが、 セレロン600だと耐えられないカクカクです。 どうしたらいいか分かる人いますか?
490 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 04:21:26 ] プロファイルを取ってみればいいと思うよ
491 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 05:10:10 ] Java のログ機能と Log4j とどっちがいいの?
492 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 05:22:46 ] >>491 状況に応じて変わる。 lab.moyo.biz/recipes/java/logging/loggingvslog4j.xsp
493 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 06:30:51 ] JRE 単体って入れたことないんだけど 6 で Java DB もバンドルされてる?
494 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 08:10:33 ] 練習サイトを見て勉強しているのですが 何故メインメソッドをできるだけ小さくして 簡単な作業でも個別にメソッドを作るのかがわかりません ex)ttp://www.u-farm.jp/en/a001_04.html
495 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 08:36:08 ] 俺はこの前他人が作ったプログラムをいじる必要があったんだけど そのプログラムのmainメソッドは1000行以上あって、読むのが大変だった。 そういう悲劇をなくすため。
496 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 08:40:22 ] 意味のある単位でプログラムを小さな部品に分解していくと、分かりやすいものになる。 こういう意識を普段からもっておいたほうがいいし、 入門用の短いプログラムでも意識するべき。
497 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 08:52:41 ] どのくらいのレベルでメソッド化していけばよいのでしょうか メインメソッドにはメソッド処理以外書かないぜくらいの勢いでしょうか・・・
498 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 08:55:27 ] その時代の画面のスクロールで 2 ページが目安。
499 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 09:31:35 ] メソッド名が無理なく考えられるような処理(上のリンクの場合だとdrawTriangle) とかは、常に分けてもいいんじゃないかな。 上手い名前付けができない場合は、コードの長さと相談して分けたり分けなかったり
500 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 18:18:26 ] 複数のjarファイルからクラスを探してきて欲しい時に ・lib/extにjarファイルを置く ・-classpath引数で一つ一つ指定する 以外の方法はありますか? javacならば-extdirsでjarの入ったフォルダを指定すれば そのフォルダの中のすべてのjarを探してくれるのですが javaにはextdirsのようなオプションがありません
501 名前:500 mailto:sage [2008/03/16(日) 18:22:42 ] すいません、自己解決しました java -Djava.ext.dirsでいけました
502 名前:デフォルトの名無しさん [2008/03/16(日) 20:31:24 ] Javaダウンロードできないんだけど(笑)
503 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 21:46:48 ] Javaでオーバーロードを行なった場合の「あいまい」と言われる、言われない条件というのを詳しく知りたいのですが 何か良い資料はないでしょうか? 例えば class Hoge{} class Hoge2 extends Hoge{} class Hoge3 extends Hoge2{} と定義して test(new Hoge3(), new Hoge3()); と呼び出したとき、 void test(Hoge2 a, Hoge3 b){} void test(Hoge a, Hoge3 b){} 問題なし void test(Hoge2 a, Hoge3 b){} void test(Hoge2 a, Hoge2 b){} 問題無し void test(Hoge a, Hoge3 b){} void test(Hoge2 a, Hoge2 b){} あいまいエラー となる基準がいまいちピンときません。
504 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 21:54:52 ] 続きです。 なんとなく (Hoge3, Hoge3)により近いものを探している雰囲気はあります。 ではと思い、 class Hoge4 extends Hoge3{} test(new Hoge4(), new Hoge4()); void test(Hoge a, Hoge4 b){} void test(Hoge3 a, Hoge3 b){} これなら、Hoge4,Hoge4まで上は3ステップ。下は2ステップ。下が選ばれるはず。 と思いきやあいまいエラーでした。
505 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 21:58:36 ] >>503 > void test(Hoge2 a, Hoge3 b){} > void test(Hoge a, Hoge3 b){} Hoge2 a は Hoge a に代入可能。 Hoge3 a は Hoge3 b に代入可能。 以上により、前者の引数は全て後者の引数に代入可能。 なので、前者は後者より特殊なメソッド(specific method)と言われる。 この特殊なメソッドが一つに決まる場合は、 それが最も特殊なメソッド(most specific method)と言われて、それが呼び出される。 > void test(Hoge a, Hoge3 b){} > void test(Hoge2 a, Hoge2 b){} みたいに一つに決まらない場合は曖昧となってコンパイルエラーになる。 詳しくはこの辺呼んでくれ。 15.12.2.5 Choosing the Most Specific Method java.sun.com/docs/books/jls/third_edition/html/expressions.html#15.12.2.5 15.12.2.2 最も特殊なメソッドの選択 www.y-adagio.com/public/standards/tr_javalang2/expressions.doc.html#18428
506 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 21:59:16 ] >503 条件も何も曖昧だから曖昧なんだよ A’がAを継承しているならば、A’はAともA’とも解釈できるって理解していればそんなオーバーライドは普通書かない
507 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 22:12:16 ] ジェネリックスと否ジェネリックスでObject型かぶらせちゃうのはたまにやるな。 実行時型情報ないからなぁjavaのジェネリックスは。
508 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 22:26:34 ] >>505 とても分かりやすい説明と、良い文献をありがとうございます。 熟読させてもらいます インターフェースも絡めて色んなパターンを試していたのですが、 「あるメソッドの全ての引数が、他の同名メソッドの引数に代入可能な場合、あるメソッドはより特殊と判断する」 という1文ですっきり解決して魔法のようでした。
509 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:16:37 ] 508です。 一応情報です。 >>505 の日本語版のほう、和訳が間違ってますね。 英語の方読んだほうがいいです
510 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:28:59 ] >>509 和訳のは第2版で英語のは第3版だからその違いじゃなくて?
511 名前:デフォルトの名無しさん mailto:sage [2008/03/16(日) 23:43:59 ] いや、完全に文章がおかしかったです 「もしすべての最大限に特殊なメソッドが同じシグネチャをもたないならば」 と和訳されていますが、英文では 「If all the maximally specific methods have override-equivalent signatures, then」 とあるので「〜〜をもつならば」が正しいかと思われます