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

★★Java質問・相談スレッド133★★

レス数が1000を超えています。これ以上書き込みはできません。
0001デフォルトの名無しさん2009/09/20(日) 01:02:31
プログラミング言語Javaに関する質問スレです。
JavaScript, 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:53
>>948
JTableで文字列をクリックした場合だけセルを選択状態にする
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
>>949
不味い点が多すぎて。
とりあえず初期状態でpaint()が動くと、countでのforループの中でcount--して無限ループ。
0953デフォルトの名無しさん2009/11/21(土) 17:57:00
ん、踏んだか。次立ててくるね。スレ立てるのひさびさだな。
0954デフォルトの名無しさん2009/11/21(土) 18:00:17
次は

★★Java質問・相談スレッド134★★
http://pc12.2ch.net/test/read.cgi/tech/1258793926/
0955デフォルトの名無しさん2009/11/21(土) 18:01:20
乙
0956デフォルトの名無しさん2009/11/21(土) 18:05:44
乙
0957デフォルトの名無しさん2009/11/21(土) 18:18:26
>>949
わからん
0958デフォルトの名無しさん2009/11/21(土) 18:20:52
>>950-951
とんくす
0959デフォルトの名無しさん2009/11/21(土) 18:27:50
誰か2chにソース貼るとき整形するツール作れよ
0960デフォルトの名無しさん2009/11/21(土) 19:33:04
言いだしっぺの法則というものがありまして
0961デフォルトの名無しさん2009/11/21(土) 19:59:03
そんなものは存在せんわ戯けが
0962デフォルトの名無しさん2009/11/21(土) 20:24:16
言いだしっぺの法則 の検索結果 約 16,300 件中 1 - 100 件目 (0.58 秒)
0963デフォルトの名無しさん2009/11/21(土) 20:39:45
> "言いだしっぺの法則" の検索結果 約 11,600 件
> (中略
> 最も的確な結果を表示するために、上の679件と似たページは除外されています。

括って約11,600件、重複除外で679件
これだけでればまあ十分だな。
0964デフォルトの名無しさん2009/11/21(土) 21:32:51
とりあえず仕様を考えてみた。
Eclipseで再フォーマットすりゃいいんだから、バイト数減らすために改行と
トークン区切り以外の空白も除去、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:12
あーだこーだですね
0967デフォルトの名無しさん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
>>967
配列の場合 
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
>>968
それ間違ってね?

厳密な意味でディープコピーができてるのって
3か4で(直接・間接的に)内包する全ての参照のインスタンスを
同じくディープコピーした(できた)場合だけじゃね?

>>967
実業務で厳密なディープコピーが要求されるシーンはそれほど多くないが、
シリアライズ・デシリアライズで代用することもある。(むしろWeb系だとこっち)
0971デフォルトの名無しさん2009/11/22(日) 18:39:53
ごめん。

3か4で(直接・間接的に)内包する全ての参照のインスタンスを
↓訂正
2か3で。。。
0972デフォルトの名無しさん2009/11/22(日) 19:34:00
>>967
配列もコレクションも 1って代入演算子の左辺と右辺が同じ参照さすのでコピーになってないような。
コレクションの new ArrayList(list) は list が ArrayList のインスタンスでない場合に
コピーと称するのはどうなんだろうな、という気がしなくもない。
0973デフォルトの名無しさん2009/11/22(日) 20:53:31
>>970
そこまで考えてなかった
0974デフォルトの名無しさん2009/11/22(日) 21:16:41
シリアライズで質問です。
class 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:47
readObjectしたarrayの中身が全部そうなら、多分バグ。
0976デフォルトの名無しさん2009/11/22(日) 21:28:13
よく見たらバグってるのは i<100の方だな。死ねよ
0977デフォルトの名無しさん2009/11/22(日) 21:39:44
あえて言おう
javaは貧弱であると
0978デフォルトの名無しさん2009/11/22(日) 21:51:06
DIO乙
0979デフォルトの名無しさん2009/11/22(日) 21:51:27
javaの文法が嫌いですVBの文法はもーっと嫌いです
0980デフォルトの名無しさん2009/11/22(日) 21:57:57
そうですか、Rubyでもやってください
0981デフォルトの名無しさん2009/11/22(日) 22:02:51
>>970
それがあるからcloneは仕様上シャローで実際に使う際は実装にしたがってね。
ってことになってるんじゃね?
0982デフォルトの名無しさん2009/11/22(日) 22:17:17
実際のところ直接のオブジェクトがコピーされていれば、そっから先は問題にならない場合が多い。
そもそもディープかシャローかをなるべく意識しなくて済むようなデザインをするべき。
0983デフォルトの名無しさん2009/11/22(日) 22:26:04
>>976
書き間違えました。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:12
deepcloneじゃなくてref渡しだと、readObjectすると全部が{0,1}ってことでしょ。
local varriableがfinalじゃないからクロージャ扱いって分けでもないのに、
なってなんかすごいね。javaのバクって感じだけど。
0986デフォルトの名無しさん2009/11/22(日) 22:44:54
>>984
c:\hoge\test.datというような外部のファイルです。
画面キャプチャをRobotでint[]として取って書き出すという
プログラムなので条件満たすまで無限ループという仕様です。

ヒープサイズをキャプチャが終わるまで落ちないような値まで大きくする
以外ないのでしょうか。
0987デフォルトの名無しさん2009/11/22(日) 22:52:07
不要なint[]をずっと保持し続けてんじゃないの?
Objectをファイルに吐き出したら、そのint[]は捨てられるはずだから、
無限にキャプチャし続けてもメモリがあふれることはないはず。(もちろんディスクはあふれるけど)
0988デフォルトの名無しさん2009/11/22(日) 23:04:09
int[] ary= getDeepCopy(a);
clss c= new clss(ary)
writeObject(c);
ary=null;
c=null;

と後片付けはしているつもりです。
これにgc();やflush();を加えてみてもやっぱり63M書き出したところで
out of memory errorで落ちてしまいます。
0989デフォルトの名無しさん2009/11/22(日) 23:09:42
JavaよりSEXについて教えてもらおうか
0990デフォルトの名無しさん2009/11/22(日) 23:13:50
-agentlib:hprofつけてプロファイラで確認してみそ。

java -agentlib:hprof -Xmx512m foo.bar.Hoge

java.hprof.txtがクラスルートに出来てるから読むか貼ってみ。
それか
-agentlib:hprof=format=bにしてJhat使ってもいい
0991デフォルトの名無しさん2009/11/22(日) 23:16:02
ああ、64mで死ぬってことはJDK1.4かな?
だったら-Xrunhprofね
0992デフォルトの名無しさん2009/11/22(日) 23:23:08
>>974
writeObjectに同じインスタンスを複数回与えたら、
readObjectもその回数だけ同じインスタンスを返す仕様
同じインスタンスが異なる値を持つことは出来ないから、そのような結果になる
writeObjectのそのような振る舞いを実装するために、
ObjectOutputStreamは一度書き込んだオブジェクトを全部覚えていて、
同じインスタンスは二度書き込まず前回書き込んだインスタンスの参照だけを書き込むようになっている
readObjectも最初と同じインスタンスを返すために、一度読み込んだインスタンスは全部覚えている
ObjectOutputStream#writeUnsharedとかObjectInputStream#readUnsharedを使ってみたらどうかな
0993デフォルトの名無しさん2009/11/22(日) 23:56:09
>>990
SITES 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:12
じゃあループ1回ごとにObjectOutputStream/ObjectInputStreamをnewし直す
0995デフォルトの名無しさん2009/11/23(月) 00:27:13
ちょっと>>794試した

writeObject(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
>>995
ごめん>>974

ObjectIn/OutputStreamってストリームに接続したときに何かネゴシエーション処理してたんだが
もしやそれのせいかの
0997デフォルトの名無しさん2009/11/23(月) 00:29:51
>>994
FileOutputStream 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:26
ume
0999デフォルトの名無しさん2009/11/23(月) 15:56:09
ume
1000デフォルトの名無しさん2009/11/23(月) 15:57:07
ume
10011001Over 1000Thread
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。
レス数が1000を超えています。これ以上書き込みはできません。