下記のコードを実行すると、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を探す
おすすめ情報
- ・漫画をレンタルでお得に読める!
- ・街中で見かけて「グッときた人」の思い出
- ・「一気に最後まで読んだ」本、教えて下さい!
- ・幼稚園時代「何組」でしたか?
- ・激凹みから立ち直る方法
- ・1つだけ過去を変えられるとしたら?
- ・【あるあるbot連動企画】あるあるbotに投稿したけど採用されなかったあるある募集
- ・【あるあるbot連動企画】フォロワー20万人のアカウントであなたのあるあるを披露してみませんか?
- ・映画のエンドロール観る派?観ない派?
- ・海外旅行から帰ってきたら、まず何を食べる?
- ・誕生日にもらった意外なもの
- ・天使と悪魔選手権
- ・ちょっと先の未来クイズ第2問
- ・【大喜利】【投稿~9/7】 ロボットの住む世界で流行ってる罰ゲームとは?
- ・推しミネラルウォーターはありますか?
- ・都道府県穴埋めゲーム
- ・この人頭いいなと思ったエピソード
- ・準・究極の選択
- ・ゆるやかでぃべーと タイムマシンを破壊すべきか。
- ・歩いた自慢大会
- ・許せない心理テスト
- ・字面がカッコいい英単語
- ・これ何て呼びますか Part2
- ・人生で一番思い出に残ってる靴
- ・ゆるやかでぃべーと すべての高校生はアルバイトをするべきだ。
- ・初めて自分の家と他人の家が違う、と意識した時
- ・単二電池
- ・チョコミントアイス
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
型Containerのメソッドadd(S...
-
SwingでgetContentPaneのエラー...
-
無名パッケージからのインポート
-
構造 他のクラスの構造体を別...
-
Class内で他のClassの定義
-
dllエクスポート時のdeclspec(d...
-
javaでメインクラスが見つから...
-
C++ シングルトン マルチスレッド
-
[C#] OpenFileDialogによって得...
-
C++でfriendクラスにしているの...
-
C# 可変長変数のやりとりについて
-
c++,ある関数のクラスから別の...
-
「タイプ初期化子が例外をスロ...
-
エクセルVBAで、条件に一致する...
-
VBA 同じ名前のオブジェクトを...
-
オブジェクト参照がオブジェク...
-
エクセルVBA 画像を貼り付ける...
-
VB.netでメソッドからコントロ...
-
VB.NET getとsetの概念がわかり...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
C#にて別クラスの関数を使いたい
-
import と extends について
-
c++,ある関数のクラスから別の...
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
構造 他のクラスの構造体を別...
-
C#のクラスライブラリでメッセ...
-
無名パッケージからのインポート
-
親クラスから子クラスへアクセス。
-
Java
-
C# インターフェイスの実装
-
Tomcatのpropertiesファイルの...
-
C# log4netの使い方
-
ひとつのファイルにクラスは1つ?
-
dllエクスポート時のdeclspec(d...
-
a href="..." とServlet
-
実行可能jarファイルのファイル...
-
C#でほかのファイルにある自作...
おすすめ情報