【初心者】Java質問・相談スレ20【大歓迎】

このエントリーをはてなブックマークに追加
>>947
try {
   URL url = new URL("http://www.google.com/");
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   try{
      conn.setRequestMethod("GET");
   }
   finally{
      conn.disconnect();
   }
} catch(IOException e) {
}
とでもするのがいいんじゃなかろうか。
>>952
これってfinally節を必ず実行するの?おれはこう書いてた。
HttpURLConnection conn = null;
try {
   URL url = new URL("http://www.google.com/");
   conn = (HttpURLConnection)url.openConnection();
   conn.setRequestMethod("GET");
} catch(IOException e) {
   ...;
} finally{
   if(conn != null){
      try{
         conn.disconnect();
      } catch(IOException e){}
   }
}
954952:03/03/26 09:47
>>953
openConnectionがちゃんと実行されるなら、必ずdisconnectしてよいのではなかろうか。
接続されなくて例外が発生すればそのままそとのcatchに逝く
>>953の書き方だとむだな条件判断と、connのスコープがむだに広いのでなんか嫌な感じ。

ただ、そもそもここまで気を使って書くこともすくない。
>>949
だからねーつってんだろうが。char なんて色んな言語にあるわい。
Java に限った話じゃないっつの。
>>954
httpに限らず953みたいな書き方は普通だと思うな。
ファイルストリーム周りとか。過去スレでちょっと
もめた?気もするけど最終的には異論はなかったはず。
finally節中、何もしないcatchのコメントの書き方
とか違う方面で話は進んだ気がする。

957952:03/03/26 11:12
>>956
とりあえず、すっきり書けるのにまわりくどい書き方するのがなんだか。
>>955
( ´_ゝ`)フーン

で、charってなんて読む?
大変です。これが分からないとカスピ海が埋まってしまいます。
カスピ海のためにも是非教えてください。

今、そのアプリ自身がどのディレクトリにいるかを知るのってどうするんでしょう?
>>959
勝手にうまっとけ。
それか、「アプリ」が「ディレクトリにいる」ということの定義しる。
>>957
コードの見通しが悪いだろう?
スッキリ書くのと短かく書くのは違うぜ。
>>959
言いたいことは何となく分かるが不可能だ。
963957:03/03/26 11:28
>>961
>>953のほうが見通しが悪いと、*漏れは* 思うのだが。
964960:03/03/26 11:32
>>962
クラスのパスなら
Class c = this.getClass();
String className = c.getName().replace('.','/') + ".class";
String s = c.getClassLoader().getResource(className).toString();
みたいな感じでとれるけどね。
965959:03/03/26 11:43
>>960,962,964皆様ありがとうございます。カスピ海は諦めることにしました。
966デフォルトの名無しさん:03/03/26 11:53
では、>>952が好みか>>953が好みか多数決で決めよう。
>>966に一票。
>>966
      ノノノノ         
     ( ゚∋゚)  やらないか
    /⌒\ /⌒\_______  
  | ̄ヽ二ミ ∩ _   |  
  |_________\_| | ___丿____|
 /_____________\彡ノ_________\
   ‖     \ヽ    ‖  
           ヽミ
>>959
確実な手段じゃないけど、
環境変数を得て、PATH とか CLASSPATH に書かれてる場所を片っ端から検査するとか。
970964:03/03/26 12:38
>>969
それなら>>964のようにリソース使えばいい。
>>760 delegate代わりなら内部クラスもあるやろ
>>886 ブッ! ワロタ!
>>971
煽りも回答もスピードが命。
>>972
そろそろ暖かくなってきましたし。
>>980が次スレたてますし。
このスレ全然初心者大歓迎じゃないじゃん
>>974
初心者とそれ未満のバカは明確に区別、差別される。
>>974
結構初心者にはまともに相手してると思うけど。
自分でなにもしないやつは放置だけど。
>>952-953
懐かしいネタだな。書き方の好みの問題ではなく >>953 の方がより好ましいと説明した
のは 1 年くらい前だったか。あの時はファイルの open/close の話だったかな。

リソースの開放に関しては >>952 でも >>953 でも滞りなく行われるだろう。ここで問題
なのは try-catch ブロック内で例外が発生し、その影響で finally 内のリソース開放
処理も例外になった場合だ (多重障害)。>>952 のように記述した場合、外側 catch で
捕らえられるのは「クローズに失敗した」という副作用的な情報だけである。つまり、
障害の根本原因の情報が副作用的な情報によって上書きされてしまうという弊害が出る
可能性がある。

try{
  SomeResource resource = getSomeResource();
  try{
    // このブロックのどこかで例外が発生
  } finally {
    resource.close();   // その影響でこの処理も例外
  }
} catch(SomeException ex){
  // ここで捕らえられる例外は close に失敗したという情報であり、try ブロック
  // 内で発生した例外ではない
}

ここでの話の焦点はかなりのレアケースである。だからこそ、書き方の好み云々ではなく
本番運用中の一発勝負で障害解析ができるだけの配慮がなされているかが重要と思われる。
でも >>953 でも finally 内の catch ブロックで printStackTrace() くらいやっとい
てもよかったかもな。

また 1 年後くらいに同じネタが振られそうな悪寒。
Java 初心者が質問に答えるスレですが何か?
979952:03/03/26 16:22
>>977
>多重障害
同意

try{
 throw new Exception("ぬるぽ");
}
finally{
 try{
  throw new SomeException("ガーン");
 }
 catch(SomeException e){
 }
}

というとき、"ぬるぽ"はどうなりますか?あぼーんですか?
>>958

char
>>979
なんでそんなコードが出てくるんだ… try-catch-finally の挙動分かってる?
982958:03/03/26 16:45
>>980
Σ(゚д゚lll)ハンカクカナでおながいします
983979:03/03/26 16:47
>>981
>>977で言えばresource.close()での例外をfinallyの中で捕まえたらどうなるの?ってことなんですが。
>>958
マ板にその手のスレがあったから読んでみい
http://pc.2ch.net/test/read.cgi/prog/1027164278/
>>984
char=ぬるぽ
ってことで決着でつね?
>>979
ぬるぽが try-catch-finally の外に飛び出る。てか、やって見れ。
>>986
ほんとだ。
じゃ
try {
   URL url = new URL("http://www.google.com/");
   HttpURLConnection conn = (HttpURLConnection)url.openConnection();
   try{
      conn.setRequestMethod("GET");
   }
   finally{
      try{
         conn.disconnect();
      }
      catch(IOException e){
      }
   }
} catch(IOException e) {
}

のほうが>>953より好み。うほっ。
>>987
俺はインデントが深くなるのが気になるので >>953 みたいな書き方をするが、
指摘した件は >>987 でも満たしているので後は好みの問題だな。
>>988
どっちも最深3段だし、あまりインデント的には変わらなくない?
まぁ、好みの問題なのかな。
setRequestMethodで発生した例外とdisconnectで発生した例外の処理される順番というのもあるだろうけど。
それもまぁポリシーの問題か。
>>989
いや、>>987 でいう内側の try-catch ブロック内に長々と実処理を書くことに
なるから、その部分のインデントが深くなるのが気になるだけ。
991989:03/03/26 18:34
>>990
そういえばそうだ。
>>980
次スレよろ。
(>>973)
993デフォルトの名無しさん:03/03/26 21:21
>>954
そもそも気を使って書く癖をつけなさい。

>openConnectionがちゃんと実行されるなら、必ずdisconnectしてよいのではなかろうか。
openConnectionがちゃんと実行される保証はどこにもない。
「connがnullでない場合=ちゃんと実行されている」だから
if(conn != null)と聞くのは正しい。っていうか定石。
オープン出来なかったコネクションを終了時にクローズしようとする方が
激しく気持ち悪い。JDBCで同じことやってみろ。悲しい結末になる。
要は、気を使えってことだ。

>>953からスコープがどのくらいなのか、厳密にはわからないだろう。
ここで生成したコネクションを今後どう使うかわからんだろ?安全な範囲で
広いスコープにしておくのは常識。
無駄に広いなんて言えない。むしろ、良い例なのだ。
>>988-989
インデントにはスペース二個が最適
よって気にならず

誰か次スレよろ。
漏れスレ立てられない。
次スレ立てる人へ、
次スレ立てるときはテンプレートが全てレスされるまで常にsageでテンプレートをレスしてください。
>>993
openConnectionが実行されないということは例外が発生してるはずだろ。
だから、disconnectの時点では必ずopenConnetionしてる。
>>995
スレを立てると一番上に上がるのですが?
>>997
荒らし対策どうにかならんかとおもて
9991000:03/03/26 21:59
1000GET!!!
静かだねぇ
10011001
このスレッドは1000を超えました。
もう書けないので、新しいスレッドを立ててくださいです。。。