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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2011/01/25(火) 03:07:32
プログラミング言語Javaに関する質問スレです。
JavaScript, Ajaxの質問は、ここでは受け付けていません。
Web製作管理    http://pc11.2ch.net/hp/
Webプログラミング http://pc11.2ch.net/php/
をご利用下さい。

よくある質問
・「コマンドまたはファイル名が違います」
 「'javac' は、内部コマンドまたは外部コマンド、
 操作可能なプログラムまたはバッチ ファイルとして認識されていません。」
 「Exception in thread "main" java.lang.NoClassDefFoundError: 」
 (p)ttp://www.wikiroom.com/java/?path,classpath
・String に == は使うな。equals() を使え。
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」

前スレッド
★★Java質問・相談スレッド142★★
http://hibari.2ch.net/test/read.cgi/tech/1290103530/

次スレは>>950あたりで。

過去ログ、関連スレッド、よくある質問とその回答など、
質問をする前に、貴方が見なければならないサイトについての情報は、
下のwikiのページにまとめてあります。
http://www.wikiroom.com/java/
0655デフォルトの名無しさん2011/03/04(金) 11:14:07.73
>>653
そう思うよ。@paramや@throwsでだめな呼び出し方があると文書化できるし、実行時にもわかる
正しく処理されてだめな時はだめになるかを成立しているかは、テストで確かめられる
assertはエラーだからVMレベルで実行不可能という意味で使いたいところかな。書くのは簡単なんだけど

>>654
「何かしら例外を投げるだろう」はコードの浅いところで起きた方がいいと思う
それに例外が無いということはすべての変数が受け入れ可能って仕様になるから
呼び出しミスなのにメソッドの実装ミスを意味させることになる
今回の場合設計上悪い呼び出し方があるって解っていることだし
コードは短い方がいいけど、間違いが解りやすくなってる方がよりいい
0656デフォルトの名無しさん2011/03/04(金) 11:28:32.50
つまらん
0657デフォルトの名無しさん2011/03/04(金) 12:53:39.03
>>654の書いたコードは使いたくないな…

基本的にはJavadocに書いた仕様を満たすようにすりゃ良いとは思う
引数の仕様にi <= 0はダメって書いてあるならIAE投げるのが普通だろ
0658デフォルトの名無しさん2011/03/04(金) 15:29:39.97
仕様と申されましても、

誰が使うか全くわからんくらいに大量配布するAPI作るってんならともかく、
ふつう目的の機能を動かすためにプログラミングするんだろう

どうせ投げない例外処理を書いてもしょうがない

(当たり前だが、失敗しそうなことに対して自動テスト書いてくことのほうが大事)
0659デフォルトの名無しさん2011/03/04(金) 15:35:49.46
>>658
素人さん?
0660デフォルトの名無しさん2011/03/04(金) 15:45:04.87
素人というより>>658は育った環境(会社/学校)が悪いんだろうな
そもそも自動テストを「失敗しそうな事」とやらの検証の為に書いている時点でおかしいだろ
自動テストは仕様通りの動作をする事を保証する為に書く物だ
その例外が発生しない事をお前はどうやって保証するつもりだよ
「ぼくがぼくの為に書いてぼくが使ってるAPIなんだから絶対大丈夫だよ!」とでも言うつもりか
0661デフォルトの名無しさん2011/03/04(金) 15:57:54.64
幾つかの標準APIに不正な値を入れると、IllegalArgumentExceptionではなく、ArrayIndexOutOfBoundsExceptionが戻ってくる事実。
0662デフォルトの名無しさん2011/03/04(金) 16:00:47.48
>>661
良く嫁
0663デフォルトの名無しさん2011/03/04(金) 16:25:09.24
パブリックAPIならきっちりチェックするのは当然
範囲外の値を引数に指定したらArrayIndexOutOfBoundsExceptionをスローするとドキュメントに書いてあるなら
別にそれはそれで構わないが、エラーを出さずに正しく動いているように見えてしまったり
後になってからエラーが出たりするのは最悪
0664デフォルトの名無しさん2011/03/04(金) 16:45:10.42
>>661
それはそういう仕様だとJavadocに書いてあったりしないか?
仮に書いていなかったとしても、標準APIでもある事例だからと言って
問題解決を複雑化したり、バグの温床になるようなコードを書く理由にはならない
Javaは上位互換を大事にしている言語だから
実際はその仕様はイケてないと思われているけれど
スローする例外の種類が変わると互換が崩壊するから
なおしたくてもなおせない可能性だってあり得るわけで
0665デフォルトの名無しさん2011/03/04(金) 16:52:49.18
パッケージ単位で統一されてりゃ不正なnullに対して
NullPointerException投げるんでもIllegalArgumentException投げるんでもどっちでもいい。

そーいやmethod(@NonNull String arg)みたいなアノテーションってどうなったんだっけ?
0666デフォルトの名無しさん2011/03/04(金) 17:01:45.67
>>665
JSR308が動いてないから無かった事になってるんじゃない?
0667デフォルトの名無しさん2011/03/04(金) 17:02:50.66
俺様仕様うざい
0668デフォルトの名無しさん2011/03/04(金) 17:05:00.32
どこから飛んでくるかわからない例外投げられる方がうざいな
0669デフォルトの名無しさん2011/03/04(金) 17:12:54.16
そんなことより野球しようようぜ
0670デフォルトの名無しさん2011/03/04(金) 17:57:36.22
>>654はすなおにごめんなさいすればいいとおもう
0671デフォルトの名無しさん2011/03/04(金) 19:01:09.60
バカjaver同士なんだから仲良くしろ
0672デフォルトの名無しさん2011/03/04(金) 19:44:29.52
仲良くしたいんだけど俺みたいなバカの相手してくれる人がいないんだよね
0673デフォルトの名無しさん2011/03/04(金) 19:53:20.67
>>665
そういう機能入れだしたら歯止めがきかなくなるんだよな
俺俺JavaだらけになってC++みたいになる
0674デフォルトの名無しさん2011/03/04(金) 21:59:25.33
>>673
似たような物でグーグルがインターフェイスでバリデーションかけれるフレームワークリリースしてたけど
あれはインターフェイスでバリデーションかけられるから良いんであって
@NonNullとか怖ろしい真似するのはやめて欲しいよな
0675デフォルトの名無しさん2011/03/04(金) 22:06:05.74
synchronizedの中でObject.wait(〜)する場合、waitが終わったスレッドから実行されるでOK?
0676デフォルトの名無しさん2011/03/04(金) 22:08:10.06
Javaで彼女を作ってくれ
0677デフォルトの名無しさん2011/03/04(金) 22:11:15.36
成立するはずのものは成立するはずだから、テストも書くなよ?
0678デフォルトの名無しさん2011/03/04(金) 22:23:35.85
>>675
synchronizedで他のスレッドが実行されてる時は
そのスレッドがロックを解除するまでwaitが維持される
0679デフォルトの名無しさん2011/03/04(金) 22:25:39.81
public void a(int i) {
if(i > 0) b(i);
}
private void b(int i) {
if(i <= 0) throws IllegalArgumentException();
...
}
この IllegalArgumentExceptionを投げる分岐はVMレベルで到達可能なのか?
0680デフォルトの名無しさん2011/03/04(金) 22:34:13.41
>>664
書いてはある。ただし明示的チェックはしていないとあるし、throwする例外だと宣言されているわけではない。>>654 と同じ方針だと思われる。

> 領域が境界内にない場合は、ArrayOutOfBoundsExceptionがスローされることがあります。ただし、明示的な境界チェックは必ずしも実行されません。

NullPointerExceptionとArrayOutOfBoundsExceptionは明示的にチェックされていないことが多い。
0681デフォルトの名無しさん2011/03/04(金) 22:35:43.39
a()以外のメソッドからb()が呼ばれる可能性を否定できないんじゃね?
仮にそのクラスにそれ以外メソッドがないとしても、リフレクション経由の呼び出しもあるし。
0682デフォルトの名無しさん2011/03/04(金) 22:39:18.88
>>678
Thread.sleepだと維持されるけど、Object.waitだとされないんだよ…
俺も今日試して知ったんだが…
0683デフォルトの名無しさん2011/03/04(金) 22:40:52.80
リフレクションでprivateメソッドをinvokeできたっけ?
0684デフォルトの名無しさん2011/03/04(金) 22:43:02.54
>>680
java.lang、java.io、java.utilあたりは真面目に境界チェックやnullチェックやってたような。
0685デフォルトの名無しさん2011/03/04(金) 22:44:23.12
>>683
setAccessibleすりゃできるよ。
0686デフォルトの名無しさん2011/03/04(金) 22:46:59.47
>>679
お前はその状態からbが呼ばれる複数の方法が想像できない程度のバカなのか?
仮にその二つのメソッドしかないプログラムならば、お前はそんなコードを書くバカなのか?
違うだろ?
0687デフォルトの名無しさん2011/03/04(金) 22:48:00.41
>>681
privateメソッドなのに
b()が呼ばれる可能性を否定できない!
とそのクラスを開いているエディタの前で頭抱えるのか?

ああ、リフレクションね。
そんなこと言ったら、Threadの推奨されないメソッドを使ったりすると
いつでもどこでもチェックされる例外が投げられる可能性があるから、
どこでも、Exceptionをキャッチしとかないとね。
0688デフォルトの名無しさん2011/03/04(金) 22:51:25.26
>>684
真面目にチェックしているAPIを呼ぶ前に、値のチェックをするべきかって話。
APIからにしろ、ユーザーコードにしろ、例外が投げられて処理を抜ける。
0689デフォルトの名無しさん2011/03/04(金) 22:53:58.28
>>679のコードは実在するならば書いた奴をクビにしたいレベル
0690デフォルトの名無しさん2011/03/04(金) 22:59:36.71
>>686
VMで到達不可能なところにassertを書くべきならば
IllegalArgumentExceptionを投げる分岐は到達不可能なのだから
IllegalArgumentExcpetionを投げるよりはassertを書くべきだろ

と主張したつもりだったのだが、
便所の落書にこんなにつらづらと書くのは面倒だし
意図は分かるだろうと手抜きをした俺は馬鹿なのか?
0691デフォルトの名無しさん2011/03/04(金) 23:08:38.78
>>690
>便所の落書に

真面目な返事を期待したのが(ry
0692デフォルトの名無しさん2011/03/04(金) 23:13:12.17
アサーションと例外どちらにするかを選択しようとしてる時点で間違ってるだろ
アサーションはあくまでテストの為の物なんだし
0693デフォルトの名無しさん2011/03/04(金) 23:20:16.25
アサーションは実行可能なコメントだろ。
0694デフォルトの名無しさん2011/03/04(金) 23:26:53.25
>>679だけ見てassertかIAEか、と読み取れる奴はエスパーとしか。
0695デフォルトの名無しさん2011/03/04(金) 23:29:45.75
あさーとなんて自動テスト書いてれば不要
0696デフォルトの名無しさん2011/03/04(金) 23:32:34.25
IAEは公開メソッドの事前条件チェックにおいてのみ使うべき。
事後条件、不変条件および非公開メソッドの事前条件はassertを使う。
0697デフォルトの名無しさん2011/03/04(金) 23:39:23.29
そもそも、assertとか使わん
0698デフォルトの名無しさん2011/03/04(金) 23:41:30.67
どうでもいいけどなんでassertをキーワードにしちゃったんだろう
もうちょっとマシなやり方あったんちゃうんかと
0699デフォルトの名無しさん2011/03/04(金) 23:45:05.34
assertとか使わん(キリッ とかいらんから。
そういう奴はjava.util.loggingは使わん(キリッって言ってんだろうな。
0700デフォルトの名無しさん2011/03/04(金) 23:45:11.46
>>697が全て
0701デフォルトの名無しさん2011/03/04(金) 23:45:45.86
うんこ
0702デフォルトの名無しさん2011/03/04(金) 23:48:24.54
>>699
ロガーも実際使わないだろ?
標準APIや言語機能であっても
イケてなければ代わりのものを使うのは
カッコ悪いことじゃないよ
0703デフォルトの名無しさん2011/03/04(金) 23:55:51.43
いや普通に使うが。
0704デフォルトの名無しさん2011/03/05(土) 00:09:50.34
そっすか
カッケーッスネ
0705デフォルトの名無しさん2011/03/05(土) 00:20:21.87
>>696
防御的コピーの前に事前条件チェックは意味ないし、
オブジェクトの責務を考えれば、防御的コピーはそれをフィールドに格納するクラスが行うべき。

したがって、非公開なメソッド(コンストラクタを含む)まで事前条件のチェックが遅延されるかもしれないし、
その場合そこでIAEを投げざるを得ない。

また、オブジェクト指向の意味を考えれば
オブジェクトは、そのメソッドの呼び出しかたや順序に依存せずに整合性を保つことを保証することで、
一度に考えなければならない複雑さを各オブジェクトに分散・カプセル化しているのだから、
privateなどでカプセルの内側でありオブジェクト指向の範囲外であることを明示でもしてない限り
渡されてくるオブジェクトに対して、事前条件のチェックがされているのか、それとも遅延されているのか
判断する材料をそのオブジェクトの外に求めるのは、カプセル化に逆行する。
0706デフォルトの名無しさん2011/03/05(土) 00:26:26.75
java virtual machine launcherによるエラーがOKして消してもまた出てきてしまうんだが、
対処法ある?
0707デフォルトの名無しさん2011/03/05(土) 01:05:01.82
>>706
プロセス殺したら?
0708デフォルトの名無しさん2011/03/05(土) 02:08:54.44
参考になるオープンソースプロジェクト教えてください
0709デフォルトの名無しさん2011/03/05(土) 02:25:32.10
SourceForge.JP: オープンソース・ソフトウェアの開発とダウンロード
http://sourceforge.jp/
0710デフォルトの名無しさん2011/03/05(土) 02:33:37.16
>>709
もっと具体的にお願いします
0711デフォルトの名無しさん2011/03/05(土) 02:44:59.95
>>705
> 防御的コピーの前に事前条件チェックは意味ないし、
意味不明
0712デフォルトの名無しさん2011/03/05(土) 12:29:29.79
>>679
ありえない。だから例外やassertは無くてもいい
privateメソッドは参照もとをテストすれば実装が正しいかわかるから
でもプログラミングミスを防ぐ目的なら入れてドキュメントを作るとなお良い
入れるとして、assertよりillegalArgumentExceptionの方が意味が合う
そもそもassertは、使われるかもしれないし使われないかもしれないから、チェックにならない

0713デフォルトの名無しさん2011/03/05(土) 12:38:49.59
>>712
だから、assertは実行することもできるというオマケつきのコメントだと
コメントは必要ないと主張するのか?
0714デフォルトの名無しさん2011/03/05(土) 12:43:02.93
するーしろ
0715デフォルトの名無しさん2011/03/05(土) 13:49:38.54
java.util.concurrent.locks.ReentrantReadWriteLockが遅くて泣ける。
0716デフォルトの名無しさん2011/03/05(土) 14:30:39.31
>>713
コメントに書くくらいならドキュメントに書け
情報分散させんなカス
0717デフォルトの名無しさん2011/03/05(土) 15:13:15.92
コメントに書いてjavadocで落としたらええがな
0718デフォルトの名無しさん2011/03/05(土) 15:41:03.36
とりあえず、到達可能か否かは無駄な議論じゃないか?
根本的にassertと例外を比較してるのが間違いだと俺も思う
assertはあくまで実行可能なコメントでありテスト用途だと思うし
コンパイル方法によっては実行されない以上は例外の代用たり得ない
コメントとしては、プログラミング中のミスも把握しやすいし悪くはないと思うよ
他の人がソース読んだ時も、条件が明示的に書いてあって見通しは良くなると思う
ただErrorで落とすようなものだし、一応Javadocにもその旨記載した方が良いんじゃない?
意図的にエラーで落とすプログラムってのが俺には想像付かないけど経験不足なんだろう
俺ならエラーで落とすくらいなら、例外投げてキャッチしてログ吐いてから終了って手順を取る
0719デフォルトの名無しさん2011/03/05(土) 15:42:56.92
とりあえず、枝豆
0720デフォルトの名無しさん2011/03/05(土) 16:24:27.25
引っかかったら自分自身が間違ってる、もしくは自分と利用者の関係が
直接「お前の使い方が間違ってる」と怒鳴りに行けるような関係ならポリシー次第でassertでもいい
代わりにコードに怒鳴らせる必要があるなら例外
0721デフォルトの名無しさん2011/03/05(土) 16:36:53.74
サンのジャバ・コンパイラはいつも優しくしてくれました
0722デフォルトの名無しさん2011/03/05(土) 16:43:25.34
質問すれなのにバカ自説披露するバカ
0723デフォルトの名無しさん2011/03/05(土) 16:55:00.38
>>722
assertと例外の質問があったからだろバカ
0724デフォルトの名無しさん2011/03/05(土) 17:35:47.45
正解もわからないバカが勝手に質問に答えて、自説披露するのがこのスレの伝統
0725デフォルトの名無しさん2011/03/05(土) 17:40:56.05
>>718が一般的だと思うよ
assertは例外の代わりにはならないし
例外もassertの代わりにはならない
0726デフォルトの名無しさん2011/03/05(土) 17:46:21.44
正解なんかねーよ
内部をどう作ろうが勝手。プロジェクトのポリシー次第。
約束の通じない不特定多数が使うライブラリに関しては、引数はきっちりチェックして例外を投げる。
0727デフォルトの名無しさん2011/03/05(土) 18:12:44.71
privateメソッドが成功するか確かめるのはテストにやらせれば良くて
例外にしろassertにしろコード中に書かなくてもいいってのを説明したのが元々
理解したのか知らんけど、テストでわかるのに到達するしないの話になるのも知らん

引数チェックはもちろん入れたっていい。でもテスト通れば一応期待通り動いてるのは解る
チェック入れるならassertより例外を使うのが通例で、入れたらドキュメント(コメント)は書けと言ってる
例外なら@throwsで定型のドキュメントが書ける
assertなら@throws AssertionErrorだろうけど、俺はテストライブラリ以外でこれを見たことが無い
0728デフォルトの名無しさん2011/03/05(土) 18:17:22.49
>>727
要は元々の質問を読んでないって事だよな?
元々の質問には>>725で良いと思う
0729デフォルトの名無しさん2011/03/05(土) 18:18:05.73
誰かStackOverFlowに投稿してくれないかな
0730デフォルトの名無しさん2011/03/05(土) 18:31:40.46
>>728
そうそう、元々の元はそれ
0731デフォルトの名無しさん2011/03/05(土) 18:45:27.17
今度のオラクルさんは優しいんでしょうか・・・?
0732デフォルトの名無しさん2011/03/05(土) 19:24:53.33
gc発生後のヒープダンプを一定期間ごとに自動で取る方法ってある?
0733デフォルトの名無しさん2011/03/05(土) 19:48:06.04
>>732
ある
0734デフォルトの名無しさん2011/03/05(土) 20:10:50.20
実装が仕様にしたがってなかったときの挙動を仕様に書けとか
0735デフォルトの名無しさん2011/03/05(土) 20:46:04.90
>>734
勘違い乙
0736デフォルトの名無しさん2011/03/05(土) 22:04:20.74
モジュール内のバグ発見のために
NullPointerExceptionやIllegalArgumentExceptionを発生させるってどうなのか?

外部から引数ありのpublicメソッドがNPEやIAEを投げてきたら
自分が渡した引数に問題があると思ってしまうのが自然じゃないのか?
0737デフォルトの名無しさん2011/03/05(土) 23:32:39.07
>>736
お前は何を言ってるんだ?
0738デフォルトの名無しさん2011/03/05(土) 23:50:14.93
>>714
0739デフォルトの名無しさん2011/03/06(日) 00:37:59.53
DbCを理解してない奴にassertのなんたるかを説いても無駄。
末端コーダーの手抜きコードなんてさわりたくもないな。
0740デフォルトの名無しさん2011/03/06(日) 00:53:49.63
バカjaver同士で喧嘩
0741デフォルトの名無しさん2011/03/06(日) 00:53:55.81
>>739
こんなことを言う奴のコードなんて触りたくもないな。
0742デフォルトの名無しさん2011/03/06(日) 00:59:22.13
ぬるぽ
0743デフォルトの名無しさん2011/03/06(日) 01:01:36.01
>>733
どうやるの?
0744デフォルトの名無しさん2011/03/06(日) 10:07:21.12
>>742
がっ
0745デフォルトの名無しさん2011/03/06(日) 12:45:17.88
public void doSomething throws Exception{
//タスク実行
}
を、タスク実行の部分を
Thread t = new Thread(new Runnable(){
//タスク実行
}
のように非同期に書き換えたのですが
Runnable#run()の中で発生する例外を呼び出し元で処理させるようにしたいのですが
一般的にはどのように書くのがよいのでしょうか?
0746デフォルトの名無しさん2011/03/06(日) 13:21:30.79
>>745 例外処理用のメソッドを、書いて呼ぶ。
0747デフォルトの名無しさん2011/03/06(日) 18:05:04.07
>>746
すいません、よくわからないです。。
0748デフォルトの名無しさん2011/03/06(日) 19:32:28.12
Stringのメソッドcontainsでint型のjをチェックしたいとき
contains("" + j)とするとできるのですが
この引数 "" + j がCharSequenceになるのはどういうことなのか
わかりません教えてください。
0749デフォルトの名無しさん2011/03/06(日) 19:37:23.08
文字列 + 数値 の結果は、数値を文字列に変換した後で2つの文字列を結合した文字列になる。
これは言語仕様でそう決まっている。
文字列はStringクラスのインスタンス。
StringクラスはCharSequenceインターフェイスを実装している。
だから文字列をCharSequence型として扱うことができる。
0750デフォルトの名無しさん2011/03/06(日) 19:40:57.19
>>749
分かりました。ありがとうございます。
0751デフォルトの名無しさん2011/03/06(日) 20:48:35.71
>>745
今時非同期処理はThreadじゃなくてconcurrencyユーティリティを使いな
Callableのcallにタスクを書いてExecutorService作ってsubmit
Futureオブジェクトが返るから、それをgetする時にcallで呼んだ例外が解る。
Swing GUI使うならSwingWorkerで、タスクをdoInBackgroundに実装する方が楽
0752デフォルトの名無しさん2011/03/06(日) 20:53:28.58
オブジェクト型のクラスで
newをしなくていいクラスと
newをしなくてはいけないクラスの違いって何?
0753デフォルトの名無しさん2011/03/06(日) 21:45:49.26
>>751
なるほど。。ありがとう
調べてみます。
0754デフォルトの名無しさん2011/03/06(日) 21:59:25.46
JSTLで、${var} の値が表示されず、そのまま「${var}」と表示されてしまって困ってます。
なにか原因に心あたりはありませんでしょうか。
たとえば
<c:forEach var="i" begin="1" end="3">
 <p>i=${i}<p>
</c:forEach>
と書いた場合、実行結果が
 <p>i=${i}<p>
 <p>i=${i}<p>
 <p>i=${i}<p>
となります。期待するのは
 <p>i=1<p>
 <p>i=2<p>
 <p>i=3<p>
となります。ループはしているので、<c:forEach>は動いているのですが、${var}がうまく展開されません。
■ このスレッドは過去ログ倉庫に格納されています