2016-05-24 38 views
-3

私はこのラインでNoSuchMethodExceptionを得続ける:NoSuchMethodExceptionが表示されるのはなぜですか?

new SubChange("first", physio, "calcTotalFatigue") 

どこphysio:そのインスタンスのように初期化されている

class SubChange implements Serializable { 
    String changeType; 
    Serializable affectingObject; 
    String affectingFieldName; 
    String affectingMethodName; 

    public SubChange(String chanType, Serializable affingObj, String affingFM) { 
     try{ 
      changeType = chanType; 
      affectingObject = affingObj; 
      //deciding whether affingFM provides a field name or a method name 
      for (Field f : affingObj.getClass().getDeclaredFields()) { 
       if (f.getName().equals(affingFM) == true) { 
        affectingFieldName = affingFM; 
        break; 
       } 
      } 
      if (affectingFieldName == null) { 
       affectingMethodName = affingFM; 
      } 
     } catch(Exception e) { 
      e.printStackTrace(); 
     } 
    } 
    //other class methods 
} 

scはクラスSubChangeのインスタンスである

float modif = (float)sc.affectingObject.getClass().getMethod(sc.affectingMethodName, (Class<?>[])null).invoke(sc.affectingObject, (Object[])null); 

内部クラスPhysiology所属のインスタンスです。クラスHmに、SubChangeコンストラクタは同じHmクラスの別の内部クラスから呼び出されています。

calcTotalFatigue()physioがあることは言うまでもありません。

誰でも、私が間違っていることを提案できますか?

ANSWER

エラーが、私は単純に問題の説明を省略方法calcTotalFatigue()の間違ったアクセス修飾子によって引き起こされました。メソッドをpublicにすると問題が解決しました。

sc.affectingObject.getClass().getMethod(
     sc.affectingMethodName, (Class<?>[]) null) 

、それはgetMethod呼び出しはあなたが要求した方法を見つけることができないことを意味します

答えて

0

例外は、この部分によってスローされています。

あなたのコードを調べる理由はわかりませんが、返すクラスのクラス名をsc.affectingObject.getClass()で印刷し、sc.affectingMethodNameという値を出力し、実際のクラス(またはスーパークラス)は、探しているメソッドを定義します。

もちろん、physioのcalcTotalFatigue()メソッドが存在します。

言うまでもなく...あなたは間違っているかもしれません!

UPDATE

あなたは尋ねた:

を、アクセスレベル修飾子で何かすることはできますか?

javadocは言う:

"このClassオブジェクトが表すクラスまたはインタフェースの指定公共メンバメソッドを反映するMethodオブジェクトを返します。"

だから、そうかもしれません。非公開のメソッドを取得する場合は、getMethodの代わりにgetDeclaredMethodを使用することを検討してください。

+0

ありがとうございます。 'sc.affectingObject.getClass()。getName()'が 'Hm $ Physiology'を返しました ' sc.affectingMethodName.toString'が 'calcTotalFatigue'を返しました そして内部クラス' Physiology '(そのオブジェクトは' physio'です)、メソッド 'calcTotalFatigue'を定義します。 「存在する」とは、「定義された名前の綴りが正しい」という意味でした。 アクセスレベル修飾子を持つものにできますか? – Vic

+0

@Vic重要な追加についてコメントを使用しません。代わりに質問を編集してください。 – Robert

+0

@Robert申し訳ありませんが、問題は解決しました。 – Vic

関連する問題