1 名前:デフォルトの名無しさん [2008/01/13(日) 00:25:22 ] プログラミング言語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質問・相談スレッド110【大歓迎】 pc11.2ch.net/test/read.cgi/tech/1197710566/ /* 既出の質問や、他に適切なスレが存在する質問は、容赦なく無視されます。 質問をする前にwikiで過去ログ、関連スレ、FAQをチェックしてください。 */ また、当スレで質問をするかたは、回答をもらえたときに、 wikiの更新をして頂ければ、忝のう存じます。 次スレは>>980 あたりで。
692 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 16:30:23 ] >>691 ・InitialContext.lookup()の引数に環境情報を渡す ・jndi.propertiesにホスト情報を記述する ・APサーバのJNDIサービスにエイリアスを設定する 上記のどれか。 何もなければ同一ホストから検索される。
693 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:26:01 ] 質問させて下さい。 Object obj = new Object() { ... } こういう文法が理解できません。 中括弧の中では、何をしているのでしょうか。 コンストラクタを定義するのと同時に、 インスタンスを作成している感じでしょうか? メソッドに与えられるのは引数だけだと思っていたので、 それ以外の何かを同時にしているというのがよくわかりません。 この書き方の概念を教えてください。 出来れば言語仕様上で、こういう記法がどこに書いてあるかの ポインタも合わせて教えていただけると嬉しいです。 (さらに言えば、日本語で) こういう書き方をなんと呼ぶのかも知らないので、検索もできず……。 この書き方は、例えば ThreadLocal クラスの API の 1.4 以降で、使い方の説明に出てきます。 sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/lang/ThreadLocal.html
694 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 17:28:20 ] >>693 匿名クラスでググれ
695 名前:693 mailto:sage [2008/02/03(日) 17:33:48 ] >>694 ありがとうございます! ぐぐって無事に正体がわかりました!
696 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 18:34:30 ] >>676 ありがとうございます。 ダブルクリックで起動できればいいかなと思っていますので、 ちょっと試してみます。 .batファイルを作ったり、 ショートカットで作ったりしていましたが、 それって、環境変わったらだめくさいきがしまして・・・。
697 名前:868 mailto:sage [2008/02/03(日) 19:50:23 ] >>869 回答ありがとうございます。 ProjectはBuild automatically clean にチェックが入っています。 しかし新しく作成したディレクトリがTomcatで表示されません。 webapp直下にjsp-xxxというフォルダを作ったのですが。
698 名前:868 mailto:sage [2008/02/03(日) 20:00:04 ] 誤爆しましたorz
699 名前:697 mailto:sage [2008/02/03(日) 20:16:20 ] 697の質問ってどこですればいいのでしょうか?orz 質問先でスレ違いといわれてしまいました。
700 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 20:32:45 ] それだけで状況が解るエスパーを探しているのかい?
701 名前:697 mailto:sage [2008/02/03(日) 20:52:24 ] >>700 回答ありがとうございます。 あと何を書いたらよいでしょうか?
702 名前:697 mailto:sage [2008/02/03(日) 21:38:08 ] くだスレで聞いてみます。
703 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 21:56:30 ] エスパー頼りならどこで聞いても同じだろ
704 名前:デフォルトの名無しさん mailto:sage [2008/02/03(日) 22:25:39 ] >>703 あとは何を書いたらいいのかわかりません。 何を書いたらよろしいでしょうか?
705 名前:デフォルトの名無しさん [2008/02/03(日) 23:52:19 ] java.lang.Process#waitFor()で永久ブロックになってしまうことがあるので タイムアウトを設定して回避したいのですが、 タイムアウト付のwaitFor代替の方法ってあるのでしょうか? いちいちTimer設定して破棄するしかないのだろうか・・・
706 名前:デフォルトの名無しさん [2008/02/04(月) 00:22:23 ] >>687 Java FAQも古いな。 Java5以降になってから解決した問題が未だに載っている。 Java5以降の開発では有用性が弱冠下がっている。 Java6以降の対応版Java FAQを作るべき時期に来ているのだろうか? それとも、すでにそれに相当するサイトによって置き換えられてしまったか?
707 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:22:26 ] final Process proc = Runtime.getRuntime().exec("/bin/shine"); Thread t = new Thread(){ public void run(){ try{ proc.waitFor(); } catch(InterruptedException ex){/* */}} }; t.start(); t.join(5 * 1000); if(t.isAlive()){ proc.destroy();}
708 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:24:31 ] >>690 www.shiki.gr.jp/applause/wicked/ こいつよ >>678 はWicket 劇団四季でやってるのはWicked スペルが一つ違い。 これは面白いミュージカルなんだろーか >>678 のおかげで見たくなってきた
709 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:27:08 ] >>702 誤爆してるっていうから、レス番が>>898 と未来へ飛んでるわけな? 今のところ、>>898 のレスが無いから、 元の質問も今の君の質問からも、君が何をしたいのか わからないんだ。情報を出してもらわないことには、質問には 答えられない。エスパーする以外では
710 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:29:17 ] >>707 ありがとうございます。 結局waitForのタイムアウト指定版っていうのはないみたいですね…
711 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:36:30 ] >>706 こういうまとめ系って Wiki とかじゃないと管理人がヘタったら終わりなんだよね。 他人が勝手にコピペして引き継ぐわけに行かないし。Wiki 立てるのって簡単なのかな? サーバリソース余ってるからやっても良いんだけど。
712 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:52:55 ] すみません。 >>709 アドバイスありがとうございます。そのとおりですね。 apache-tomcatとEclipseを使っています。 EclipseにSeaser2プラグインを入れました。 Churaプロジェクトを新規作成、 デフォルトのindex.jspがtomcatで表示されることを確認(localhost) で、webapp直下にディレクトリを作成してファイルを置きました。 でコンテクスト定義の更新をかけたのですが、 作成したディレクトリが見えません。 ProjectはBuild automatically clean にチェックが入っています。 おそらくweb.xmlを直さないといけないのでしょうが どこを直したらいいか見当がつきません。 ネットも探してみましたが分かりませんでした。 よろしくお願いいたします。
713 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 00:57:20 ] Eclipseの外でディレクトリ作って、Eclipse側で更新かけてないというオチは俺は良くやる。
714 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:03:09 ] このスレのWikiの更新具合も微妙
715 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 01:20:40 ] >>713 回答ありがとうございます。 Eclipseの中でディレクトリを作っています。
716 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 03:36:48 ] 質問ですノ リファレンスの本ってあったほうがいいでしょうか? ワザあり!逆引き速引きリファレンスJavaってのがいいって聞いたのですが どうなんでしょうか?
717 名前:デフォルトの名無しさん [2008/02/04(月) 10:11:33 ] それくらい自分で考えろ。人に聞くことじゃない
718 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 14:30:47 ] >>711 Wikihouseに立てるのは簡単だよ。 これ使う手もあり ja.wikibooks.org/wiki/
719 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 17:32:20 ] >>716 まず本屋でパラパラその本を捲ってみろ。
720 名前:デフォルトの名無しさん [2008/02/04(月) 19:44:11 ] パラパラの本か 見た事無いなあ
721 名前:デフォルトの名無しさん [2008/02/04(月) 19:50:11 ] >>692 サンクスです。 リモート呼び出しでも何の設定もしていなければ同一サーバ上のEJBを探しにいく ということですね。 同一サーバ上で動かしていますが、 Context initial = new InitialContext(); Object objref = initial.lookup("NewSessionRemote"); で、lookupのところで javax.naming.NoInitialContextException: Need to specify class name in environment or system property, or as an applet parameter, or in an application resource file: java.naming.factory.initial が出ます。何か設定しろということらしいのですが・・・
722 名前:デフォルトの名無しさん [2008/02/04(月) 21:05:25 ] 初めまして。Javaを最近になって勉強し始めた者です。 サンプルプログラムを探していて、このようなサイトにたどり着きました。 www.catch.jp/program/java/ ページ上部の「021: 10個の点が3-Dで移動する」のソースコードをコンパイルすると classファイルが3つ出現しました。 使い方がわからなかったので、検索してみると「jar」コマンドで複数のclassファイルを結合できると知り、 試してみたのですがなかなかうまくいかないので、皆様のお力をお借りしたいです。 jarファイル作成についてはこのサイトを参考にさせていただきました。 www.tohoho-web.com/java/other.htm このような場合にブラウザでアプレットとして動かすにはどうすればよいのでしょうか。 よろしくお願い致します。
723 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:05:25 ] 失礼します。 for(int i=0;i<numChips;i++){ mapChipImages[i]=createImage(chipSize,chipSize); int x=i%numChipsInRow; int y=i/numChipsInRow; Graphics g=mapChipImages[i].getGraphics(); g.drawImage(mapChipImage,0,0,chipSize,chipSize,x*chipSize,y*chipSize,x*chipSize+chipSize,y*chipSize+chipSize,null); } numChips=64,chipSize=32,numChipsInRow=8です。 と、このようなものがあるのですがこちらの5行目(Graphics g=...)にて Exception in thread "main" java.lang.NullPointerException というエラーが発生してしまい困っております。 ttp://javagame.main.jp/index.php?FrontPage#rd9af24b こちらのマップエディタの描画処理をrepaint();ではなく基礎-アクティブレンダリングで紹介されているものに 置き換えようとしたのですが上手く行かず困っています。 よろしくお願いします。
724 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:18:51 ] マップエディタをアクティブレンダリングにして何の意味があるんだ?
725 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:25:43 ] >>724 ごめんなさい。しっかりと書くべきでした。 ttp://javagame.main.jp/index.php?FrontPage#rd9af24b で紹介されているマリオ風アクションゲームにてマップエディタを使い記録したものを 読み込ませるために使いたいのです。なので本来はマップエディタのマップを読み込み 描画するというところだけを抜き出せばよいハズなのですがどうも上手く動かなかったので 質問した次第です。ご迷惑をお掛け申し訳ありません。
726 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:27:21 ] ついでに答えるか。 javaはパッシブレンダリングだからアクティブレンダリングするときは自分でバッファ管理しないとNPE出るけどそれじゃない? ttp://homepage1.nifty.com/algafield/JavaGUIFaq19j.html#three4
727 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:30:29 ] >>725 表示させるだけならアクティブレンダリングの意味ない
728 名前:デフォルトの名無しさん mailto:sage [2008/02/04(月) 21:43:42 ] >>726 まだ、私は日が浅いため理解するのに時間はかかりそうですが 頑張って理解してみようと思います。 >>727 そうなのですか。しかし、そうだとしても一枚のグラフィックを複数に分けて 使用するというのは今後も使いそうなのでできれば習得しておきたいと考えたのです。 実際、使う画像を一枚一枚分けて保存していては管理も大変だと思ったので。
729 名前:デフォルトの名無しさん [2008/02/05(火) 00:31:24 ] 解放したら自動的にnullになりますか? これまでずっとCだったので、JAVAはよく分かりません。 www.asahi-net.or.jp/~ns9k-mr/csproject/jdbc_source/mvc.html の }finally{ try{ if(rs != null) rs.close(); の部分です。 rsにnullを代入している記述は見つかりませんでした。 JAVAでは一般的に、*.close()すると、*はnullになるように クラスが設計されているのでしょうか?
730 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:43:22 ] >>729 > JAVAでは一般的に、*.close()すると、*はnullになるように ならないよ。
731 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 00:47:27 ] >>729 * がnullになる、という状態が上手く理解できていないので、Javaの方だけ説明します。 closeの内部で何をしているかについては実装しだいですが、 API の説明を見る限りでは、「JDBCリソース」を直ちに解放するようです。 try文の外、宣言部分で null 代入してます。 nullチェックをしているのは、値が入る前に例外が発生した時を想定しています。 ヒープからの解放は、GCにお任せなので、制御できません。
732 名前:デフォルトの名無しさん [2008/02/05(火) 01:13:45 ] >>730 >>731 それならfinallyで if(rs != null) rs.close(); こんなことが書いてあるということは、処理がうまくいった場合は rs.close();が実行されて、その後にtryを抜けるところで finallyによってもう一度rs.close();が実行されようとする悪いソースなのでしょうか?
733 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:26:31 ] close() は 2 回以上呼んでも問題ないという Connection の仕様だから問題ない。 ただそのサイトのソースの書き方 }finally{ try{ if(rs != null) rs.close(); if(stmt != null) stmt.close(); if(con != null) con.close(); }catch(SQLException se){ se.printStackTrace(); } } とか文字列連結で SQL パラメータ追加したりとかウンコすぎ。
734 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 01:29:19 ] >>733 >}finally{ >try{ >if(rs != null) rs.close(); >if(stmt != null) stmt.close(); >if(con != null) con.close(); >}catch(SQLException se){ >se.printStackTrace(); >} >} なにがいけないの? 一個目で例外が出ると全部コケる所?
735 名前:デフォルトの名無しさん [2008/02/05(火) 02:04:48 ] >>733 Cでよくあるclose()のように、そのclose()も2回呼んでもエラーにならないと 想像してはいましたが、Cやってる人なら普通はclose()したらその直後にNULL入れるから そういうソース見るとウンコかと。 でもJAVA知らないのでclose()の内部でnullする処理があるのか気になりました。
736 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:15:09 ] > Cやってる人なら普通はclose()したらその直後にNULL入れる そんなことしたことない。
737 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:22:06 ] 文字列を返すというクラスbを作りました。 bは引数が1つあって、引数に与えられた文字の手前に"f"を挿入した文字を返します。 結果は"fh"となることを期待しました。 期待通りになるように修正していただけませんか? public class a { public static void main (String args[]) { String g = b("h"); System.out.println("Hello World!!"); } } public class b { b(String c){ d(c); } private String d(String c) { String e = new String("f" + c); return e; } }
738 名前:デフォルトの名無しさん [2008/02/05(火) 02:25:07 ] >>735 それぞれの変数に値入れる前に例外発生してfinallyブロックに行く可能性があるからそういうコードになる。
739 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:25:30 ] Javaの人でも close 直後に null を入れて大丈夫です。 但し、最終的な解放は GC 任せですので、あしからず。 Javaの場合は、裏でOSネイティブなリソースを使ってる場合があって、 明示的に解放してあげないと、何時までも占有する可能性がある。 特に、close はそういうことに関係してるかと。
740 名前:デフォルトの名無しさん [2008/02/05(火) 02:27:28 ] >>737 まずコンパイル通せよ。 まぁそのままだと実行しても"Hello World!"としか表示されないだろうが。
741 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:30:15 ] ローカル変数なら、nullを入れてもあまり意味がない。 フィールドや、外部に晒した変数なら、nullを入れるのもいいかもしれない。
742 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:32:36 ] >>734 その通り。トランザクションの不整合などで rs.close() が例外になるとステートメントや コネクションがクローズされない。 >>735 大きな try-finally 節の中で何度もオープン/クローズを繰り返すような時はクローズ後に null を代入して、finally 節の close() は例外発生時の大域的な保障と位置づけることも あるが、そのソースのように最後に 1 度だけやれば良いようなときは最後の finally に 任せてわざわざ try 節内ではクローズしない。一回目の close() で失敗したときの予備 としてもう一度試行する意図かもしれないが、DB の問題はもう一度やってうまく行くという ものでもないし。つーかそのページの趣旨は JDBC コーディングどうあるべきかじゃない んだからそんなお作法的なところは適当に読め。
743 名前:デフォルトの名無しさん [2008/02/05(火) 02:36:15 ] >>738 それはエラーが発生した場合ですよね。 正常な場合にclose()を2回実行しようとするのはウンコだと思います。 >>739 JAVAは解放をGCがやってくれるらしいですが、Cと違って やってくれるのはnewに対する解放のみなんでしょうか?
744 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:39:57 ] >>743 スタックには参照しか置けねーよ アホ
745 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:42:28 ] >>740 コンパイルしましたがまだ分かりません。 ↓a.java public class a { public static void main (String args[]) { String g = new String(""); // g = b("h"); コメントアウトしたらコンパイルできました。 System.out.println(g); } } ↓b.java public class b { b(String c){ d(c); } private String d(String c) { String e = new String("f" + c); return e; } }
746 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:43:43 ] そのソース、シャットダウンシーケンス入ると最悪だなw
747 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:45:03 ] >>734
748 名前:デフォルトの名無しさん [2008/02/05(火) 02:45:47 ] >>744 文章が簡素で短い。頭に思い浮かべている内容に自信がないみたいだね。 とりあえず744はアホのままでいいから744がスタックについて理解を 深めるのを阻止するためにスタックの話題はスルー。
749 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 02:50:58 ] >>748 ハァ? ヒント: C はクラスのインスタンスをスタックに置ける
750 名前:デフォルトの名無しさん [2008/02/05(火) 02:59:14 ] >>743 java からJNIなどを使ってネイティブなコードから確保したメモリはGCの対象にはならない。 ネイティブじゃなくても、オブジェクト作成時にJavaやアプリケーションサーバなどで内部的に管理されるようなリソースもGCの対象にならない (トランザクションとか。アプリ側から参照を外してもJavaVMやAPServerが参照を持っちゃってるからGCの対象にならない)。 こういうのは明示的にcloseを実行することによって管理側から参照が外されてようやくGCの対象になる。 それ以外はアプリ側から参照を無くすだけでGCの対象になる。
751 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:07:05 ] close() が必要なのは大抵ファイナライザで呼び出すよう実装されてるけどな (しなくて良いという意味ではなくて)。
752 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:16:11 ] ↓a.java public class a { public static void main (String args[]) { if(true){//できる。 b b_ = new b("h"); String g = b_.d("h"); }else{//本当はこっっちでやりたい。 String g = new b("h"); } System.out.println(g); } } ↓b.java public class b { b(String c){ d(c); } public String d(String c) { String e = new String("f" + c); return e; } }
753 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:19:34 ] public class a{ public static void main(String[] args){ System.out.println(b.d("h"); } } public class b{ public static String d(String c){ return "f" + c; } }
754 名前:デフォルトの名無しさん [2008/02/05(火) 03:26:40 ] >>752 > //本当はこっっちでやりたい。 > String g = new b("h"); これはbをどう変更してもできない。仕様的に。
755 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:27:55 ] >>752 String型を返すコンストラクタはString以外には存在しない。 文字列の結合が目的ではないと思うが、 あまりにも簡単なことをこなす為に、拘る内容があまりにも初歩的。 ・クラスの継承、型と代入について ・コンストラクタの仕組み、メソッドとの違いについて
756 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:32:32 ] >>754 コンストラクタは自分のクラス型しか返せないということですね。 >>753 できました。ありがとうございます。メソッドをstaticにしないとうまくいきませんね。 public String d(String c){ static String s = new String("f" + c); return s; } これだとコンパイルエラーでした。
757 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:43:05 ] コンストラクタは何も返さない newオペレータが指定されたクラスのインスタンスを構築してその参照を返す その構築の際にコンストラクタが使用される
758 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 03:54:53 ] >>757 Javaではnewは演算子扱いではなくてクラスインスタンス生成式や配列生成式を示すだけのキーワード扱いじゃなかったかな。
759 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 04:01:42 ] あ、いや、すまん。演算子扱いだったのかもしれない。気にしたことないのであやふやだ。 JLS見てみる。
760 名前:デフォルトの名無しさん [2008/02/05(火) 04:53:50 ] Stringの質問です。前者は後者の記述の略として解釈され、 前者と後者の振る舞いは等しいものでしょうか? String s = "1"; String s = new String("1");
761 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 04:55:06 ] ちがいます
762 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 05:12:42 ] カノニカライゼーション www.nextindex.net/java/class/String.html
763 名前:デフォルトの名無しさん [2008/02/05(火) 05:26:33 ] >>762 ありがとうございます。 普通は String s = new String("1"); s = "6"; だと思いますが、 String s = new String("1"); s = new String("6"); こうしてもよいのでしょうか?
764 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 05:28:52 ] すみません jarファイルをダブルクリックするとラプラスが起動して解凍してしまいます 拡張子を何に関連づけすれば解決するでしょうか
765 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 05:53:29 ] javaw
766 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 08:12:02 ] 通常は new String("")は使用しない。
767 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:04:47 ] new String(".....") は使わないように。 Stringは不変オブジェクトだから、無駄なインスタンスができるだけ。 "...." だけでよい。
768 名前:デフォルトの名無しさん [2008/02/05(火) 12:08:00 ] SimpleDateFormat のスレッドセーフ化されたものとして FastDateFormat(format() のみ) がありますが、 parse() に関しては jakarta の DateUtils.parseDate() を 使用すればスレッドセーフになるんでしょうか?
769 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:39:48 ] Stringは参照先で弄っても元が破壊されないけど、StringBufferは壊れるからちょっとややこしい。
770 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:43:51 ] >768 メソッド内でSimpleDateFormatのインスタンスを生成してparseすれば済む話だろ
771 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:54:08 ] >>769 それは設計の問題で StringBuffer の問題ではないと思う。 一応、StringBuffer は同期化されてるので、「壊れる」ことはない。 意図しない結果をもたらす事はあるとしても。
772 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:58:37 ] >>770 SimpleDateFormatって複数インスタンス作っても 内部で同一オブジェクトを使いまわすのでスレッドセーフじゃないって話だったような。
773 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 12:59:09 ] new String()は文字コード変換ぐらいしか利用価値が無いと思え
774 名前:デフォルトの名無しさん [2008/02/05(火) 13:02:10 ] >> 770 www.geocities.co.jp/Playtown/1245/java/unsafe_simple_date_format.html この辺みてるんですけど、それで解決する問題なのかどうかが イマイチよくわからないんですよ、、、
775 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:07:49 ] SimpleDateFormatってスレッドセーフじゃないの? Servletで使いまくってるけどやばい?
776 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:31:40 ] >>775 参照を他のスレッドに晒さなければ大丈夫。 staticで持ってたりしたら危ない。
777 名前:デフォルトの名無しさん [2008/02/05(火) 13:40:50 ] >> 776 つまり、 >> 774 にある >SunのBug Paradeを、"+SimpleDateFormat +thread"で検索してもらうと >すぐわかるように、SimpleDateFormatクラスは、 >複数のインスタンスで同じオブジェクトを共有して持っており、 >スレッドセーフではありません。 という記述が間違いなんでしょうか? 複数インスタンスと言ってる時点で static では無いと思うんですが。
778 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:45:10 ] SimpleDateFormatが内部でstaticなデータを保持してんだろ? それくらいわかれカス
779 名前:775 mailto:sage [2008/02/05(火) 13:52:22 ] ということはやばいということですね。 どうしよう
780 名前:775 mailto:sage [2008/02/05(火) 13:55:30 ] どなたかスレッドセーフな SimpleDateFormat を作ってくれませんか?
781 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:57:01 ] synchronized使えカス
782 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 13:59:43 ] synchronized (SimpleDateFormat.class) { // SimpleDateFormatを使うコード } こうすれば中でstaticなデータ持ってようと、 同時に読み書きされることはない・・・はず。 マルチスレッドよぅわからん。
783 名前:775 mailto:sage [2008/02/05(火) 14:09:24 ] FastDateFormatに置き換えようかと思いますが FastDateFormat hms = FastDateFormat.getInstance("HH:mm:ss"); FastDateFormat ymd = FastDateFormat.getInstance("yyyy/MM/dd"); hms.format(.... ymd.format(.... こういうコードだとどっちみちダメなのでしょうか
784 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:14:16 ] なにがどうダメなんだ?
785 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:16:05 ] つうかローカル変数で使うのに何か具体的な不具合でも出てるわけ? マルチスレッドで使わなきゃ良いだけじゃん。
786 名前:775 mailto:sage [2008/02/05(火) 14:16:35 ] getInstanceでもnewのようにまったく別のインスタンスを作って くれるのでしょうか?
787 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:18:03 ] とりあえず、マルチスレッドの勉強を一からやり直せ。 ttp://www.amazon.co.jp/dp/4797337206
788 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:21:42 ] >>785 ローカル変数かどうかは問題じゃない。 インスタンスへのアクセスが閉じているかどうかだ。 >>783 おまえはスレッドセーフの意味が分かってなさそうだから。 まずはシングルスレッドで頑張れ。
789 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:23:38 ] つうかちょっとまて。ソース見たが SimpleDateFormat に関してはスレッドセーフでないことと 内部で static なオブジェクト使ってることとは関係ない。複数インスタンスで共有してるのは ロケールごとの静的なリソースだ。だから >>777 で引用部分の表現は明らかにおかしい。
790 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:25:11 ] >>788 ローカル変数ってのは表現間違えたがマルチスレッドで意味ぐらい汲めよ。
791 名前:775 mailto:sage [2008/02/05(火) 14:26:55 ] ではサーブレットでSimpleDateFormatをローカル変数で 都度newしているなら問題ないってことですね?
792 名前:デフォルトの名無しさん mailto:sage [2008/02/05(火) 14:29:51 ] >>791 そのローカル変数が他スレッドに漏れてなければ、ね