Verna_Velna 2012-08-24 09:40:55

[Java] SuccesException このエントリーをはてなブックマークに追加

投稿者からのアピールポイント

戻値は必ず投げて返すこと。

かつてこんな規約が推奨されてた時期なかったですかね… Javaって面倒なんだなぁって思った記憶だけが心の隅に残っててるんですが web上にもそんな痕跡は何処にも無いからただの記憶違いかなぁ・・・ ここではまとめてますけど、細かく処理ごとに例外を分けて投げるようになってた気もします。

public class Action{
	public static void process(int arg) throws OrgnalException
	{
		OrgnalException e = new OrgnalException();
		e.hasError = false;
		
		if(arg < 0)
		{
			e.hasError = true;
			e.muinusError = true;
		}
		
		//・・・略
		
		throw e;
	} 	
	
	public static void main(String[] args) {
		
		
		try {
			process(Integer.parseInt(args[0]));
		} catch (NumberFormatException e) {
			e.printStackTrace();
		} catch (OrgnalException e) {
			if(!e.hasError)
			{				
				//略
			}
			else if(e.muinusError)
			{				
				//略
			}			
			//略
		}
	}
}

使い方ヒント: 「これは臭う」という行を見付けたら、各行のsmellをクリックしてマーキングしておきましょう(要Twitter OAuth認証)

コメント(15)

#1 math_neko 2012-08-24 09:42:48  

この発想はなかったし、あってはいけなかった

#2 m_shige1979 2012-08-24 11:12:03  

えーと、処理の最後に例外を投げて…??? Javaはあんまし詳しくないけど変なのはわかった

#3 InternalServerE 2012-08-24 23:04:14  

あまり意識されないが、Javaで例外を作るってのは非常に処理負荷が高い。
記録にないほど昔ってことは、VMの起動が重すぎてappletが全然流行らず、PCのスペックも低くて開発もままならなかった、あの時代でしょう。例外を量産するなんざ、それこそ論外だったんじゃないかな。

#4 kaminaly 2012-08-25 09:19:44  

エラードリブンプログラミングw

#5 Ukai_H 2012-08-27 04:40:46  

オーバーライドしたメソッドによって、メソッドの戻り値を変更できない(たとえ安全でも)というJavaの言語仕様がある。たとえば、戻り値がMapのメソッドを、引数と名前が同じ戻り値HashMapのメソッドでオーバーライドすることができない。これって変じゃね?という議論が昔はあった。JSRの番号は覚えてないけど。

ところで、送出例外の宣言においては、上位のメソッドがIOExceptionを送出するようになっていれば、下位のメソッドのthrows句にはFileNotFoundExceptionを宣言できる。そこで、上述の問題を解決するために戻り値の代わりに例外を使用するという半ば冗談のソリューションが提案されたことがあった。

たぶんそれのことじゃないかな。

Javaで例外オブジェクトを作るのが特段重いってのは、あんまり聞いたことがないな。C++のtry / catchは、実質setjmp, longjmpでスタックの保存・復旧を伴う分重いってのがかつて言われていたのを記憶しているけど。

#6 Verna_Velna 2012-08-27 04:45:44  

5 長年の謎が解けた気がします。その辺の話をまともに受けて先走って作った仕様だったのかも。

#8 InternalServerE 2012-08-27 14:21:39  

例外生成が重い件。古い記事だと、この辺
http://www.ibm.com/developerworks/jp/java/library/j-perf07303/

実践してみたよ、的な記事もいくつか発見
http://www.limy.org/program/java/performance_tuning1.html
http://blob.geishatokyo.com/archives/134019

最近は改善されてるかも知れないので、あくまでご参考まで。

#9 Ukai_H 2012-08-28 02:32:11  

言葉が足りませんでした。Javaで例外オブジェクトを作るのが<他の言語に比較して>特段重いってのは、あんまり聞いたことがないというのをいいたかったのでした。通常のオブジェクトに比較すれば、はるかに重いのはおっしゃるとおりです。

http://blob.geishatokyo.com/archives/134019

は参考になりますね。ありがとうございます。

#10 Ukai_H 2012-08-28 04:15:45  

ちなみに今はできますね。 戻り値のオーバーライド。(Java SE5以降) https://blogs.oracle.com/darcy/entry/covariant_interface_hierarchies

恥ずかしながら、今まで気がついてませんでした。

#11 InternalServerE 2012-08-28 14:25:04  

そもそもの話、多言語と比較して何か嬉しかったんだっけ。
他言語と比較すればまだ軽い方なんだから、例外を量産したって怒られないぜ、てことかいな。

#12 at_sn 2012-08-29 09:10:04  

Succes ?

#13 Ukai_H 2012-08-29 11:55:45  

"Javaだと例外生成が重い"というふうに他言語と比較して例外生成が重いと聞こえるようなことをだれかが言っていたからじゃないですかね。よく覚えてないけど。

#14 jagd5168 2012-11-21 04:09:49  

C やアセンブラで longjump よく使う人が作った規約な希ガスr

#15 migimatsu 2012-12-17 08:00:38  

そもそも Orgnal でフイタ

コメント投稿には、twitter認証が必要です。

Twitter認証

このウンコードに臭った人は、こちらのウンコードにも臭ってます

[Java] 内部的にunicodeだから日本語つかえ...

このエントリーをはてなブックマークに追加

これを書いた先輩に「英語で書きましょうよ...

class 会員 {
    private int 会員番号;
    p...

鑑賞する »

[その他] HOW TO ABC..

このエントリーをはてなブックマークに追加

実際にあった某システムの超重要なマスター...

create table item_master (
 A varchar(2...

鑑賞する »

[Java] リソースの閉じ忘れ

このエントリーをはてなブックマークに追加

Javaの悪いところではあるのだが、Ja...

public String Read_CSV_File (String File...

鑑賞する »