1 名前:Javaが初心者 mailto:sage [2008/05/12(月) 03:05:27 ] プログラミング言語Javaに関する質問スレです。 JavaScript, Ajaxの質問は、ここでは受け付けていません。 Web製作管理 pc11.2ch.net/hp/ Webプログラミング pc11.2ch.net/php/ をご利用下さい。 よくある質問 ・「コマンドまたはファイル名が違います」 「'javac' は、内部コマンドまたは外部コマンド、 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」 「Exception in thread "main" java.lang.NoClassDefFoundError: 」 www.wikiroom.com/java/?path,classpath ・String に == は使うな。equals() を使え。 ・「\12288 は不正な文字です。」 文字リテラル以外で全角スペースは使えません。半角スペースに。 ・その他の質問→「APIのjavadoc見ろ」 前スレッド 【初心者】Java質問・相談スレッド114【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1207385614/ 次スレは>>990 あたりで。 過去ログ、関連スレッド、よくある質問とその回答など、 質問をする前に、貴方が見なければならないサイトについての情報は、 下のwikiのページにまとめてあります。 www.wikiroom.com/java/
91 名前:デフォルトの名無しさん [2008/05/14(水) 07:06:40 ] すいません。初歩の初歩でつまずきました。。。 実行すると Exception in thread "main" java.lang.NoClassDefFoundError: ↑はwikiで解決するんですが、 at java.net.URLClassloader$1.run(Unknown Sourse) at ・・・ at ・・・ と、at何とかが7個出てくるんですがあれはなんでしょうか? 教えてください。
92 名前:デフォルトの名無しさん [2008/05/14(水) 11:42:50 ] エラー
93 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 14:25:20 ] >>91 スタックトレース 例外が投げられた時点でどういうメソッドが呼ばれていたのかの情報 下の行のメソッドが上の行のメソッドを呼んでいることを表す その場合は例外は一番上のjava.net.URLClassloader$1クラスのrunメソッドで投げられた
94 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 16:23:05 ] 2006年atex1003第XX回「hoge」(piyopiyo).avi ↑のようなファイル名のファイルが大量に入ったディレクリを引数に指定して、 中のファイル名を第XX回「hoge」.aviにしたいと考え以下のようなものを書いたのですが、 renameToの返却値がfalseになってダメです。 どうしたらちゃんとリネーム出来るのでしょうか?orz public static void main(String [] args) { File dir=new File(args[0]); String[] str=dir.list(); for(int i=0;i<str.length;i++) { File file=new File(args[0]+str[i]); String newfile=new cui().toRenStr(str[i]); System.out.print(file.renameTo(new File(args[0]+"/"+newfile))); } } public String toRenStr(String str) { Pattern pattern = Pattern.compile(".*第"); Matcher matcher = pattern.matcher(str); String renstr = matcher.replaceAll("第"); pattern = Pattern.compile("」.*"); matcher = pattern.matcher(renstr); renstr = matcher.replaceAll("」.avi"); System.out.println(renstr); return renstr; } }
95 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 17:01:05 ] >>94 renameTo()を呼ぶ前に、file.getName()とnew File(args[0]+"/"+newfile).getName() を表示して確認。
96 名前:デフォルトの名無しさん [2008/05/14(水) 20:11:53 ] 質問です。 左右マウスホイールって使えないんですかね? (一般的にはチルトホイールという?) 少し調べたんですけど、全然出てこないですね。
97 名前:デフォルトの名無しさん [2008/05/14(水) 20:51:21 ] JavaでWebサーバを作成中で、POSTリクエストの受付を可能にしようとしています。 POSTのHTTPリクエストは 「ヘッダ部複数行」 1空行 「データ部1行」なので、 BufferedReader br = new BufferedReader (new input StreamReader(socket.getInputStream())); でHTTPリクエストを取得。そのあとに while(br.readLine() != (""){ } String data = br.readLine(); とやれば、データ部をdataに入れられると思ったのですが、 データ部の後ろには改行コードのCRLFがないため、readLineで1行読み込む ことができないようです。同様にread()でもうまくいきません。 どうにかしてデータ部を取得することはできないでしょうか?
98 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:09:43 ] >>97 たいていの場合はヘッダにデータ部の長さが入っているので、そのぶん だけ読めばよろしい。 他、気になるところ: ・HTMLからのフォームPOSTでも、データがMIMEで送られることがあるので、データが1行とは限らない ・データがバイナリのこともあるので、基本的にReader類は使ってはダメ ・chunked-encodingのこともあるので、以下略
99 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:27:47 ] private InputStream is; private InputStreamReader in; これらを使って文字列を読んでるんですが、ファイルが終端に達したかを調べる方法ってありますか?
100 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:32:32 ] >>99 readメソッドの戻り値がー1
101 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 21:40:13 ] >>100 ありがとうございます
102 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 22:50:49 ] スレチかもしれませんが教えてください。 いまSQL Serverとjavaを繋げる勉強をしています。 INSERTした時間を後で取り出し after()メソッドで比べたいのですが、そういった処理は可能ですか? もし可能なら詳しく教えてください。
103 名前:デフォルトの名無しさん mailto:sage [2008/05/14(水) 23:01:01 ] System.currentTimeMillis() または System.nanoTime()
104 名前:デフォルトの名無しさん [2008/05/15(木) 00:19:56 ] ガベージコレクションは必要なくなったオブジェクトを自動的に開放してくださるそうですが、ストリームも自動開放してくれるのでしょうか? また、どのタイミングでしてくれるのですか?
105 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:25:52 ] しません。
106 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:27:08 ] 忘れてた。ファイナライザでクローズしちゃだめだよ
107 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:30:16 ] ストリームくらいちゃんと閉じろ、馬鹿者
108 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 00:33:55 ] void hoge() { InputStream input = null; try { // 略 } finally input.close(); input = null; // ← } } これが必要か?って話ならばイラネ
109 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 05:30:00 ] 無駄にnull突っ込むのはC#でもよく見かけるんだが、何でこんなに 流行しちゃったの?何か歴史的背景とかあんの?
110 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 08:45:43 ] >>103 ちょっと難しそうですけど、ありがとうございました。
111 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 09:38:05 ] >>109 nullを入れたほうがGCの取りこぼしが少ないとか、即座にGCされるから効率的だとか、そういう勝手な思い込みから
112 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 11:19:31 ] input.close(); input = null; System.gc(); しても実際3行目でメモリ解放するかはGCの実装依存なんだよね。
113 名前:デフォルトの名無しさん [2008/05/15(木) 11:47:37 ] バグの原因になるからだよ 処理しないでそのまま流してしまうコードを書くおっちょこちょいが多すぎて コンパイラがデフォでnullを入れてないコードをコンパイルするときにエラーをはくようになった
114 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 12:46:18 ] 何言ってんだ?
115 名前:デフォルトの名無しさん [2008/05/15(木) 14:52:45 ] public class A { public static void main(String args[]){ static int i = 0; // int i = 0;ならエラーにならないのはなぜですか?
116 名前:デフォルトの名無しさん [2008/05/15(木) 15:10:35 ] >>115 ローカル変数には static つけられないって言語仕様で決まってるから。
117 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 15:21:37 ] public class A { static int i = 0; public static void main(String args[]){ これならいいんですね。
118 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:27:21 ] >>117 それだとiはローカル変数ではなくなる。 staticはインスタンスでなくクラスに属する変数であるという意味だから、 クラスやインスタンス個別でなくスレッドごとに存在しているローカル変数に付けると 意味不明になってしまう。単に、>>115 でstaticを外したように書けば、 ローカル変数iとして使えるし、コンパイルも通るはず。 それともクラス変数にしようとして書く場所を間違っただけ?
119 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:37:44 ] 型の静的変換について質問です。 とあるObject型のobj、Sting型のstrがあるとして ((String)obj).charAt(0); str.charAt(0): この二つでは、静的変換が入る上のほうが実行速度にペナルティーがあるのでしょうか? 以前やっていたCではペナルティがなかったと思うのですが、Javaだと「静的型変換に失敗した」という例外を投げてくれるようなので、おそらくなかでチェック機構が働いており、ペナルティがあるかなと思っているのですが
120 名前:デフォルトの名無しさん [2008/05/15(木) 17:48:19 ] >>119 コードや実行環境によるとしか言えない。 例えばループ内で obj が再代入されないなら JITコンパイラが String tmp = (String)obj; みたいなコードを ループ外部に作成して、ループ内部では tmp.charAt(0) に変換、 みたいな事をする可能性はある。
121 名前:デフォルトの名無しさん [2008/05/15(木) 17:49:55 ] >>119 あと、(String)obj は動的(実行時)型変換だよ。 静的(コンパイル時)型変換じゃない。
122 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 17:58:49 ] >>120-121 なるほど、最適化されるということは、裏を返せば型変換にはペナルティがあるってことですね。 >あと、(String)obj は動的(実行時)型変換だよ。 たしかに。書き方がCと同じだからって、同じものだとは限らないわけですね。 Javaには静的型変換はないようで。 ありがとうございました。
123 名前:デフォルトの名無しさん [2008/05/15(木) 18:15:56 ] >>118 ありがとうございます。 int変数のiが5なのかを判定したくて if(i == 5){ と書いてみたのですが、そのif以前にiが初期化されていなかったらiがnullかもしれないから if(i != null && i == 5){ と書かなくてはならないのか調べたくて int i; if(i == 5){ とするとコンパイルできなかったから、 static int i; if(i == 5){ と書きましたが、これもコンパイル不能でしたが、コンパイラがstaticを 解釈できていないようなメッセージを出しているみたいだったので質問させていただきました。
124 名前:デフォルトの名無しさん [2008/05/15(木) 18:17:38 ] >>123 int型が null になる事はない
125 名前:デフォルトの名無しさん [2008/05/15(木) 18:21:49 ] >>124 そうですね。nullになりませんが、プリミティプの数値型は0で暗黙の初期化がされるらしいので int i; を書いてから、初期化を書かずに if(i == 0){ を実行して真となることを確認したいのですが、そのようなソースは書けませんか?
126 名前:デフォルトの名無しさん [2008/05/15(木) 18:23:40 ] >>125 ローカル変数は暗黙の初期化はされない。
127 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 18:24:46 ] >>125 書けません。 必ずローカル変数はその値を参照する前に初期化されていることが求められています。 そして、ローカル変数は初期化を省略した際のデフォルト値のようなものはないので、 自分で初期化しなければなりません。
128 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 18:27:37 ] >>125 int i; と書いただけではiの値は確定していないので必ず初期化が必要。 iに値を代入するのがそんなに面倒?
129 名前:デフォルトの名無しさん [2008/05/15(木) 18:29:52 ] public class A { static int i; public static void main(String args[]){ これならiは暗黙の初期化で0ですね。 ありがとうございました。
130 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 18:36:28 ] なにがやりたいのかわからん ローカル変数とクラス変数では全然意味が違う 暗黙の初期化をしたいがためにローカルなものをフィールドに出したら プログラムそのものの動作が変わってしまうだろ
131 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 19:15:37 ] 暗黙の初期化なんて百害あって一利ぐらいだわ。 一般的なJavaプログラミングには必要ない。 むしろプリミティブ型の値範囲と精度に注目して欲しい。
132 名前:デフォルトの名無しさん [2008/05/15(木) 19:58:21 ] なんか、Seasar2っていうのがいいらしい。 おもしろかったらやってみたいんだけど、 家計がしんどいので2000円の本買うのためらってる。 Seasar2っておもしろい??
133 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 20:13:25 ] まず働いて2000円の本位買える家計環境にしよう
134 名前:132 [2008/05/15(木) 20:50:48 ] >>133 働いています><; 一人暮らしでバイクのローンもあるから厳しいんです><; 原付にしときゃよかった><; Seasarのスレがあったのでみたら、閉店するそうなので やめます><;
135 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:03:04 ] 2,000円の本を買うのためらうくらいならネットで調べろ
136 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:05:57 ] JSPでDBとやり取りするドライバ(のようなもの?)のクラスを作っているのですが、判らないことがあります。 ResultSet.nextをコールしないとSQLExceptionがスローされるようなのですが、なぜExceptionになるのでしょうか? statement.excute(SQL文)でSQLのカーソルをSQL文に対応するレコードに移し、 statement.getResultSet()でカーソルの指し示すレコードをResultSetとして渡す。 で、ResultSet.getString()なりなんなりでSQLの中身を取り出す。 複数のレコードを取り出すならばResultSet.next()を使うのが自然だと思うのですが、単独のレコードが期待される場合は使う必要がないのではないでしょうか? excuteじゃなくてexcuteQueryだと違うんでしょうか?
137 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 21:15:23 ] なぜExceptionの詳細を書かないんでしょうか? stacktraceくらい張ったらどうでしょうか?
138 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:24:48 ] >>136 ResultSet のカーソルは、初期状態では最初の行の前に位置付けられています。 メソッド next の最初の呼び出しによって、最初の行が現在の行になります。 2 番目の呼び出しによって 2 行目が現在の行になり、以降同様に続きます。
139 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:29:52 ] >>136 java.sun.com/javase/6/docs/api/java/sql/ResultSet.html > A ResultSet object maintains a cursor pointing to its current row of data. > Initially the cursor is positioned *before the first row*. 日本語版は誤訳だから気をつけろ
140 名前:136 mailto:sage [2008/05/15(木) 22:49:57 ] 英語苦手なんでアレなんですが… ResultSetのカーソル位置が最初0で、受け取ったデータは1から始まるって事でしょうか?
141 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 22:54:57 ] そう
142 名前:デフォルトの名無しさん mailto:sage [2008/05/15(木) 23:02:39 ] 把握しました。ありがとうございます。 <チラ裏> 言えない…ResultSetが単体のレコードを格納すると思ってたなんて言えない… </チラ裏>
143 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 01:09:02 ] Cursorとかいう名前だったらよかったのにな。
144 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 08:31:41 ] >>140 可能です。 以上。 ↓次の方どうぞ
145 名前:デフォルトの名無しさん [2008/05/16(金) 08:35:28 ] 質問です、文字列からColorクラスに変換することってできないでしょうか?つまり、 String colorname = "red"; のような色名を表す文字列を使って、setBackgroundやsetColorなどのメソッドの引数をつくる方法はないでしょうか? 色名を全部並べてif文とかで条件分岐をすればできるですが、それだととてもコードが長くなってしまうので・・・
146 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 08:38:52 ] >>145 java.awt.Color#getColor(String)
147 名前:145 mailto:sage [2008/05/16(金) 09:11:22 ] >>146 レスありがとうございます。やってみたのですが、たとえば Color color; color.getColor("red"); というふうにすると、コンパイルはできるのですが、ちゃんと色が出ませんでした。 redをblueやcyanに変えてみても、同じ黒っぽい色しか出ません。 どうしてなんでしょうか?
148 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 09:17:15 ] APIリファレンスすら読まないから。
149 名前:145 mailto:sage [2008/05/16(金) 09:29:15 ] 一応読んではいるのですが・・・
150 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:16:27 ] 質問です 2次元の配列データを、csvファイルにして(デスクトップなどに)出力したいのですが、どのような方法があるでしょうか。
151 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:29:14 ] 自前でやるのが面倒なら commons-csv なりなんなり使え。
152 名前:150 mailto:sage [2008/05/16(金) 10:32:28 ] すみません、自前でできる方法をお願いします。
153 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:43:36 ] >>147 使い方としては、 Color color = Color.getColor("red"); だけど、ドキュメントを見るとシステムプロパティがどうとか書いてあっ てよくわからんね。
154 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 10:49:05 ] >>152 自前でやるんなら、自分でCSV書き出すプログラム書くだけだよ。
155 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 11:40:26 ] >>152 for(data[] row : array){ for(data cell :row){ data.toString()と","をファイル出力 }}
156 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 12:41:17 ] >153 それはダメ。 その実体は new Color(int, int, int, int) の引数を結合した数値の文字列表現。 > 指定されたプロパティが見つからない場合、 > ***または整数値として解析できなかった場合***、null が返されます。 >145 の言う「名前から色」というのは、どこかで対応表を持つ必要があるから、 公開ライブラリには向かない、と私は思う。 要は、Map<String, Color> か何かで専門クラスを作りましょう、と。
157 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 12:45:53 ] >>145 javax.swing.txt.html.StyleSheet#stringToColor(String) とか?
158 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 12:47:53 ] >>155 改行してない。
159 名前:デフォルトの名無しさん [2008/05/16(金) 18:00:57 ] アプレット初めて半年の初心者なんですが、 JToggleButton();で押下時のボタン色を変えるシンプルな方法はありますか? メソッドをネットで検索しても見つかりませんでしたので、 JToggleButton();を継承して、オーバーライドしたクラスを作ったんですが、 ボタンのイベントの"actionPerformed()"が、使用されるアプリのほうが 自分より早く呼ばれてしまう為、旨くいきませんでした・・・
160 名前:デフォルトの名無しさん [2008/05/16(金) 18:05:23 ] こんな感じで作りました。 public class IToggleButton extends JButton implements ActionListener { private boolean isSelected = false; IToggleButton(String str){ super(str); addActionListener(this); if (this.isSelected) setBackground(Color.pink); else setBackground(null); } public void actionPerformed ( ActionEvent e ) { isSelected = isSelected?false:true; if (isSelected) setBackground(Color.pink); else setBackground(null); } public void setSelected(boolean selected){ this.isSelected = selected; if (this.isSelected) setBackground(Color.pink); else setBackground(null); } public boolean isSelected() { return(this.isSelected); } }
161 名前:デフォルトの名無しさん [2008/05/16(金) 19:55:47 ] プログラミング初心者が最初に行き着く プログラム言語のスレはココですか?
162 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 20:40:20 ] いえいえ、アッセンブラ〜やCを長年経験した上での質問です・・・
163 名前:デフォルトの名無しさん [2008/05/16(金) 22:35:26 ] 若い女のプロ意識に脱帽編… 若い女の営業スマイル。よく出せるなと思っていました。 コンビニやスーパーでも俺みたいなきもいおっさんによくこうも にこやかな営業スマイルだせるなと感心しておりました。 こないだ、パチンコ屋に行きました。そこは町の中心部にあり自宅から 4,50分のところです。そこは、衣装もエロチックでミニスカートにスリットなる 切れ目が入っていて、店員さんもなかなかの魅力的な娘が多いです。 それも楽しみにときどきそこの店に行きます。 あまりでないので、自動販売機のところで一服してるとかわいい娘が コーヒーを配っています。あまりこの店までこれないので、ついミニスカートのスリットから見える 太ももを凝視して興奮してしまいました。かなり長い間エロい目つきで見てたはずです。 相手に気づかれました。さすがに、とってもいやな顔されるだろうとおもっていました。 最初はたしかにちょっといやな顔をしましたが、すぐにあのにこやかな営業スマイルにもどりました。 これはびっくりしました。いくら店員とはいえ、俺みたいなもてないブサ男に この場面で営業スマイルとは・・・ 恐れ入りました。パチンコ屋のあの店員。
164 名前:163 mailto:sage [2008/05/16(金) 22:36:08 ] すまん。誤爆った。リロードされたら、プログラム板だった。すまそ。
165 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 22:39:49 ] クライアントの変更要求や追加要求に嫌な顔をして見せる奴は、パチ屋の 女性店員よりプロ意識が低いと言いたいわけですね?わかりますw
166 名前:デフォルトの名無しさん [2008/05/16(金) 22:54:26 ] 基礎からのJava www.7andy.jp/books/detail?accd=31942656 やさしく学ぶ Sun認定Javaプログラマ www.7andy.jp/books/detail?accd=32020519 この2つでどっちを買うか迷ってるんだけどどっちがオススメ? もしくは他にオススメある? 一応研修でざっと習って「やさしいJAVA」ってのも貰った 基本をきっちり押さえつつも実践的な練習もできる本が欲しい 他のSUN認定の分厚いのや外人が書いた翻訳された本は見にく過ぎて無理だった とりあえず逆引きの本は1冊買った 誰か助けて
167 名前:デフォルトの名無しさん mailto:sage [2008/05/16(金) 23:12:15 ] >>166 「実践的な練習」がどのレベルを指してるのか分かんない。 1.実用的なプログラムを、とりあえず動くレベルで書けるようになりたい。 2.動けばいいレベルなら既に書けるから、より良いコーディングを学びたい。 1なら言語本(Javaそのものを説明してる類の本)はやさしいJava1冊で十分。 それよりも実際に何か書いてみる方に注力して、書きながらその都度必要 な情報を検索する、それでもみつからないなら本を探して買うってやり方の 方が経済的だし効率いい。 言語本を何冊も買うのは意味ないし、言語本を2冊読む時間があるなら1 冊だけ読んでもう1冊読む分の時間で実際にコード書く方が効率いい。 あと、1のレベルに達してない人が2を求めるのは非効率。先ずは1から。 もし2ならJavaの鉄則とJavaの格言は良い本だよ。読みやすいしね。
168 名前:デフォルトの名無しさん [2008/05/16(金) 23:27:34 ] >>167 こんな時間にどうもありがとう! 明日その2冊を立ち読みしてみる
169 名前:デフォルトの名無しさん [2008/05/17(土) 00:21:32 ] 初歩的な質問ですみません javaプログラミングをするのに優れたフリーのテキストエディターを教えて下さい。 できれば文字の色を変えてくれて、Tabで列を揃えてくれるやつがいいです。 OSはWindows XPです。 よろしくお願いします。
170 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 00:36:59 ] java.util.Collections#synchronizedList() の使い道(使い方)がわかりません。 java.util.List は同期化されませんが、以下のようにすれば、list はスレッドセーフになって帰ってくるのですよね。 List unsyncList = new ArrayList(); List list = Collections.synchronizedList(unsyncList); ○質問1: マルチスレッド環境において、 Collections#synchronizedList() が返した list に対しては、 synchronized ブロックでくくらずに add() や get() しても、スレッドセーフが保たれるという理解でよいですか? ○質問2: javadoc の Collections#synchronizedList() のところに、 以下のように書いてあるのが気になります。 >返されたリストの繰り返し処理を行う場合、ユーザは、次に示すように手動で同期をとる必要があります。 > >List list = Collections.synchronizedList(new ArrayList()); > ... >synchronized(list) { > Iterator i = list.iterator(); // Must be in synchronized block > while (i.hasNext()) > foo(i.next()); >} >これを行わない場合、動作は保証されません。 これは、list の add() や get() は質問1:で同期化されるようになったが、 list.iterator() が返すイテレータへのアクセスは同期化されていないので、 イテレータでグルグルまわすときは、synchronized 文で自分で同期化してね、という理解でよいでしょうか?
171 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 00:42:19 ] >>169 いくつもあるし相性があるって人もいるので、 ぐぐって出てきたのを使ってみれば? あるいはEclipse、NetBeans等の統合開発環境とか 文法ミスを指摘してくれたり、デバッグ用の機能がそろってたりと何かと便利 大規模な開発にも耐えうるし、ひとつ持っておくのをお勧めする
172 名前:デフォルトの名無しさん [2008/05/17(土) 00:48:44 ] >>171 なるほど、ありがとうございます。 早速ぐぐってみます。
173 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:17:27 ] >>168 Effective Javaがいいよ!
174 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:31:30 ] >>170 sync-List は、単にsynchronizedメソッドでラップされたインスタンスを提供してるだけ。 必要とされる同期化の手続きが、著しく改善されるわけではない。 iterator で返されるインスタンスは、ラップされたものとは違うので、 生成前に必要な手続きを行う必要がある。
175 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 01:42:45 ] >>170 >質問1 はい。 ただし、例えば以下のようなことをしたい場合は、containsやaddがそれぞれ単体で同期されてても 間に割り込まれる可能性があるので、全体をsynchronizedで囲まないと望む結果にはならない。 if ( list.contains(x) == false ) list.add(x); >質問2 はい。 どのみち、iterator、hasNext、nextをそれぞれ単体で同期したところで、 間にaddが割り込まれたらConcurrentModificationExceptionが起きるから、使い物にならないと思う。 ところで、CopyOnWriteArrayListという便利なものもあるよ。 状況によってはおすすめ。
176 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 02:24:22 ] >>145 Color c = (Color)Color.class.getField(colorname).get(null); 要try-catch
177 名前:デフォルトの名無しさん [2008/05/17(土) 07:49:46 ] JSPの質問なのですが、ここでしてもいいものでしょうか? スレ違いなら誘導をお願いします。 DBから読み込んだ内容をテーブルとして表示し、レコードごとにボタンを置いて押すとそのレコードの詳細を表示するものを作っています。 レコードをテーブル表示するのはwhile(ResultSet.next())で<tr>〜</tr>を繰り返して実現できそうなのですが、詳細を表示するボタンに迷っています。 というのも渡すパラメータが10個あり、しかもそのうち9つがレコードの内容に依存しない共通の項目です。 ボタン一つ一つにformを作ってhiddenで10個のパラメータを付加してwhileで回すのも考えたのですが、例えば20個のレコードに対して200のhiddenが生成されるのはいかがなものかと他の手段を探しています。 buttonを押したときにonclickで遷移することも考えましたが、buttonに直接パラメータを付加できる属性はないものでしょうか?
178 名前:デフォルトの名無しさん [2008/05/17(土) 08:27:13 ] HTML(リンク)からJAVAサーブレットに情報を与えるにはどうすればいいのでしょうか。 リンク"A href=恐らくdoPostの値></A"で データをJAVAサーブレットに送信したいのですが方法がわかりません。 リンクにdoPostの情報を与えるのもわかりませんがリンクからの情報をサーブレットに値を与えデータを返す方法もわかりません。 本にも載ってないのでどうすればいいかわかりません、教えて君になってしまいますがよろしくお願いします。
179 名前:178 [2008/05/17(土) 08:52:14 ] すみませんdoPostのところはdoGetです。
180 名前:デフォルトの名無しさん [2008/05/17(土) 09:55:43 ] 質問です。 現場のソースで、 List list = new ArrayList();と記述し、ArrayListのメソッドを 使っているソースを見かけたのですが、 ArrayList list = new ArrayList()とのメリット上での差異が分りません。 良い点があるから、List list = new ArrayList();と記述するのでしょうが、 その良い点が分りません。よろしくお願いします。 一応、sjc-p1.4の資格は持っていて、SJCPに合格するだけのインターフェースの知識は あります。
181 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:01:33 ] どっちかというとHTMLの話になるわな。 そもそも、一覧から詳細にいくのに10個もパラメータいらんだろ? なんかおかしな設計ではないのか? POSTで送信する(Formを使用する)場合、 >9つがレコードの内容に依存しない共通の項目 レコード(繰り返し処理)の外側に配置すればいい 各列のハイパーリンクをクリックしたならば、JavaScriptで各行のキーをhidden項目に設定。 その後、隠しボタンにした「詳細」ボタンをJavaScriptでクリック ってのが1つの方法。 詳細がボタンであっても同様。 GETでいいならば、URLのパラメータに10個のパラメータを付ければいい。 POST/GETとFORMあたりがよく解っていないならば、まずはHTTPの勉強を汁。
182 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:07:06 ] >>180 ぶっちゃけて言えば、半端な知識のマが書いた中途半端なコードなだけ。 意図としてはListで定義されているメソッドしかlist変数では使えないって効果しかない。 これがメリットとなるか?というならば、ほとんどの場合は否。 これがメリットとなるケースは、一般的にいって定義されたクラス外からlistの参照を持つ場合。 つまり、あるクラスのフィールドとして、 private final ArrayList list = new ArrayList(); と書いてあっても、 public List getList() { return list; } とアクセサを定義しておけば、 private final List list = new ArrayList(); とする必要は(ほとんど)ない。 クラス内でArrayListをLinkedListに変更したり、配列に変更しても、List getList()さえ仕様通りの動きをすればいいわけだ。 ローカル変数でやるならばもっと意味はない。
183 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:12:13 ] あと、当然な話だけど、List list = new ArrayList();と書くよりもArrayList list = new ArrayList()と書くほうが、実装上の選択(メソッド)は増える。 極端な話、LinkedListなんて専用メソッドを活用しなきゃいらない子。
184 名前:デフォルトの名無しさん [2008/05/17(土) 10:25:11 ] 質問です。 swingでゲームを作ろうとして勉強しているものです ゲーム中(ループ中)にJPanelを実装したクラスのコンストラクタでボタンを配置 別スレッドでループ処理する。このときアクティブレンダリングして描画命令 してるのですが、なぜかボタン隠れた状態で更新されてしまいます。 下にコードを書きますので、どなたかご教授ください
185 名前:デフォルトの名無しさん mailto:sage [2008/05/17(土) 10:26:43 ] >>180 「選択肢があるなら、抽象データ型を使え」という指針がある Listとおけば実装の詳細がより隠蔽される 例えば実装を交換したいという状況になっても、new ArrayList();の部分だけを取り替えてやればいい ・・・・一応、理論上はそういうことになってるようなのだが、 listのスコープが狭い場合はデメリットにしかならんような?使えるメソッド減るし
186 名前:デフォルトの名無しさん [2008/05/17(土) 10:26:48 ] //必要パッケージをインポート import java.awt.*; import javax.swing.*; /***************************************** * パネルクラス(中間コンテナ) * *****************************************/ class MainPanel extends JPanel implements Runnable{ //パネルサイズ public static final int WIDTH = 500; public static final int HEIGHT = 500; private Thread thread; //コンストラクタ public MainPanel(){ //サイズの設定 setPreferredSize(new Dimension(WIDTH,HEIGHT)); thread = new Thread(this); thread.start(); JButton btn = new JButton("OK"); add(btn); }
187 名前:デフォルトの名無しさん [2008/05/17(土) 10:28:14 ] //ゲームループ public void run(){ while(true){ SwingUtilities.invokeLater(new Runnable() { public void run() { gameRender(); paintScreen(); } }); try{ Thread.sleep(200); }catch(InterruptedException e){ e.printStackTrace(); } } }
188 名前:デフォルトの名無しさん [2008/05/17(土) 10:29:03 ] /*** ダブルバッファリング ***/ // ダブルバッファリング用 private Graphics dbg; private Image dbImage = null; //バッファにレンタリング public void gameRender(){ //初回時の呼び出しならばダブルバッファリング用のオブジェクト作成 if(dbImage==null){ //バッファイメージの作成(領域) dbImage = createImage(WIDTH,HEIGHT); if(dbImage==null){ System.out.println("no dbimage obj!"); return; }else{ //バッファイメージに図や画像を書き込むために必要なGraphicsオブジェクトも作っておく dbg = dbImage.getGraphics(); } } //バッファをクリアする dbg.setColor(Color.WHITE); dbg.fillRect(0, 0, WIDTH, HEIGHT); }
189 名前:デフォルトの名無しさん [2008/05/17(土) 10:29:39 ] //バッファの内容を画面に転写 public void paintScreen(){ try{ Graphics g = getGraphics(); if(g!=null && dbImage!=null){ //バッファイメージを画面に描画 g.drawImage(dbImage,0,0,null); } //システムのtoolkitオブジェクトを返し、画面を強制的に更新させる Toolkit.getDefaultToolkit().sync(); if(g!=null){ //グラフィックオブジェクトの破棄 g.dispose(); } }catch(Exception e){ e.printStackTrace(); } } }
190 名前:デフォルトの名無しさん [2008/05/17(土) 10:33:02 ] public class MPN extends JFrame{ //コンストラクタ public MPN(){ //タイトル setTitle("ウィンドウ"); setResizable(false); //ContentPaneにパネルを貼り付ける MainPanel panel = new MainPanel(); Container contentpane = getContentPane(); contentpane.add(panel); //フレームサイズをパネルに合わせて設定 pack(); } private static void createFrame(){ MPN game = new MPN(); game.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); game.setLocationRelativeTo(null); game.setVisible(true); } public static void main(String[] args) { //イベントディスパッチスレッドにフレームを作成させる SwingUtilities.invokeLater(new Runnable() { public void run() { createFrame(); } }); } }
191 名前:デフォルトの名無しさん [2008/05/17(土) 10:35:21 ] 上記ソースを投稿したものです。 長くなりすみません。 どうもダブルバッファリングするとボタンがうまく配置しません。 paintComponentメソッドを使った描画処理ではうまくいきました。