下記のコードを実行すると、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();
}
}
//ここまで
よろしくお願い致します。
No.5ベストアンサー
- 回答日時:
No.4です。
(1)について
>例外処理はクラスSimpleCommandの中にも書いてあるのですが
とありますが、SimpleCommandのコンストラクタではthrowsしていますよね?
ですので、Mainクラスではthorwsされる可能性のある例外についての処理を記述する必要があります。
仮に、SimpleCommandのコンストラクタをexecuteメソッドのようにtry~catchでくくり、
throws節を削除するとすればMainクラスに例外処理を書く必要はなくなります
(2)について
>スローされた場合のcatch (Exception e) { }の実行は・・
とありますが、これはexecuteメソッドの話ですよね?
Mainクラスでコンパイルエラーになっていたのは、
SimpleCommandのコンストラクタで発生する可能性のある例外の処理が記述されていなかったからです。
そこを勘違いされているようですね。
No.4
- 回答日時:
すみません。
ちゃんと見ていませんでした。>下記のコードを実行すると
とあったので実行時に例外が発生しているのだと思ってしまいました。
このコードではコンパイルが通らないので、実行する以前の問題ですね。
で、解決策はNo.2さんの回答のとおり例外処理を追加することです。
try~catchするなり、throwsするなりしてください。
例外処理を追加することで、コンパイルは通るようになると思います。
そしてMyClassにactionメソッドが無い状態で実行すると、
NoSuchMethodExceptionが発生するはずです。試してみてください。
最後に、MyClassにactionメソッドを追加すれば問題なく実行できるようになります。
この回答への補足
度々で申し訳ないのですが、ひとつ質問があります。
上記のように変更すると問題なく実行できることは確認できたのですが、
(1)例外処理はクラスSimpleCommandの中にも書いてあるのですが、何故Mainクラスの中でも同じことを書かないとコンパイルエラーになってしまうのでしょうか?
(2)上記のようにMainクラスの中にも例外処理を書いた場合、クラスSimpleCommandの中の例外処理で、スローされた場合のcatch (Exception e) { }の実行は、どのような場合になされることになるのでしょうか?(Mainクラスでの例外が発生するとその中でのcatch(){ }が実行されてしまう。)
何か勘違いしているかもしれません。
よろしくお願い致します。
No.3
- 回答日時:
とりあえず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() {
//
}
}
//ここまで
よろしくお願い致します。
No.2
- 回答日時:
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
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#でほかのファイルにある自作...
-
親クラスから子クラスへアクセス。
-
Java リフレクションについて
-
無名パッケージからのインポート
-
生成されたサーブレットのエラ...
-
キャストについて教えてください
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
C# log4netの使い方
-
内部クラスのインスタンスを外...
-
違うクラスからの変数の共有化
-
C#のクラスライブラリでメッセ...
-
指定されたクラスの継承元の確...
-
下記のコードを実行すると、Mai...
-
c++,ある関数のクラスから別の...
-
JAVA、JAVA Scriptについて教え...
-
Java throwとthrowsの違いについて
-
変数名の付け方
-
エクセルVBAで、条件に一致する...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
C#にて別クラスの関数を使いたい
-
構造 他のクラスの構造体を別...
-
c++,ある関数のクラスから別の...
-
C#のクラスライブラリでメッセ...
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
ひとつのファイルにクラスは1つ?
-
C#でほかのファイルにある自作...
-
範囲外の数値を代入したらエラ...
-
無名パッケージからのインポート
-
java-別クラスの変数の使い方を...
-
import と extends について
-
C# インターフェイスの実装
-
親クラスから子クラスへアクセス。
-
a href="..." とServlet
-
継承したクラス側のクラス名の取得
-
Java
-
JSPでbeanプロパティ(配列)を...
おすすめ情報