2016-05-24 17 views
-3

halte ich NoSuchMethodException in dieser Linie bekommen:Warum bekomme ich NoSuchMethodException?

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

wo sc eine Instanz der Klasse ist SubChange:

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 
} 

deren Instanz wie folgt initialisiert wurde:

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

wo physio ist eine Instanz der inneren Klasse Physiology gehört zu Klasse Hm, während der SubChange Konstruktor von einer anderen inneren Klasse derselben Hm Klasse aufgerufen wird.

Es ist unnötig zu sagen, dass die Methode calcTotalFatigue() von physio existiert.

Kann mir bitte jemand vorschlagen, was ich falsch mache?

ANSWER

der Fehler durch die falschen Zugriffsmodifikator des Verfahrens verursacht wurde, die I calcTotalFatigue() naiver in der Beschreibung des Problems verzichtet. Durch die Veröffentlichung der Methode wurde das Problem gelöst.

Antwort

0

Die Ausnahme von diesem Teil wird geworfen:

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

und es bedeutet, dass die getMethod Anruf nicht die Methode finden können, die Sie angefordert haben.

Ich kann nicht feststellen, warum von Ihrem Code aus, aber ich schlage vor, dass Sie den Klassennamen der Klasse von sc.affectingObject.getClass() ausgedruckt, drucken Sie den Wert sc.affectingMethodName, und überprüfen Sie, dass die tatsächliche Klasse (oder a Superklasse) definiert die Methode, nach der Sie suchen.

Unnötig zu sagen, dass die Methode calcTotalFatigue() von physio existiert.

Unnötig zu sagen ... Sie könnten sich deswegen irren!

UPDATE

Sie gefragt:

Kann es etwas mit Zugriffsebene Modifikatoren sein?

Die javadoc sagt:

„Gibt ein Method-Objekt, das die angegebenen öffentliche Mitglied Methode der Klasse oder Schnittstelle dieses Klasse-Objekt dargestellt widerspiegelt.“

Also ... ja, das könnte das Problem sein.Wenn Sie nichtöffentliche Methoden abrufen möchten, verwenden Sie getDeclaredMethod anstelle von getMethod.

+0

Vielen Dank für Ihre Eingabe. Ich habe getan, was Sie sagten, aber das hat nicht geholfen: 'sc.affectingObject.getClass(). GetName()' zurückgegeben 'Hm $ Physiologie' ' sc.affectingMethodName.toString' zurückgegeben 'calcTotalFatigue' Und innere Klasse' Physiologie '(dessen Objekt' physio' ist) definiert die Methode 'calcTotalFatigue'. Mit "existiert" meinte ich "definiert und richtig geschrieben". Kann es etwas mit Access-Level-Modifikatoren sein? – Vic

+0

@Vic verwenden keine Kommentare für wichtige Ergänzungen. Bearbeite stattdessen deine Frage. – Robert

+0

@Robert Sorry aber das Problem ist jetzt gelöst. – Vic

Verwandte Themen