• ベストアンサー

オーバーライドしたメソッドで例外を投げたいとき

お世話になります。 あるinterfaceを実装するクラスを作成しています。 そこでinterface内のメソッドを実装するわけですが、そこで例外を生成しthrowしたいと思っています。ですが、interfaceでそのメソッド定義にはその例外をthrowするようには定義されていないので、コンパイル時にエラーになります。 今は強引にNullPointerExceptionを生成するようなコードを書いて例外を発生させていますが、このようなケースではどのように記述するのが一般的なのでしょうか。 interfaceは内製ではないので変更することができません。 よろしくお願いいたします。

  • annyG
  • お礼率70% (67/95)
  • Java
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • kztk
  • ベストアンサー率53% (59/110)
回答No.1

1.そのインタフェースで   public void someMethod() throws HogeException;  のような定義がされている場合  HogeExceptionを生成して投げるようにする。   2.throws自体が無い場合、  標準のExceptionに適切なRuntimeExceptionがあるならば、それを生成して投げる  (例えばNullPointerException) 3.標準の中に適切な例外が無い場合、  RuntimeExceptionを継承する独自の例外クラスを作成して、それを投げる ですかねえ? でも、そもそも1に該当しない場合は、無理やり例外を投げたとしても、そのメソッドの呼び出し元(これもおそらく内製ではないはず)がその例外をcatchしてくれる可能性は低いですよね。 なので「これがおきたら落ちるしかない」ほどの状況でもない限り、「例外を投げない」のが正解な気がします。

annyG
質問者

お礼

ああ、そうですね。そうでした。RuntimeExceptionなら投げられますね。 なんかできるはずだったなあ、と思いつつ、ググってみたりしたのですが、キーワードが悪かったせいか、見つけることができず、「あれ、できないんだっけ」とか思ってました。 これで解決します。ありがとうございました。

関連するQ&A

  • 「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」

    「インタフェースを実装してそれが持つ抽象メソッドをオーバーライドする」は正しい? はじめまして。Javaのインタフェースに関する質問です。 私はこれまで、インタフェースを使うときは、インタフェースを実装してクラスを宣言し、そのクラス、またはサブクラスでインタフェースがもつすべての抽象メソッドを定義する、と理解していました。 しかし、下の例をみてください。抽象メソッドの定義を、インタフェースの実装の以前で与えています。問題無くコンパイルでき、実行できます。実行結果も以下の通りです。 インタフェースの抽象メソッドへの定義の与え方やその実行のされ方は、メソッドのオーバーライドと同様と思っていましたので、下記のコードでは「クラスBが抽象クラスではありません」や、「インタフェースの抽象メソッドがオーバーライドされていません」などの文法エラーがでると思っていました。 そこで、質問です。 インタフェースが持つ抽象メソッドの定義を与える場所について、または、これに関する説明のあるページなど、何かご存知でしたら教えてください。 ★コード★ interface X{   void show(); } class A{   public void show(){     System.out.println("A");   } } class B extends A implements X{ } public class Main{   public static void main(String[] args){     X x=new B();     x.show();   } } ★実行結果★ >java Main A ★Java環境★ java 1.6.0_21 javac 1.6.0_16

    • ベストアンサー
    • Java
  • 継承したメソッドのドキュメンテーションコメント

    C#の開発を始めて日が浅いため、現場におけるお作法がわかりません。 現場におけるクラス・インターフェースを継承したメソッドのドキュメンテーションコメントの付け方に関する一般論についてお教えいただきたいです。 ※基底クラス、及びインターフェースの抽象メソッドにはドキュメンテーションコメントの記述がある物とします。 ※普段はJavaを使っている為、そこから引用している書いている部分があります。ご容赦下さい。 ・抽象クラスにおけるインターフェースから継承した抽象メソッド(実装しない場合) Javaとは違い、抽象クラスであってもインターフェースが持つの抽象メソッドを無視する事はできず、 public abstract修飾子を付けて抽象メソッドを定義してやる必要があるようなのですが、 この場合、ドキュメンテーションコメントは省略すべきでしょうか? それとも、何かしら記述するべきなのでしょうか?(Javaで言うところの@inheritDoc等・・・そのような物があるかはわかりませんが) ・新たに実装を行う場合(抽象メソッドの実装等) 省略すべきでしょうか? ・既存の実装を拡張し、変更の影響は微小かつメソッド内のみで完結し、概要やその他のメソッドの責任において表記すべき内容に変化が無い場合 省略すべきでしょうか? ・既存の実装を拡張し、想定される例外の追加等、メソッド外にも影響を及ぼす大きな変更が入った場合 新たに完全なドキュメンテーションコメントを作成するべきでしょうか? それとも差分以外は新たに作成すべきではないのでしょうか? 一般論と言っても規模や進め方によって様々だとは思いますが、 通念的に「心がけていくべき事」等あれば、是非お教え下さい。 最後に、この質問の趣旨からは外れるのですが、一つ追加で別の質問をさせてください。 私は何故抽象クラスがインターフェースの抽象メソッドを無視できないかがわかっておりません。 (インターフェース-インターフェース、抽象クラス-抽象クラスは無視できるのに) 敢えて明示的に定義を強要させている以上、何か理由あっての事だと思いますが、 それがわからず悶々村々としながら作業しております。 その理由をお教えいただけませんでしょうか。 宜しくお願い致します。

  • 例外処理について

    こんにちは。 とあるメソッドで例えば 「void openErrorFile(){」とあるのですが、 メソッド内部で } catch (Exception e) { throw new RuntimeException();} と例外をThrowしています。 この場合、メソッドの定義「openErrorFile()」にはThrows句を 付ける必要は無いのでしょうか?。 すみませんがご教授願います。

    • ベストアンサー
    • Java
  • ClientBase<TChannel> クラスの Dispose() メソッドについて

    お世話になっております。 http://oshiete1.goo.ne.jp/qa5572673.html に引き続き、 Dispose() メソッドの実装について不明な点があるので、よろしければご教示願います。 環境は、Visual C# 2008 Express Edition です。 .NET 3.5 まず、公開されているWebサービスに対して、 ソリューションエクスプローラより、サービス参照の追加で、Clientクラスを自動生成いたしました。 その自動生成されたクラス(仮に XSoapClient)が、System.ServiceModel.ClientBase<TChannel> クラスを継承しています。 ClientBase クラスは、IDisposable インタフェースを実装しているのですが、XSoapClient にも ClientBase にも、Dispose() メソッドの実装が見当たりません。 (自動生成のため、別の場所に作成されているのかもしれません。) using (XSoapClient client = new XSoapClient()) {  // ここにコード } とした場合に、client の Dispose() の実装がわからないため、 しっかりとコネクションが切れているのかが不明です。 Dispose() メソッド内では、Close() メソッドが呼ばれているのが普通なのでしょうか。 以上、よろしくお願いいたします。

  • インターフェイスと抽象クラス

    なかなか理解が難しくて苦しんでいます。 で自分なりに理解したのですが、 抽象クラス→内容に決まっているメソッドと決まっていないメソッドがある場合に決まっていないメソッドを あとからオーバーライドするだけでスーパークラスで定義したすべてのメソッドを利用できる。 これでただしいでしょうか? で、インターフェイスなのですが、この抽象クラスとそっくりなんですが、 (1)変数は定数になる(強制static)(2)メソッドは名前のみの宣言(内容は記述できない) と言うことで、かなり???なのです。 何のために・・・???記述するんでしょうか?? ただひとつメリットがあるとしたら、インターフェイスを実装すると、インターフェイスの配列でインスタンスを 生成出来るということぐらいでしょうか。 そこでちょっとお門違いの疑問かもしれないんですが、 Runnable、やMouselistenerはメソッドの内容が書かれていないのに、 なぜ機能を持たせることが出来るのでしょう??? 認識違い、間違い等ありましたら、教えてください よろしくお願いいたします。

    • ベストアンサー
    • Java
  • 例外処理についてご相談

    こんばんは。 とあるユーザー定義例外クラスがあるとします。 でこれのコンストラクタが sendException (String errId) sendException (String errId,String errMsg) sendException (String errId,String errMsg,Throwable e) と3種類あるとします。 でCatchする方の記述で困っています。 実は上記例外の送出は既存システムで、3種類全て使用されているのです。 つまり最初の xxxException (String errId) が送出されてきて、Catch側で「Throwable e」を取り出そうとしたら 「NullPointerException」が発生するような気がします。 Catch側でどのコンストラクタでExceptionが生成されたか、チェック する方法はありますでしょうか?。 CatchしたExceptionのプロパティのNull確認をするしかありませんでしょうか・・。 アドバイスお願いします。

  • 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も含めて)

  • インターフェイスの使い方がわかりません(初心者です)

    Javaを始めたばかりの初心者です。 「やさしいJava」を買って一通り学んだのですが、 インターフェイスの使い方がよくわからず、困っています。 インターフェイスを実装することでインターフェイスが持つメソッドがすべて定義されてることが保障される、 というのはわかるんですが、そのことがどうして有用なのでしょう? また、具体的にはスレッドを扱うときにRunnableインターフェイスを実装する理由がわかりません。 Threadクラスのオブジェクトを作成するときに、 Runnableを実装したクラスのオブジェクトの変数を 引数にしないといけないんですよね? このとき、Runnableインターフェイスが 「runメソッドが定義されていなければならない」 とだけいうものだったとしたら、 Runnableを実装してなくてもrunメソッドさえ定義してあれば 実行できそうな気がするんですが・・・

    • ベストアンサー
    • Java
  • (Delphi) 例外の再生成について

    例外の再生成のことで質問があります。 Delphi の Ini ファイルを操作するクラス TCustomIniFile には、 ReadDate や ReadFloat といったメソッドがありますが、 このメソッドのソースコードを拝見すると、例外処理を行っている部分で EConvertError 例外以外の時は else 節の raise で同じ例外を再生成しているのですが、 この else 節は無くても同じ気がするのですが、どうしてわざわざ else 節で キャッチした例外を再生成しているのでしょうか? EConvertError 例外以外は例外処理しなければそのままメソッド呼び出し元に伝わりますが、 あえて raise で再生成していることに何か意図はあるのでしょうか? 以下は ReadFloat メソッドのソースコードです。 1 と 2 の部分がなくても結果は同じではないのでしょうか? function TCustomIniFile.ReadFloat(const Section, Name: string; Default: Double): Double; var  FloatStr: string; begin  FloatStr := ReadString(Section, Name, '');  Result := Default;  if FloatStr <> '' then  try   Result := StrToFloat(FloatStr);  except   on EConvertError do    // Ignore EConvertError exceptions   else ←―――――――――――――― 1    raise; ←―――――――――――――― 2  end; end;

  • 【アクセス修飾子】アクセス修飾子無しのクラスにpublicなメソッド

    アクセス修飾子無しのクラスのメソッドにpublicを付ける意味がわかりません。 class MyClass {  public void method() {} } 例えばこのようなクラスがあったとします。 このクラスはアクセス修飾子無しで他のパッケージからはアクセス出来ない為、メソッドにpublicを付ける意味は無いと思うのですが、付けてもコンパイルは通ります。 何故なんだろう、と考えてみたのですが、例えばpublicなメソッドを持つpublicなクラスを継承し、そのメソッドをオーバーライドした時にメソッドにpublicを付けざるを得ない、あるいは、インターフェイス(暗黙的にメソッドにpublicが付く)を実装したときにメソッドにpublicを付けざるを得ない等、そういう場合に対応するための『遊び』みたいなものなのでしょうか? 御教授よろしくお願いします。

    • ベストアンサー
    • Java

専門家に質問してみよう