★★Java質問・相談スレッド133★★
レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん
2009/09/20(日) 01:02:31JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理 ttp://pc11.2ch.net/hp/
Webプログラミング ttp://pc11.2ch.net/php/
をご利用下さい。
よくある質問
・「コマンドまたはファイル名が違います」
「'javac' は、内部コマンドまたは外部コマンド、
操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
「Exception in thread "main" java.lang.NoClassDefFoundError: 」
ttp://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」
前スレッド
★★Java質問・相談スレッド133★★
ttp://pc12.2ch.net/test/read.cgi/tech/1251630161/
次スレは>>950あたりで。
過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
ttp://www.wikiroom.com/java/
0951デフォルトの名無しさん
2009/11/21(土) 17:49:53JTableで文字列をクリックした場合だけセルを選択状態にする
ttp://terai.xrea.jp/Swing/CellAtPoint.html
MouseInputAdapter ma = new MouseInputAdapter() {
public void mousePressed(MouseEvent e) {
Point pt = e.getPoint();
int row = table.rowAtPoint(pt);
0952デフォルトの名無しさん
2009/11/21(土) 17:53:13不味い点が多すぎて。
とりあえず初期状態でpaint()が動くと、countでのforループの中でcount--して無限ループ。
0953デフォルトの名無しさん
2009/11/21(土) 17:57:000954デフォルトの名無しさん
2009/11/21(土) 18:00:17★★Java質問・相談スレッド134★★
http://pc12.2ch.net/test/read.cgi/tech/1258793926/
0955デフォルトの名無しさん
2009/11/21(土) 18:01:200956デフォルトの名無しさん
2009/11/21(土) 18:05:440957デフォルトの名無しさん
2009/11/21(土) 18:18:26わからん
0958デフォルトの名無しさん
2009/11/21(土) 18:20:52とんくす
0959デフォルトの名無しさん
2009/11/21(土) 18:27:500960デフォルトの名無しさん
2009/11/21(土) 19:33:040961デフォルトの名無しさん
2009/11/21(土) 19:59:030962デフォルトの名無しさん
2009/11/21(土) 20:24:160963デフォルトの名無しさん
2009/11/21(土) 20:39:45> (中略
> 最も的確な結果を表示するために、上の679件と似たページは除外されています。
括って約11,600件、重複除外で679件
これだけでればまあ十分だな。
0964デフォルトの名無しさん
2009/11/21(土) 21:32:51Eclipseで再フォーマットすりゃいいんだから、バイト数減らすために改行と
トークン区切り以外の空白も除去、1レスに埋め込める最大行・バイト数に収まる
ようにトークンで改行。
http://pc12.2ch.net/tech/SETTING.TXT より プログラム技術@2ch掲示板 は
BBS_LINE_NUMBER=16
BBS_MESSAGE_COUNT=2048
で、最大行数32行、2048バイト。
あ、行コメントは一行換算しないとならんか。
しかし、こんなん貼ったら邪悪なコード選手権の控え室みたいで嫌w
0965デフォルトの名無しさん
2009/11/22(日) 00:33:50単にインデントをつけてほしいって
>>959 は言いたかったんじゃないのか?
0966デフォルトの名無しさん
2009/11/22(日) 01:50:120967デフォルトの名無しさん
2009/11/22(日) 16:29:43配列の場合
1 イコールで結ぶ → シャロー
2 System.arraycopyを使う → シャロー
3 中身をひとつひとつコピーする → ディープ
コレクションの場合
1 イコールで結ぶ → シャロー
2 cloneを使う → シャロー
3 中身をひとつひとつコピーする → ディープ
4 new ArrayList(list)などと書く → ディープ
でよろしいでしょうか?
またこれ以外にもディープコピーする方法はあるのでしょうか?
0968デフォルトの名無しさん
2009/11/22(日) 18:19:36配列の場合
1 イコールで結ぶ → シャロー
2 System.arraycopyを使う → でぃーぷ
3 中身をひとつひとつコピーする → ディープ
コレクションの場合
1 イコールで結ぶ → シャロー
2 cloneを使う → コレクションの実装依存,シャロー
3 中身をひとつひとつコピーする → ディープ
4 new ArrayList(list)などと書く → Listの実装依存,ディープ
CopyOnWriteっつーやり方もあるので,シャローかディープかは実装みながらでないとこわい
0969デフォルトの名無しさん
2009/11/22(日) 18:23:50そのオブジェクトが不変クラスであるか否かでシャローかディープかも変わる。
0970デフォルトの名無しさん
2009/11/22(日) 18:37:23それ間違ってね?
厳密な意味でディープコピーができてるのって
3か4で(直接・間接的に)内包する全ての参照のインスタンスを
同じくディープコピーした(できた)場合だけじゃね?
>>967
実業務で厳密なディープコピーが要求されるシーンはそれほど多くないが、
シリアライズ・デシリアライズで代用することもある。(むしろWeb系だとこっち)
0971デフォルトの名無しさん
2009/11/22(日) 18:39:533か4で(直接・間接的に)内包する全ての参照のインスタンスを
↓訂正
2か3で。。。
0972デフォルトの名無しさん
2009/11/22(日) 19:34:00配列もコレクションも 1って代入演算子の左辺と右辺が同じ参照さすのでコピーになってないような。
コレクションの new ArrayList(list) は list が ArrayList のインスタンスでない場合に
コピーと称するのはどうなんだろうな、という気がしなくもない。
0973デフォルトの名無しさん
2009/11/22(日) 20:53:31そこまで考えてなかった
0974デフォルトの名無しさん
2009/11/22(日) 21:16:41class clss {
int[] arry
clss(int[] a){
arry=a;
}
}
みたいなクラスを
int[] a= {0,1};
int i=0;
while(true) {
a[0]=i++;
clss c= new clss(a)
writeObject(c);
if(i<100)break;
}
というようにループで書き出してそのファイルをデシリアライズすると
全ての取り出したインスタンスが
a={0,1}
になっているようなのですがこれは解決可能なのでしょうか?
0975デフォルトの名無しさん
2009/11/22(日) 21:26:470976デフォルトの名無しさん
2009/11/22(日) 21:28:130977デフォルトの名無しさん
2009/11/22(日) 21:39:44javaは貧弱であると
0978デフォルトの名無しさん
2009/11/22(日) 21:51:060979デフォルトの名無しさん
2009/11/22(日) 21:51:270980デフォルトの名無しさん
2009/11/22(日) 21:57:570981デフォルトの名無しさん
2009/11/22(日) 22:02:51それがあるからcloneは仕様上シャローで実際に使う際は実装にしたがってね。
ってことになってるんじゃね?
0982デフォルトの名無しさん
2009/11/22(日) 22:17:17そもそもディープかシャローかをなるべく意識しなくて済むようなデザインをするべき。
0983デフォルトの名無しさん
2009/11/22(日) 22:26:04書き間違えました。i>100です。
色々やってみたところ配列をディープコピーして
コンストラクタに渡せば値が変わるようになりました。
しかしそうすると63Mほど書き出した時点でout of memory errorで落ちてしまいます。
シリアライズでは巨大なファイルは取り扱えないのでしょうか?
0984デフォルトの名無しさん
2009/11/22(日) 22:31:01普通に無限ループしてんだろ。
プログラムにバグがない状況でOutOfMemoryを解消する場合は
-Xmx???m オプションをJVMに渡す。???はJVMが最大で使えるヒープサイズ
0985デフォルトの名無しさん
2009/11/22(日) 22:41:12local varriableがfinalじゃないからクロージャ扱いって分けでもないのに、
なってなんかすごいね。javaのバクって感じだけど。
0986デフォルトの名無しさん
2009/11/22(日) 22:44:54c:\hoge\test.datというような外部のファイルです。
画面キャプチャをRobotでint[]として取って書き出すという
プログラムなので条件満たすまで無限ループという仕様です。
ヒープサイズをキャプチャが終わるまで落ちないような値まで大きくする
以外ないのでしょうか。
0987デフォルトの名無しさん
2009/11/22(日) 22:52:07Objectをファイルに吐き出したら、そのint[]は捨てられるはずだから、
無限にキャプチャし続けてもメモリがあふれることはないはず。(もちろんディスクはあふれるけど)
0988デフォルトの名無しさん
2009/11/22(日) 23:04:09clss c= new clss(ary)
writeObject(c);
ary=null;
c=null;
と後片付けはしているつもりです。
これにgc();やflush();を加えてみてもやっぱり63M書き出したところで
out of memory errorで落ちてしまいます。
0989デフォルトの名無しさん
2009/11/22(日) 23:09:420990デフォルトの名無しさん
2009/11/22(日) 23:13:50java -agentlib:hprof -Xmx512m foo.bar.Hoge
java.hprof.txtがクラスルートに出来てるから読むか貼ってみ。
それか
-agentlib:hprof=format=bにしてJhat使ってもいい
0991デフォルトの名無しさん
2009/11/22(日) 23:16:02だったら-Xrunhprofね
0992デフォルトの名無しさん
2009/11/22(日) 23:23:08writeObjectに同じインスタンスを複数回与えたら、
readObjectもその回数だけ同じインスタンスを返す仕様
同じインスタンスが異なる値を持つことは出来ないから、そのような結果になる
writeObjectのそのような振る舞いを実装するために、
ObjectOutputStreamは一度書き込んだオブジェクトを全部覚えていて、
同じインスタンスは二度書き込まず前回書き込んだインスタンスの参照だけを書き込むようになっている
readObjectも最初と同じインスタンスを返すために、一度読み込んだインスタンスは全部覚えている
ObjectOutputStream#writeUnsharedとかObjectInputStream#readUnsharedを使ってみたらどうかな
0993デフォルトの名無しさん
2009/11/22(日) 23:56:09SITES BEGIN (ordered by live bytes) Sun Nov 22 23:38:58 2009
percent live alloc'ed stack class
rank self accum bytes objs bytes objs trace name
1 94.41% 94.41% 109190144 448 109190144 448 306708 int[]
2 1.90% 96.31% 2193552 9 142093424 583 306647 int[]
3 1.12% 97.42% 1291760 32294 276012080 6900302 306707 java.awt.Color
4 0.30% 97.73% 349256 5020 349256 5020 300000 char[]
でした。
この100M近くいっているint[]は書き出すループのあるメソッドで確保しているようでした。
>>992
やってみましたが全てa={0,1}のままでした。
0994デフォルトの名無しさん
2009/11/23(月) 00:02:120995デフォルトの名無しさん
2009/11/23(月) 00:27:13writeObject(c) ってのが中身どうなってるのかわからねーが適当に作ったら
同じ現象発生
なんでだ?
c:\WINDOWS>java -version
java version "1.6.0_14"
Java(TM) SE Runtime Environment (build 1.6.0_14-b08)
Java HotSpot(TM) Client VM (build 14.0-b16, mixed mode, sharing)
0996デフォルトの名無しさん
2009/11/23(月) 00:28:27ごめん>>974
ObjectIn/OutputStreamってストリームに接続したときに何かネゴシエーション処理してたんだが
もしやそれのせいかの
0997デフォルトの名無しさん
2009/11/23(月) 00:29:51FileOutputStream flOtptStrm = new FileOutputStream(flNm, true);
ObjectOutputStream objctOtptStrm = new ObjectOutputStream(flOtptStrm);
をループごとに呼び出して書き出したところ、読み出しの
objctInptStrm.readObject();
で
java.io.StreamCorruptedException: invalid type code: AC
が発生しました。
ループ2回目で発生しているのでうまくオブジェクトの追記ができないみたいです。
上記の問題ですが、
www.yukun.info/blog/2008/05/out-of-memory-error.html
まさにこれみたいで、ストリームをreset();すると64Mを超えても落ちなくなりました。
質問に答えてくださった方、本当にありがとうございました。
お手数をおかけしてすみません。
0998デフォルトの名無しさん
2009/11/23(月) 15:54:260999デフォルトの名無しさん
2009/11/23(月) 15:56:091000デフォルトの名無しさん
2009/11/23(月) 15:57:0710011001
Over 1000Threadもう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。