プロが教える店舗&オフィスのセキュリティ対策術

下記のコードを実行すると、Main.javaの
Command aCommand = new SimpleCommand(receiver, "action");
で、処理されない例外の型 NoSuchMethodExceptionでエラーが発生してしまうのですが、何が悪いのでしょうか?御教示お願い致します。

//ここから

public abstract class Command {
public abstract void execute();

}

public class MyClass {

public MyClass() {
//
}
}

public class SimpleCommand extends Command {
public SimpleCommand(Object receiver, String action)
throws NoSuchMethodException, SecurityException {
_receiver = receiver;
_action = action;
_class = _receiver.getClass();
_method = _class.getMethod(action, null);
}

public void execute() {
try {
_method.invoke(_receiver, null);
} catch (Exception e) { }
}

private Object _receiver;
private String _action;
private Class _class;
private java.lang.reflect.Method _method;

}

public class Main {

public static void main(String[] args) {
MyClass receiver = new MyClass();
Command aCommand = new SimpleCommand(receiver, "action");
aCommand.execute();
}
}

//ここまで
よろしくお願い致します。

A 回答 (5件)

No.4です。




(1)について
>例外処理はクラスSimpleCommandの中にも書いてあるのですが
とありますが、SimpleCommandのコンストラクタではthrowsしていますよね?
ですので、Mainクラスではthorwsされる可能性のある例外についての処理を記述する必要があります。
仮に、SimpleCommandのコンストラクタをexecuteメソッドのようにtry~catchでくくり、
throws節を削除するとすればMainクラスに例外処理を書く必要はなくなります

(2)について
>スローされた場合のcatch (Exception e) { }の実行は・・
とありますが、これはexecuteメソッドの話ですよね?
Mainクラスでコンパイルエラーになっていたのは、
SimpleCommandのコンストラクタで発生する可能性のある例外の処理が記述されていなかったからです。
そこを勘違いされているようですね。
    • good
    • 0
この回答へのお礼

Javaの例外処理の勉強になりました。

ありがとうございました。

お礼日時:2010/10/15 02:40

すみません。

ちゃんと見ていませんでした。
>下記のコードを実行すると
とあったので実行時に例外が発生しているのだと思ってしまいました。
このコードではコンパイルが通らないので、実行する以前の問題ですね。

で、解決策はNo.2さんの回答のとおり例外処理を追加することです。
try~catchするなり、throwsするなりしてください。
例外処理を追加することで、コンパイルは通るようになると思います。

そしてMyClassにactionメソッドが無い状態で実行すると、
NoSuchMethodExceptionが発生するはずです。試してみてください。

最後に、MyClassにactionメソッドを追加すれば問題なく実行できるようになります。

この回答への補足

度々で申し訳ないのですが、ひとつ質問があります。
上記のように変更すると問題なく実行できることは確認できたのですが、

(1)例外処理はクラスSimpleCommandの中にも書いてあるのですが、何故Mainクラスの中でも同じことを書かないとコンパイルエラーになってしまうのでしょうか?

(2)上記のようにMainクラスの中にも例外処理を書いた場合、クラスSimpleCommandの中の例外処理で、スローされた場合のcatch (Exception e) { }の実行は、どのような場合になされることになるのでしょうか?(Mainクラスでの例外が発生するとその中でのcatch(){ }が実行されてしまう。)

何か勘違いしているかもしれません。
よろしくお願い致します。

補足日時:2010/10/14 12:21
    • good
    • 0

とりあえずAPIを読んでみましょう。



#2さんの修正は、エラーがなくなったわけではなく、エラーをもみ消しているだけですので気をつけてください。
もちろん、それで問題がないのであれば間違いではありません。

参考URL:http://java.sun.com/javase/ja/6/docs/ja/api/java … java.lang.Class...)

この回答への補足

クラスMyClassに以下のメソッドを追加してみたのですが、それでも、NoSuchMethodExceptionの例外が発生してしまうようなのですが、何か書き方が悪いのでしょうか?

//ここから
public class MyClass {

public MyClass() {
//
}
//メソッドの追加
public void action() {
//
}
}

//ここまで
よろしくお願い致します。

補足日時:2010/10/14 00:11
    • good
    • 0

JAVA経験がなくあまり詳しくないですけど、


以下のように修正したらエラーがなくなりました。

たぶん、エラーを処理する部分がないからなのじゃないかな?

とりあえず、私が参照したサイトのURLをアップしておきます。

【修正ソース】
public class Main {
 public static void main(String[] args) {
  MyClass receiver = new MyClass();
  try {
   SimpleCommand aCommand = new SimpleCommand(receiver, "action");
   aCommand.execute();
  } catch (SecurityException e) {

   e.printStackTrace();
  } catch (NoSuchMethodException e) {

   e.printStackTrace();
  }
  }
}

参考URL:http://www.javaroad.jp/java_exception3.htm
    • good
    • 0

MyClass



action
なんていうメソッドがないからよ。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!