文法通りのハズが
リハビリのために教科書の簡易チャットソフトを組んでみる。
NetBeansはctrl+spaseでコードをガンガン補完してくれるので書いていて楽しい。どこがどう楽しいのかは他の人が散々書いているだろうから省略。
しかし、以下の文を書いたら補完機能が急激に低下した。
try{ buff = in.readLine(); if(buff!!=null) taMain.append(buff+"\n"); else break; }catch(Exception e){ e.printStackTrace(); server = null; break; }
オマケにtryの行などに
'try'への'catch'または'finaly'がありません。
catchの行に
構文解析中に文の終わりに移りました。
';'がありません。
';'がありません。
'break'が'switch'文またはループの外にあります。
などといったワケの分からないエラー文が表示される。
この上流にある関数呼び出しも、下流にちゃんと定義文があるのに未定義関数扱いされてしまい、バグの原因がどこにあるかなかなか分からないのはいつもの事。必死で探すのをあきらめて、とりあえずif文に{ }が付いてないのが気持ち悪いので付け足す。プログラム上は意味が無い処置だが、俺の可読性が上がるのだ!
・・・しかしその時、if文の条件節の演算子に「!」が余計だということに気付いたので、結果として意味のある処置だったことになる(笑)。
というかこの教科書、空白を入れないで書いてるからそのまま打ち込むとミスしても発見しにくいんだよ!
- 作者: 幸村剛樹
- 出版社/メーカー: 秀和システム
- 発売日: 2003/12/11
- メディア: 単行本
- 購入: 1人 クリック: 1回
- この商品を含むブログ (2件) を見る
')'がありません。
式の開始が不正です。
':'がありません。
互換性の無い型
elseの行にあった
'else'への'if'がありません。
'break'が'switch'文またはループの外にあります。
という奇天烈なエラーが消えたが、先に挙げたエラーは消えないまま。
try{ ←ココと buff = in.readLine(); if(buff != null){ taMain.append(buff+"\n"); }else{ break; } }catch(Exception e){ ←ココと e.printStackTrace(); server = null; break; ←ココにNetBeansがエラー出すノヨ }
文法はあってるだろうがっ!なんでエラーが残ってるんじゃーーーぃ!
仕方が無いので、if文の整形を完璧にしようと思って、
if(buff != null){ taMain.append(buff+"\n"); }else{ break; }
とした瞬間にエラーが消えた・・・。
( ゚Д゚)ハァ?ドーユーコトデスカ?
実験してみると、 if文の整形を先に全て済ませてから「!」を削るとやはりtryなどにエラーが残る。そしてソース内のどこででも、ENTERキーを押して改行すれば消える。deleteキーで行を減らすなどの操作をしても効果は無い。
一方、if文に{ }が無いときは「!」を削るとその瞬間に全てのエラーが消える。
ただし、既にif文に{ }が付いているときに「!」を付け足して、そしてその「!」を削るとその瞬間にエラーは消える。
つまり、{ }無しif文の条件節にミス(「!」に限らない)があり、先に{ }をつけてからミスを修正した場合に限り、ソース内で改行しない限りtry文のエラー判定が更新されないのだ!(ここまで30分)
そんなルール知るかッ!!
俺の怒りは100テラバイトじゃぁぁぁぁぁ!!!
しかしソース解釈のアルゴリズムってどうなってるんだろう?まー、こういう特殊な場合は想定してなかったんだろうな・・・。