★★Java質問・相談スレッド180★★ [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
プログラミング言語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
・「\12288 は不正な文字です。」
文字リテラル以外で全角スペースは使えません。半角スペースに。
・その他の質問→「APIのjavadoc見ろ」
・String に == は使うな。equals() を使え。※
質問時の心得
・コンパイルエラーか実行時エラーか、エラーではないが意図しない動作なのかはっきりしろ。あとエラーメッセージちゃんと読め。
・前提条件としてOS、開発環境、バージョン、使用フレームワーク等を明記。
前スレ
★★Java質問・相談スレッド179★★
http://echo.2ch.net/test/read.cgi/tech/1476706523/ >>96
自分で分かってないの丸出しだな
equalsは置換原則に反する典型的なメソッドなので例としては最悪
Counterを継承すると適切に機能しなくなる >>98
なぜ反するか、継承すると適切に機能しなくなるかの説明できますか? >>99
Counter x = new Counter(1);
Counter y = new CounterEx(1, 2);
x.equals(y); //置換原則に従い、型を無視して1番目の値のみを比較するとtrue
y.equals(x); //2番目の値も比較してfalse
これはequalsの対称性を破っている 補足
対称性を満たすようにCounterEx#equalsの実装を変更しても仕様違反が生じる
Counter x = new Counter(1);
Counter y = new CounterEx(1, 2);
x.equals(y); //置換原則に従い、型を無視して1番目の値のみを比較するとtrue
y.equals(x); //相手がCounterの場合は x.equals(y) の値を返すように実装を変更してtrue
Counter z = new CounterEx(1, 3);
y.equals(z); //当然false
z.equals(x); //y.equals(x)の場合と同じくtrue
これは x = y かつ z = x なら y = z というequalsの推移性を破っている >>101
お前がリスコフの置換原則を守れないことはわかった。
もう二度とプログラム書くなよ。 質問させてください
メソッドaとbを持つ親クラスがあり、メソッドaは内部で自身のメソッドbを呼んでいるとします
次に親クラスを継承した子クラスを用意し、メソッドaとbの両方をオーバーライドし、メソッドaではsuperで親のaメソッドを呼んでいるとします
この時、子クラスのメソッドaを呼ぶと親と子どちらのbメソッドが実行されるのでしょうか? >>105
そういう意図せず呼び出し先が書き換えられてしまうトラブルがあるから、
オーバーライドを許すメソッドは極力制限するのが基本 >>106,107
ありがとうございました
書き換えられてしまうんですね。ちょっと設計見直してみます Javaでは伝統的にあんまりその辺ガチガチに作らないことが多い
継承はなるべくオープンであるべき!スーパークラスが壊れる?そんなのサブクラスの責任でしょ?っていう考原理主義的な考え方がまだ色濃く残っている
C#なんかだとオーバーライドさせたいところだけprotectedな仮想メソッドとして切り出しておいて
それ以外のオーバーライドは一切認めない、みたいなガッチガチな設計をするのが一般的なんだけど 上書きされたくないならメソッドに final つけときゃいいんじゃねーの? Javaでメソッドに軒並みfinal付けると、
上から目線でオブジェクト指向を理解していない馬鹿呼ばわりする奴がいるからなあ 初心者なんだけど、
スカイプとかって、なんという言語で作られてるの? C++だろう
MSだからスマホ版はC#に移行してるかもしれないけど >>109
Javaは継承したクラスが別物にしてしまうことを想定してないからな。
形だけ継承して中身を書き換えられるからタチが悪い。 >>114
高度なWindowsアプリならWindows SDKの可能性が高い。 めんどくせえからVBでテキトーに作っただけだったりしてな >>119
Windows SDKならCかC++なんだよ。知らないなら調べてもの言えよ >>122
スレタイ100回声に出して読んでから来いや ゴスリンがAmazonに入社したらしいね
もうAmazonがJava買ってくれよ Googleみたいなウェーイ系の延長と違ってAmazonはエンタープライズITに対してわりと理解があるし
Java開発のAWSへの取り込みを加速させるには悪くないんじゃないかな chromeブラウザのF12で表示される「NetWork」タブみたいに
URLにアクセスした際に送受信されるリクエスト全部取得する処理ってどうやれば実現できますか?
たぶんhttpClientかsocketあたり使うと思うけどhttpClientはレスポンスぐらいしか取れないように見える >>128
Httpclientでなぜできないと思うのか javacでコンパイルした後、クリーンのようなコマンドで.javaファイルを全て削除することは出来ないでしょうか? >>131
放っとけ
現実の開発でjavac手打ちなんてありえないからどうでもいい
mavenやgradleを使おうね どーしても欲しいってのならバッチ作ってパス通せばいい >>131
ファイルを消す方法はOSや操作環境によって違う。
Windowsでコマンドプロンプトならdelコマンド、LinuxやMacOSのようなUNIX系OSならrm等でできる。
ただしディレクトリの階層を降りて行って対象のファイルを全て削除したい場合はそれぞれやり方が大きく異なるのでよく調べてからやった方が良い。
確かUNIX系のOSではfindコマンドと組み合わせないとできない。
それとWindowsのエクスプローラは*.javaで検索後にまとめて選択して削除はできるかも知れない。やったことないけど。 >>134
消すのは.classだけにしてあげて
javacに-dだかつけて特定のとこに出力しといて毎回そこ消せばいい
面倒になってワンライナー書くようになって
色々やりたくなってスクリプト化して
mavenとかみたいなソフトを作ってね コンパイルしたら問答無用でソース削除ってすげえな
サムライだわ GridPaneで8×8のマスを作ってGUIのマインスイーパーのアプリケーションを作りたいんだけど
どうやって作ったらいいと思いますか? JavaのGUIなんて覚えてもどうせ実際の開発で使う機会はないんだから画面はAAでいいんじゃね
座標を入力してマスを開くようにしたらいい javacを質問したものですが.javaにコードを書くのですね
初心者の勘違いでした
java能力検定というものを受けてみようと思うのですが、試験ではjavaファイルを修正してjavacでコンパイルしたものを提出するようなのでビルドとクリーンは押さえておきたいと思い
オプションで出来るだろうなと思っていました そんなレベルで受かるような試験なら受ける価値は全くないと思う え?javacのオプションでファイル消せると思ってたの?
んなこたできねえ。 試験のお題が「ファイルを削除するプログラムを作りなさい」だったら笑うな。 コンパイラとビルドツールの違いがいまいち分かってないのか
というか、コンパイラがコンパイル対象消すって、機能としてはまず入れないと思うぞ
自分がクラスファイルを書き出した根拠を消すって、怖すぎ 本でしか勉強してないのかな
実践しなよ
それができないなら情報処理技術者試験とかのがいいんじゃないか そういやファイル削除するプログラムは初心者向けのお題としてはいいかも知れんな。
ワイルドカードも使えてオプションでディレクトリを降下して削除することもできるようなやつ。
暇な初心者は作ってみな。 Runtime.getRuntime().exec(new String[] {"bash", "-c", "find . -type f -name *.java" | xargs rm"}); ビルドツール使わずにEclipseでビルドが許されるのは小学生まで >>149
惜しい。*をエスケープしないとカレントディレクトリに一つjavaファイルがあったらbashに展開されてそのファイル名一つが指定されたことになってしまう。2つ以上あったらfindコマンドがエラーになって動かない。 それ以前の問題としてOSがUNIX系OSでなければ動かない可能性大か・・・ パッと見で、rmのエイリアスどうなってるのか不安になる >>156
あー。スペース入りファイル名ね。その場合 xargs に -0 が必要になるな。
てか、既に話が Java ではなくなってるな。
そう言えば Java だと1.7以降は java.nio.file.Files#walkFileTree() 使えば楽にできそうだな。
自分で再起処理書く必要がない。 walkFileTree()はstaticメソッドだった。何もしないでいきなり使える。 walkFileTreeは典型的なJavaらしい使い辛さ
なんでプル型(イテレータみたいに利用者側のアクションで取りに行く形のこと)にしなかったのか
ああいうSAXみたいなスタイルのAPIって実装する側は楽かもしれないけど利用者は面倒臭いだけなんだよな Visitorを実装するのが面倒臭いというのももちろんあるけど、
ああいうAPIの一番の問題はスレッドをブロックしやがること
処理を一時中断するにはいちいち別のスレッドを起動しなきゃいけない プル型の処理はnewDirectoryStreamやJava8で追加されたfindで可能
結果、
visitorの実装が面倒でブロッキングなwalkFileTree
サブディレクトリを再起処理してくれない上にStreamの名を冠しながらJava8のStreamと互換性のないnewDirectoryStream
メソッド増えすぎて反省したのか手軽なオーバーロードがなく引数の指定が面倒なfind
わずか2バージョンでこの乱立ぶりよ walkfiletreeは知らないがSAXは便利に使ってる
普段からsedとか使ってるからかな >>162
Javaも今はプルパーサが主流よ
SAXは不要な制限が付くだけの糞 >>163
流行りとかどうでもいいけど、どんな制限? >>164
制御を奪われてしまう
>>160の通りだね
プルパーサはラップすることで簡単にSAXを実装できるけど、逆にSAXをベースにプルパーサを実装するのは(シングルスレッドの範囲では)不可能
SAXを好む人を否定はしないけど、少なくとも低レベルAPIとして位置付けるには制限が強くて向いてないんだよ >>165
ストリーム開けっ放しにして他のこと始めるのか
その発想がなかった >>166
今時は非同期プログラミングの普及でいったん制御をフレームワークへ戻したいケースもよくあるからそんなにおかしな発想ではないぞ
DOMに近い感覚で必要な要素だけを処理できるのも大きなメリットだ
SAXだと、特定の要素に対する処理だけをメソッドに切り出すってのが非常にやりづらい >>167
あーそういうレベルで難しいんだ
それならしょうがない
出来る方法でやるといいよ プッシュだと例えば複数のxmlを開いて結合することができないわけです データをソートして出力したいんですが
TreeSetを使うとコンパレータのスコアが重複するデータは上書きされるみたいで
重複を許して保持するようなライブラリってありますでしょうか レスありがとうございます
ArrayListの中にsortらしいメソッドがみあたらないのですが
じぶんでsortアルゴリズムをかかなければいけないということなのでしょうか? なんでこの会話はSetとListがごっちゃになってるんだ? いまだにjava6つかってました…
この期にアップデートしてみます TreeSetですでにコードかいてるなら
ComparableのcompareToが0だったら1を返すとか0を返さないようにすればいいだけ バージョン上げるならJava8でStreamでソートが鉄板 サーブレット環境下
(tomcat8.0, java8)
の開発環境(eclipse neon.3)
でデータベース(postgresql)に
jdbcを使用し接続したいのですが
java.sql.SQLException: No suitable driver found for jdbc:postgresql://localhost:5432/test
at java.sql.DriverManager.getConnection(DriverManager.java:689)
at java.sql.DriverManager.getConnection(DriverManager.java:247)
の例外により接続できません。
jdbcドライバはWEB-INF/libの中にありeclipseではクラスパスを通してあります。
またWEB-INF/lib内の他のjarはjavaから認識されております。
jdbcドライバがtomcatから認識されていないのが問題だと考えておりますが、
その理由がよくわかりません。
よろしくお願いします。 >>182
https://stackoverflow.com/questions/5556664/how-to-fix-no-suitable-driver-found-for-jdbcmysql-localhost-dbname-error-w
Connection con = null;
try {
//registering the jdbc driver here, your string to use
//here depends on what driver you are using.
Class.forName("something.jdbc.driver.YourFubarDriver");
con = DriverManager.getConnection("jdbc:apache:commons:dbcp:test");
} catch (SQLException e) {
throw new RuntimeException(e);
}
ドライバクラスはスタティックイニシャライザでレジストするインプリメンテーションがデフォルト Tomcat 8.xだとTOMCAT_HOME/libに置かないといけなくなった。 >>184
>>185
ありがとうございます
ドライバが見つからないのはおまかんなわけではなく正しい挙動なんですね おまかんって略語否定するのもそろそろ老害みたいで見苦しいぞ 人の言動にまで注文つけるのか
おまかんがわからないなら訊けばいいだけだろ ■ このスレッドは過去ログ倉庫に格納されています