下記のコードを実行すると、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で質問しましょう!
似たような質問が見つかりました
- Java java 入力 3 4 3 出力 ABC DEFG HIJ このようなプログラムの書き方を教えてくだ 2 2022/07/15 14:18
- Java Java プログラム public class Main { public static void 3 2023/08/10 23:46
- Java java final 1 2022/06/10 22:49
- C言語・C++・C# 大量のデータを読み込んで表示する速度を改善したい 8 2023/05/07 13:29
- Java JavaのSingletonパターンのprivateの持つ意味が分かりません。 5 2022/06/12 10:38
- Java 直し方について教えて頂きたいです。 4 2022/08/13 02:11
- C言語・C++・C# C# DatagridviewにExcelシートを反映するとエラーが出る 2 2023/05/06 17:12
- Java eclipse実行ができない 2 2022/07/27 04:47
- Ruby 【JAVA】数字をひし形に出力するプログラムについて 2 2022/07/11 23:32
- Visual Basic(VBA) batからexeを実行し戻り値を受け取る バッチからEXEの結果を受け取りたいのですが、 下記のバッ 1 2023/07/04 15:13
関連するカテゴリからQ&Aを探す
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
クラス間でのデータ参照
-
範囲外の数値を代入したらエラ...
-
C#でほかのファイルにある自作...
-
visual studioのデザイナ画面で...
-
C# インターフェイスの実装
-
JSPでbeanプロパティ(配列)を...
-
親クラスから子クラスへアクセス。
-
c++,ある関数のクラスから別の...
-
java-別クラスの変数の使い方を...
-
C++でfriendクラスにしているの...
-
親クラスから呼ぶ
-
構造 他のクラスの構造体を別...
-
Java リフレクションについて
-
C#のクラスライブラリでメッセ...
-
javaでメインクラスが見つから...
-
ひとつのファイルにクラスは1つ?
-
アップキャスト、ダウンキャス...
-
explicitの定義は?
-
Javaでのジェネリクス型パラメ...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
関数内の変数に<summary>コメン...
-
C#にて別クラスの関数を使いたい
-
c++,ある関数のクラスから別の...
-
親クラスから子クラスへアクセス。
-
C#でほかのファイルにある自作...
-
クラス間でのデータ参照
-
構造 他のクラスの構造体を別...
-
範囲外の数値を代入したらエラ...
-
ひとつのファイルにクラスは1つ?
-
C++でfriendクラスにしているの...
-
Java リフレクションについて
-
継承したクラス側のクラス名の取得
-
C# インターフェイスの実装
-
java-別クラスの変数の使い方を...
-
C#のクラスライブラリでメッセ...
-
visual studioのデザイナ画面で...
-
C# log4netの使い方
-
a href="..." とServlet
-
アップキャスト、ダウンキャス...
-
オブジェクトのデータをもとにX...
おすすめ情報