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

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

■ このスレッドは過去ログ倉庫に格納されています
0001デフォルトの名無しさん2013/10/20(日) 19:30:39.35
プログラミング言語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() を使え。※

前スレッド
★★Java質問・相談スレッド164★★
http://toro.2ch.net/test/read.cgi/tech/1378219684/
0628デフォルトの名無しさん2013/11/12(火) 21:36:03.83
>>627
内部クラスの事を言っているのであれば外側のオブジェクトへの参照がいらないとき。
外側のオブジェクトへの参照が不要なときは可能な限りstaticにすべき。
0629デフォルトの名無しさん2013/11/12(火) 21:51:18.21
つまりクラス定義に付けるstaticは内部クラス用ってことか
0630デフォルトの名無しさん2013/11/12(火) 22:22:40.16
言語仕様の用語的にはstaticが付かない外側のクラスへの参照を持ってる奴だけを内部クラスと呼ぶ
のでstaticが付いたら内部クラスとは呼ばない。
0631デフォルトの名無しさん2013/11/12(火) 22:27:38.44
class Foo {} // 普通のクラス
static class Bar {} //???

class Hoge {
  class Unko {} //内部クラス
  static class Chinko {} //???
}
0632デフォルトの名無しさん2013/11/12(火) 22:48:55.42
>>627
別クラスにstaticメンバ見せたいけど
どうしてもメンバをprivateにしておきたい場合にstatic classを使う。

あるいはMap.Entryみたいに、成り行きでなんとなく使う
0633デフォルトの名無しさん2013/11/13(水) 00:21:21.14
swingを勉強しています。JFrameを作ってマウスクリックしたら*.pngファイルを読み込み
JLabelに貼り付けて表示するプログラムを作りました。ですが*.pngファイルが表示されないのです。
何が原因でしょうか?pngファイルをJFrameのコンストラクタで読み込んでJLabelに貼り付けると
うまく行きます。またmouseClicked()にブレークポイントを設定すると、そこで停止します。
アドバイスよろしくお願いします。
public class sample01_38a
{
public static void main(String[] args)
{
my_frame frame = new my_frame() ;
frame.setBounds(0,0,500,500);
frame.setVisible(true);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
<略>
public class my_frame extends JFrame implements WindowListener,MouseListener
{
public void mouseClicked(MouseEvent e)
{
icon = new ImageIcon( "images/anomalocaris.png" ) ;
label = new JLabel("test label",icon,SwingConstants.CENTER);
getContentPane().add(label) ;
<略>
0634デフォルトの名無しさん2013/11/13(水) 00:24:22.24
その質問何回目
0635デフォルトの名無しさん2013/11/13(水) 09:57:32.52
すいません、自己解決しました。
0636デフォルトの名無しさん2013/11/13(水) 11:14:17.67
static finalとか良く分からん。
外に見せたい定数とかに定義してんだけど。
0637デフォルトの名無しさん2013/11/13(水) 12:07:42.92
>>636
複数のインスタンスで別個に持つ必要がない定数に使う
0638デフォルトの名無しさん2013/11/13(水) 14:11:01.81
>>637
なるほど、分かり易い。

あるクラスをインスタンス化したら、中のインスタンスが見えてしまうんだが、プライベートとかつけても消えてくれない。。。
0639デフォルトの名無しさん2013/11/13(水) 14:48:13.11
>>638
インスタンス化される側のクラスの中でメンバー変数をprivate宣言する必要がある。
0640デフォルトの名無しさん2013/11/13(水) 14:58:59.23
>>639
かったぱしからprivateつけてみてはいるんだけどなぁ。
勉強します。
0641デフォルトの名無しさん2013/11/13(水) 16:22:25.80
同じクラスの中からだと見えちゃうよ > private
0642デフォルトの名無しさん2013/11/13(水) 16:29:44.93
どういうことやってるのか
ソースコード見ないと何とも言えんなあ
0643デフォルトの名無しさん2013/11/13(水) 16:34:32.11
実はデバッガで見てるのでは
0644デフォルトの名無しさん2013/11/13(水) 16:58:07.27
インスタンスをどこから隠したいのかが不明瞭
他のパッケージから隠したいのか
同一パッケージの他クラスから隠したいのか
同一ファイル内の他クラスから隠したいのか
0645デフォルトの名無しさん2013/11/13(水) 17:11:36.94
ウェブページと対話するようなプログラムをかきたいんですけど
ログイン状態を維持したままウェブページにアクセスするのってどうやるんでしょうか?

HTTPURLConnection から InputStream を開いてページソースを取得するのはできるんですが
クッキーとかセッションの扱いがいまいちわかってない程度の知識です
0646デフォルトの名無しさん2013/11/13(水) 17:17:48.09
プログラミングよりも先にネットワークの仕組みを勉強すればいいんじゃね?
0647デフォルトの名無しさん2013/11/13(水) 17:19:08.56
だなw
0648デフォルトの名無しさん2013/11/13(水) 17:24:45.91
サーバーサイドJavaの本を買えばのってるぞ
0649デフォルトの名無しさん2013/11/13(水) 17:25:12.80
ネットワークの仕組みなんて要らないよ
クッキーについてだけ勉強すればおk
0650デフォルトの名無しさん2013/11/13(水) 17:25:27.92
そういわずにせめてどのクラス使えばいいとかヒントになるページとか教えてください!
0651デフォルトの名無しさん2013/11/13(水) 17:26:17.94
ウェブの仕組みについて勉強すれば
ここで訊かずともどのクラス使えばいいのかおのずと見えてくる
0652デフォルトの名無しさん2013/11/13(水) 17:26:55.79
バカにはムリムリww
0653デフォルトの名無しさん2013/11/13(水) 17:27:34.73
java cookieでググレばおk
0654デフォルトの名無しさん2013/11/13(水) 17:27:35.24
「Java セッション」でググればいくらでも出てくるレベルの質問とか、釣り質問か

Javaの道:Servlet(6.セッション管理)
http://www.javaroad.jp/servletjsp/sj_servlet6.htm

Java Solution FAQ:セッションの開始・継続・終了
http://www.atmarkit.co.jp/fjava/javafaq/session/session04.html

セッションを使ったデータの書き込みと読み込み - セッション管理 - サーブレット入門
http://www.javadrive.jp/servlet/session/index2.html
0655デフォルトの名無しさん2013/11/13(水) 17:29:15.42
わざと古すぎる記事を紹介とか
0656デフォルトの名無しさん2013/11/13(水) 17:33:17.10
>>654
そーうーのはブログでやって
0657デフォルトの名無しさん2013/11/13(水) 17:40:33.60
>>654
軽くよんでみたんですけどこれってサーバー側で動的ページを表示させる方法にみえるんですけど
クライアント側でもHttpServletっていうクラスを使えばできるんですか?

まだServretの中身よんでないんですけど
方針がまちがってなければちゃんと調べてみます
0658デフォルトの名無しさん2013/11/13(水) 17:42:50.89
Java技術最前線 - 「Java SE 6完全攻略」第42回 Cookieを扱う その3:ITpro
http://itpro.nikkeibp.co.jp/article/COLUMN/20070831/280847/

Lesson: Working With Cookies (The Java? Tutorials > Custom Networking)
http://docs.oracle.com/javase/tutorial/networking/cookies/
0659デフォルトの名無しさん2013/11/13(水) 17:50:42.67
ゆとりは手取り足取り教えてもらわないと何もしないのな
0660デフォルトの名無しさん2013/11/13(水) 17:51:54.22
ゆとり乙w
0661デフォルトの名無しさん2013/11/13(水) 17:54:56.68
自己解決しました
0662デフォルトの名無しさん2013/11/13(水) 17:59:36.13
うぅ;; ゆとりですいません…
というかそもそも読むだけしかできなくて
パスとIDをポストして結果をクッキーにためる処理もできないことに気づきました;;

Cookie = new Cookie();
url.post("id=...&pass=..., cookie); とかすれば勝手にクッキーに情報がたまって
url.openStream(cookie); みたいに引数でわたしたら勝手にクライアント認識してくれるようなクラスがあると思ってました;;

もうちょっと勉強しないと自分には無理っぽいです><
どうもおさわがせしました…
0663デフォルトの名無しさん2013/11/13(水) 18:01:23.29
涙目wwwゆとり乙wwww
0664デフォルトの名無しさん2013/11/13(水) 18:02:51.54
相変わらず役にたたねえスレだなw
0665デフォルトの名無しさん2013/11/13(水) 18:03:52.58
バカにはムリw
0666デフォルトの名無しさん2013/11/13(水) 18:05:54.88
Javaでのクライアント側のクッキー管理なんてデフォルトのクッキーマネージャを使ってりゃ十分だろJK
0667デフォルトの名無しさん2013/11/13(水) 18:11:32.08
CookieManager manager = (CookieManager)CookieHandler.getDefault(); //でデフォルトのクッキーマネージャ取り出して
CookieStore store = getCookieStore(); //クッキーのデフォルト保存先(メモリ)へのアクセス取り出して

CookieStoreのadd get removeを使ってファイルに書き出すなりファイルから読み込むなりして管理すれば十分だろJK
0668デフォルトの名無しさん2013/11/13(水) 18:18:47.63
相変わらず役にたたねえレスだなw
0669デフォルトの名無しさん2013/11/13(水) 18:22:11.12
自己解決しました
0670デフォルトの名無しさん2013/11/13(水) 18:27:50.31
質問です。
まず、Javaのクラスは常にヒープを使用するというのが気になったので、
配列などにあらかじめインスタンスをたくさんnewして格納しておき、必要なときにその配列から
未使用のインスタンスを検索して取り出して、不要になったら配列に返す、という方法で
擬似的にスタックを再現しようと思いました。

叩き台としては、十分なreserve数を用意したArrayListにインスタンスをnewして詰め込んだあと、
インスタンスを使用するときにpop、返却するときにpush、という方法で作りました。
しかしながら、テストをしてみるとインスタンス化するクラスがよほど大きなクラスでない限りは
newしたまま放置するのとほとんど差がありませんでした(むしろ遅いときの方が多かった)

ここで質問なのですが、実際のところ、このような方法で素のnewやGCの機能を使うよりも
高速化を図ることはできるのでしょうか?
0671デフォルトの名無しさん2013/11/13(水) 18:29:10.80
疑似スタックに何の意味が
0672デフォルトの名無しさん2013/11/13(水) 18:30:11.23
疑似スタックがヒープ上に作られるので何の効果もありませんでした
0673デフォルトの名無しさん2013/11/13(水) 18:30:24.54
それスタック関係なくてインスタンス化の時間を省きたいだけだろ
0674デフォルトの名無しさん2013/11/13(水) 18:30:48.99
>高速化を図る

Javaを使うことを諦める
0675デフォルトの名無しさん2013/11/13(水) 18:34:30.15
>>674
でも宿題だから仕方ない
0676デフォルトの名無しさん2013/11/13(水) 18:38:40.65
>>675

★★ Java の宿題ここで答えます Part 72 ★★
http://toro.2ch.net/test/read.cgi/tech/1337692704/
0677デフォルトの名無しさん2013/11/13(水) 18:42:55.68
全体的にコードがぐちゃぐちゃで遅いだけじゃね
特にコンストラクタが
0678デフォルトの名無しさん2013/11/13(水) 18:43:00.11
「よほど大きなクラスでない限り」素でGCが発生しないからpushで戻す時間遅くなってるんじゃ?
GCが発生しそうなプログラムなら速くなると思いますけどね
new って実際メモリ確保する時間はほぼ一瞬なのでインスタンス化の時間は変わらないと思います
0679デフォルトの名無しさん2013/11/13(水) 18:48:28.61
>>670
http://www.ibm.com/developerworks/jp/java/library/j-jtp01274/#3.1
0680デフォルトの名無しさん2013/11/13(水) 19:09:17.52
>>383
荒らすな雑魚
0681デフォルトの名無しさん2013/11/13(水) 19:26:36.75
>>671-679
みなさんありがとうございます。

>>679
とても参考になりました。今回とは関係ないけれど不変オブジェクトについても
大変興味深かったです。Scalaやりたくなってきた・・・
0682デフォルトの名無しさん2013/11/13(水) 19:38:20.94
不変オブジェクトについては少し古いかもな
誰がなんと言おうとプリミティブラッパーは普通の数値として計算に使おうとするとゴミだし
0683デフォルトの名無しさん2013/11/13(水) 20:21:34.86
>>679
こういった「その時代時代のパラダイム」に依拠したネイティブ・ハッキングは、たとえお金を積まれたとしてもあまりやりたくないね
0684デフォルトの名無しさん2013/11/13(水) 20:22:16.37
最近のGC実装は、
使い道の無いかもしれないオブジェクトを後生大事にプールしておくより、
短寿命のオブジェクトをポコポコ作る方が効率よい。
0685デフォルトの名無しさん2013/11/13(水) 21:15:26.67
ゴッツさんってラムダの人でしょ。
関数型言語の名手で関数戻り値マンセーだから不変オブジェクトにこだわりがあるのもよくよく分かる。
ただ、オブジェクト指向言語を使ってライブラリを設計するというのは、不変オブジェクトやシングルトンだけでなく、関数型由来の方法以外の、他の方法論もたくさんある、ということは一言いっておきたい。
0686デフォルトの名無しさん2013/11/13(水) 21:19:47.40
>>682
そういうのは気にしなくていいと記事には書いてある
0687デフォルトの名無しさん2013/11/13(水) 21:35:50.65
>>645
Apache CommonsのHttpClientを使え。

標準クラスライブラリの範囲内でもCookie処理は実現できるが、
Java 6ではexpiresの解釈にバグが混入していたり(7以降は解決済み)、
http://www.javainthebox.com/2007/09/blog-post_4729.html
Set-Cookieの適用順が変わっているからエラーが起きたり、
http://tomott.cocolog-nifty.com/blog/2010/09/javecookie5-5d9.html
ライブラリとしての完成度や信頼性は高くない。
0688デフォルトの名無しさん2013/11/13(水) 21:53:59.14
>>687
レスありがとうございます
これすごいですね

ぱっとみた感じ HTTP のプロトコルわからなくても
フォームにかかれてるの name と value の Map を渡すだけで
POST リクエスト作ってくれるみたいですね

あれからもずっと調べてたりプログラムかいたり試行錯誤してたんですが
そもそもログインフォームのソースみながら
POST してクッキーを受け取る部分すらできなくて困ってました…

さっそく使ってみようと思います
0689デフォルトの名無しさん2013/11/13(水) 22:04:33.07
もはやJavaが怖い
0690デフォルトの名無しさん2013/11/13(水) 22:20:27.17
>>689
kwsk
0691デフォルトの名無しさん2013/11/13(水) 22:26:41.08
めでたしめでたし、「ここはどこわたしはだれ」になるであろうに10ペリカ。
0692デフォルトの名無しさん2013/11/13(水) 22:38:05.92
>>686
プリミティブ型は後方互換のために存在するって言い切って良いレベルだとでも?
0693デフォルトの名無しさん2013/11/13(水) 22:44:53.71
ジャバのプリミチブ型の本質は、JVMのネイチブ型とのマッピングなんで、記事にあるNEW演算子のことだけでなく、その点でも気にしなくていいです。
0694デフォルトの名無しさん2013/11/13(水) 22:51:11.46
そんなハイレベルな宿題とかいったいどんな学校なんだ
0695デフォルトの名無しさん2013/11/13(水) 22:56:57.70
>>694
ていうか2ch用のネタの投下だってことに気づけw
0696デフォルトの名無しさん2013/11/13(水) 22:59:37.13
バカにはムリw
0697デフォルトの名無しさん2013/11/14(木) 00:14:14.09
>>687
ようやくポストするとこまでいけたけど HTTP コード 302 が帰ってきてボディがからっぽになる;;
302 って軽く調べたらリダイレクトらしいんですけどリダイレクト先の URL がどこにもない;;
0698デフォルトの名無しさん2013/11/14(木) 00:26:00.04
>>697
本当にリダイレクト先のURLが書いていないのなら、それはサーバーが意図的にそういう設定にしてるってことだからどうにもできない。
POSTしたデータがおかしいからサーバーがエラー吐いてる可能性もある。
0699デフォルトの名無しさん2013/11/14(木) 00:42:00.13
>>697
HTTPヘッダのLocation見ろ。
そして、HTTP勉強してから出直せ。
とりあえずcurlとか使って、手動でできるレベルになれ。
0700デフォルトの名無しさん2013/11/14(木) 00:54:08.77
ああそっちの初歩的な見落としか

>>697
リダイレクト対応する場合は以下のコード追加しろ
http://d.hatena.ne.jp/lettas0726/20120806/1344264352
0701デフォルトの名無しさん2013/11/14(木) 02:11:47.94
こんなことしたい時、皆さんどうしてますか?
MyInterfaceを実装するMyClassを総称型引数に持つList<MyClass>のインスタンスを、myMethod(List<MyInterface> myInterfaceList)に渡したい
0702デフォルトの名無しさん2013/11/14(木) 02:13:27.38
ちなみに出来ないのは分かってますが、なんで出来ないようになってるかも疑問なんです
0703デフォルトの名無しさん2013/11/14(木) 02:17:10.34
頑張ればできる
0704デフォルトの名無しさん2013/11/14(木) 02:23:48.84
extendsキーワード使えばいいんじゃないの?

myMethod(List<? extends MyInterface> myInterfaceList)

こんな感じ?
0705デフォルトの名無しさん2013/11/14(木) 02:25:57.18
Java総称型メモ(Hishidama's Java Generics Memo)
http://www.ne.jp/asahi/hishidama/home/tech/java/generics.html
0706デフォルトの名無しさん2013/11/14(木) 02:54:54.39
出来なくなかった!
ありがとうございます
職場で試します
0707デフォルトの名無しさん2013/11/14(木) 03:08:07.63
http://ideone.com/gXkKQz

こうか?
0708デフォルトの名無しさん2013/11/14(木) 03:41:47.94
>>698-700
レスありがとうございました

>>700 さんの方法がうまくいけば簡単そうなので試そうとしたんですが
パッケージ内のクラスに DefaultRedirectStrategy ってクラスがないみたいで
HttpClient に setRedirectStrategy ってメンバーメソッドもないみたいだし
4.3.1 をおとしたんですけどこの記事とバージョンが違ったのかな…

@Override っていう書き方はじめてみたんですけど
匿名クラスを自分で定義する感じなんでしょうか…

>>698,699
Location って HTTP ヘッダよむ方法がようやくわかってなんとかリダイレクト先のURL取得できたので
明日また手動でリダイレクト先を取得しにいこうと思います
いろいろアドバイスありがとうございました
0709デフォルトの名無しさん2013/11/14(木) 07:37:19.12
>>708
あとの細かい試行錯誤はブログでやって
0710デフォルトの名無しさん2013/11/14(木) 08:17:21.87
ジェネリクスで、なんでint型はintegerを指定しなきゃいけないんだよ。
Stringはそのまま使えるのに。
統一しろや。
0711デフォルトの名無しさん2013/11/14(木) 08:22:53.63
>>708
httpclient-4.3.1.jar
httpcore-4.3.jar
が適切にクラスパスに追加されてれば以下のコードが動くはず
http://ideone.com/Ukqu1n
俺の環境で実行に成功したコードをそのままコピーしてきたから、
これがエラーで動かない場合はクラスパスの設定がおかしいってこと
0712デフォルトの名無しさん2013/11/14(木) 08:35:34.79
>>710
プリミティブ型もクラスとして扱う考え方は後付けで色々ほころびがあるのはやむを得ない。
文句を言わず我慢しろ。
0713デフォルトの名無しさん2013/11/14(木) 08:44:24.69
List<int> と書いたら自動的に List<java.lang.Integer> のことだと解釈してくれれば便利なのに
0714デフォルトの名無しさん2013/11/14(木) 08:46:56.68
Stringはプリミティブ型じゃねーだろ
0715デフォルトの名無しさん2013/11/14(木) 09:11:14.85
>>711
LaxRedirectStrategy使うんじゃダメなん?
0716デフォルトの名無しさん2013/11/14(木) 09:13:03.52
いうなればお前の顔が不自由なのは仕方なくそれなりに生きていけ、ということであり。
優性交配した次世代はもっとイケメンだから。
0717デフォルトの名無しさん2013/11/14(木) 09:17:04.20
なんだこの場所的にも生物学用語の用法的にも頓珍漢な誤爆は。
0718デフォルトの名無しさん2013/11/14(木) 09:23:22.58
>>716
日本語でおけ
0719デフォルトの名無しさん2013/11/14(木) 18:04:31.47
ようやくやりたいことができました
昨日からいろいろレスくれたみなさんありがとうございました

とくに HttpClient と Location を教えてくれた >>687,699 さん本当に助かりました!
HTTP や クッキーの実装意識しなくてもソーステキストレベルでウェブトラバースするだけで
クッキーの処理1文字もかかずにすんだんですけど
最初 HTTP とクッキー勉強しないと無理っていわれてすごい困ってました

普段UIや画像処理系のプログラムしかかかないので
ネットワークプログラミングがこんなに大変とは…
手動なら30秒とかでできることをプロgyラムにさせるのに丸一日かかっちゃいました;;
ブラウザってすごいことやってたんですね…

>>711 さんわざわざ動作確認までしていただいたのにすいません
たぶん httpclient だけ落としてて core の方をおとしてなかったせいだと思います
ただ POST した時点でログイン処理は成立してて
リダイレクト無視していきたいページ GET するだけで
普通にログイン状態維持できてたので自分的にはこれでOKでした
0720デフォルトの名無しさん2013/11/14(木) 18:08:28.90
ゆとり乙
0721デフォルトの名無しさん2013/11/14(木) 18:19:04.74
つぎはいつかな?
0722デフォルトの名無しさん2013/11/14(木) 18:29:50.33
期限切れの時にまた来そうだ。
標準のCookieManagerの実装の問題って直ってるのかな。
0723デフォルトの名無しさん2013/11/14(木) 19:22:56.54
>>704
>>705
>>707
ちゃんと出来ました
ありがとうございました
0724デフォルトの名無しさん2013/11/14(木) 19:27:52.98
久しぶりにbsh触ってみたけど、全然変わってないな。
あれ使えたら、ちょっとしたコード試すとき便利なのに。
0725デフォルトの名無しさん2013/11/14(木) 19:39:18.71
>>722
java7では直ってないので俺は1から作りなおしたけどな。
0726デフォルトの名無しさん2013/11/14(木) 20:56:19.92
Cookie日付をパースできるAPIがJava8からまた復活するんだっけ。
DeprecatedなDateコンストラクタでもいいんだけどさ。
0727デフォルトの名無しさん2013/11/14(木) 21:45:24.63
あれれ;; さっそく動かしてみたらしばらくすると
java.lang.IllegalStateException: Invalid use of BasicClientConnManager: connection still allocated.
Make sure to release the connection before allocating another one.
at org.apache.http.util.Asserts.check(Asserts.java:34)
ってエラーが出始めて1回でるとずっと GET に失敗する…

やってることは
HttpClient client = new DefaultHttpClient();
for(;;) {
if(!login) {
HttpPost post = new HttpPost(ログインページ);
params.add(...) // ID PASS セット
HttpResponse response = client.execute(post);
post.abort();
login = true;
}

HttpGet get = new HttpGet(みたいページ);
HttpResponse response = client.execute(get); // ここでエラー
if(response.getStatusLine().getStatusCode() == 403) {
login = false; continue;
}
BufferedReader br = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
以下読み込み
get.abort();
}

っていう感じなんですけどループの中の GET execute でエラーがでる;;
なんかもう Java とは関係ないセッションのステートの話だと思うんですけど
もし詳しい人いたら原因わかりませんか?

アサートの中でエラーがでてるのでネットワークの状況というよりローカルでの使い方の問題な気もするんですが…
■ このスレッドは過去ログ倉庫に格納されています