- ベストアンサー
C#の例外の重複・改
- DecoratorパターンやProxyパターンでの例外の重複について質問します。
- メソッドAとメソッドBで同じ例外のチェックを行う意味はあるのか検討しています。
- Javaの標準ライブラリでは問題視されている場合もありますが、C#では問題ないのか知りたいです。
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
関連するQ&A
- C# マルチスレッドにおける例外処理
下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }
- ベストアンサー
- C・C++・C#
- Javaの実装方法?Eclipse?ポリモルフィズム?
Javaの実装方法はどうなのかの質問です。 Eclipseで解析しているのですが、解析は「宣言を開く」(F3)で進みながら解析しています。 以下のソースだと、yobidasiクラスのMethodXからMethodAにF3で飛ぶとOyaClassのMethodAにきます。 その後、MethodA内でMethodBにF3で飛ぶとOyaClassのMethodBに飛びます。 でも、実際の動きは、OyaClassではなくkoClassのMethodBに行きます。 この実装方法ってどうなのでしょうか?こういうものなのですか? 解析ミスに繋がらないかなと思っているんですが。 また、EclipseでkoClassに飛ばす方法はあるんでしょうか? 助言をください。 class yobidasi{ methodX{ koClass cls = new koClass; cls = methodA } } public class koClass extends OyaClass{ protected methodB{ } } public class OyaClass { public methodA{ methodB() } protected methodB{ //空メソッド } }
- 締切済み
- Java
- c# 例外が重複する場合
こんにちは。c#初心者です。 今回は例外に関する質問です。 ----------------------------------------------------- list1, list2を「System.Collections.Generic.List<int>」とします。 int GetValue(int index1, int index2) { //*1 //とりあえず、何らかの計算を行う(この場合は掛け算) return list1[index2] * list2[index2]; } ----------------------------------------------------- 上記の場合、普通だったら引数の範囲のチェックが必要になると思うのですが、たまたまList<T>の既定の「0~Count - 1」の範囲とまったく同じだった場合、 一般化していえば、現在のメソッド(、プロパティ、インデクサ、コンストラクタ)の引数の前提条件と、その中で呼び出されるメソッド(、プロパティ、インデクサ、コンストラクタ)の前提条件が等しく、スローされる例外も等しい場合、*1に if ( index1 < 0 || index1 <= list1.Count ) …… if ( index2 < 0 …… は必要でしょうか? それとも呼び出される側に任せて例外のチェックを行わなくても良いのでしょうか? チェックなどは重複しないほうがよいとは思うのですが、まだ細かいところがわかりません。どなたか詳しい方がいらっしゃいましたらご意見を伺わせてください。
- ベストアンサー
- C・C++・C#
- C# 例外が発生しないことの保障
Javaと比較して書きます。 Javaで記述した場合: public class JavaClass { public static SampleClass s = new SampleClass(); } C#で記述した場合: public class CSharpClass { public static SampleClass s = new SampleClass(); } JavaでもC#でも、同じコードを記述しているように見えますが、Javaではnew SampleClass()コンストラクタで例外が発生しない事が分かっているのに対して、C#の場合では例外が発生しないとは言い切れません。 これは、Javaでは、例外をスローする可能性のあるメソッド宣言では、その全てについてthrows宣言をしなければいけないのに対して、C#にはこの制約が存在しないことが原因です。 これについて何が困るかといいますと、C#で、static宣言な変数や静的コンストラクタで安易にメソッド呼び出し等を行うと、キャッチできなくなってしまいます。 public class Exceptionner { public Exceptionner() { throw new ApplicationException("Exceptionnerクラスの例外"); } } public class SampleClass { public static Exceptionner e = new Exceptionner(); // ここで例外が発生するが、キャッチできない。 } public class MyEntryPoint { public static void Main() { try { SampleClass s = new SampleClass(); } catch (Exception e) { // System.ApplicationExceptionでなくSystem.TypeInitializationExceptionとなる。 // つまり、元の例外の情報は失われている Console.WriteLine(e.GetType()); } } } これを現在漠然と問題視していますが、何かよい解決策はありませんでしょうか。 望んでいる解決策: ・C#でもメソッドが例外を返さないという保障がソースレベルでメソッドやコンストラクタに宣言可能? ・C#では例外をちゃんとキャッチしなくてもスマートに記述することが可能? ・問題視する必要がない?(whyも含めて)
- ベストアンサー
- C・C++・C#
- Javaのプログラムについて教えて下さい
//Sample.java class Sample void methodA(int temp) if(temp == 0) String str = new String("Exception"); Integer.parseInt(str); else if(temp == 1) int[] array = new int[temp]; else Exception exc = new Exception(); throw exc; //SampleMain.java class ExceptionMain public static void main(string[] args) Sample sam = new Sample(); Int temp = Integer.parseInt(args[0]); Sam.method(temp); } } このプログラムの場合、ExceptionMainに新たにコードを加えて、コマンドライン引数が0,1,その他の場合に例外メッセージを出力するプログラムを教えて下さい。
- ベストアンサー
- Java
- 例外処理についてお願いします!!
下のプログラミングについていくつか質問があります。 (1) プログラムの冒頭に来るpublic static void main(String[] args)を今まで気にしていなかったのですが これはどういうことですか?これもメソッドのひとつなんですか?このプログラムではpublic static void main(String[] args)でメソッドを定義してそれをetest( )メソッドで開いているという感じでしょうか? それとetstってどこから来たのかわかります?作者が勝手につけた名前だそうですが。 (2)FileReader fr = new FileReader("xfile.txt"); のところがわかりません。これはどういう意味ですか? public static void main(String[] args) { public static void etst( ) { try { // try節を書く FileReader fr = new FileReader("xfile.txt"); } catch (FileNotFoundException e) { // FileReader( )対応catch節 System.out.println("例外1: " + e); // 例外情報を表示 return; // 戻る } catch (IOException e) { // Close( )対応catch節 System.out.println("例外2: " + e); // 例外情報を表示 return; // 戻る } System.out.println("ファイルは正しくオープンされました"); } } } よろしくお願いします!!
- ベストアンサー
- Java
- javaの質問です。その2
明日JavaのBronze試験を受けに行くのですが、全然わからずに困っています。 紫色のJavaプログラマBronzr[SE7]という本を使用しています。 本の模試の問題です。 38 Class Foo{ static int val; static int methodA() {return ++val;} } Class Test{ public static void main(String[] args){ Foo.obj =new Foo(); obj.methodA(); }} } この問題では int valと宣言していますが、初期化をしていません。 なのでnullのはずなのですが、 なぜ++valで1になるのかがよくわかりません。 null+1は計算できないと思うのですが、、、、、 明日テストなので本当に困っています。
- ベストアンサー
- Java
- 敬称について教えてください
class parent{ protected final static int val=10; } class Child extends Parent{ private int val=100; public void method(String s){ System.out.println(++val)} } } class Test{ int val=10; public static void main(String args[]){ Parent c=new Child(); c.method("HELLO"); } } 初歩的な質問ですみません。教えて下さい。 上記プログラミングで、下から3行目のc.method・・・ を記入してもコンパイルエラーがおこらないのはなぜでしょうか? 今回newしているのはChildのオブジェクトです。 が、型はParentです。 Parentにはmethodはないし、 なぜこれが許されるのかがわかりません。 分かりやすくおしえてもらえませんか?
- ベストアンサー
- Java
- &と|の演算子を使ったif文のプログラムについて
↓のプログラムの実行結果について質問します。 public class Test{ public static void main(String args[]){ if(methodA() & methodB() ){ System.out.print(1); }else{ System.out.print(2); } if(methodA() | methodB() ){ System.out.print(3); }else{ System.out.print(4); } } private static boolean methodA(){ System.out.print("A"); return false; } private static boolean methodB(){ System.out.print("B"); return true; } } 上記のプログラムを実行すると AB2AB3 と出力されるのですが、 何故こういう風になるのか教えていただけませんか? また、if文の中をそれぞれ if(methodA() & methodB() ) if(methodA() | methodB() ) と書き換えると A2A3 となるのですが、これについてもイマイチよく分かりません。 メソッドからfalseとtrueを戻り値として受け取り 演算子によって処理を分けているんでしょうけど、 どういう流れで処理が行われているのか 出力結果を見ても読めなくて・・・
- ベストアンサー
- Java
お礼
いつもいつも回答ありがとうございます。 Contractですか。調べたところ、リライターで取り除くので実行速度は影響されないとか何とかありましたが、今度挑戦してみることにします。 とりあえず、チェックを契約と見なすと行うべきということですね。貴重なご意見、ありがとうございました。