2015-04-11 8 views
6

Supponiamo di avere una classe di nome DynamicClass:Come rilevare l'eccezione MethodNotFoundException all'interno della classe?

public class DynamicClass { 

    public void get(String input) { 
     System.out.println(input); 
    } 

} 

Ora, immaginiamo la seguente creare un'istanza di DynamicClass:

DynamicClass clazz = new DynamicClass(); 
clazz.getName(); 
clazz.getOther(); 

Naturalmente, la chiamata di getName e getOther metodi tiri MethodNotFoundException eccezione. Tuttavia, sono curioso, c'è un modo per catturare l'eccezione MethodNotFoundException all'interno della classe DynamicClass, vale a dire la chiamata di get("Name") e get("Other") anziché lanciare l'eccezione MethodNotFoundException a causa della chiamata di getName() e getOther()?

+1

Questo non accadrà in Java. Ma penso che definire un tale metodo "predefinito" sia possibile in un linguaggio dinamico come Groovy: http://rosettacode.org/wiki/Respond_to_an_unknown_method_call#Groovy –

+1

Non è un tempo di compilazione, errore, invece di essere un'eccezione di runtime . Chiamando un metodo che non c'è ... !!!! Ahha, non sapevo ancora di Reflections @MarounMaroun :(Felice di sapere, posso leggere qualcosa di nuovo :-) –

+2

@nIcEcOw Utilizzando reflection non sarà un errore. Le cose sono dinamiche lì. – Maroun

risposta

0

Con riferimento alla this answer, è possibile raggiungere tutte le eccezioni non gestite fanno in Java:

Thread.setDefaultUncaughtExceptionHandler(new Thread.UncaughtExceptionHandler() { 
    @Override 
    public void uncaughtException(Thread thread, Throwable throwable) { 
     // TODO 
    } 
}); 
0

Perché no?

try{ 
    clazz.getName(); 
    clazz.getOther(); 
}catch(MethodNotFoundException e){ 
    clazz.get("Name") 
} 

Ma in realtà non credo che sia una buona idea ...

+0

Questo non è ciò che l'OP sta cercando, è una riflessione di riferimento, la classe è dinamica. Il loro codice è solo per illustrare il problema. – Maroun

+0

@ MarounMaroun L'OP non ha detto nulla sull'uso della riflessione. – EJP

2

Nizza curiosità.

Ho paura, non c'è altro modo di utilizzare try catch in Java, ma se Java era un compilatore OTF (al volo) e il meccanismo di eccezione effettivamente utilizza un metodo (if-responds_to?) Che dovrebbe essere dichiarato nella parte superiore della piramide gerarchica dell'ereditarietà della classe, ad esempio Object in Java, che sarebbe possibile sovrascrivere tale metodo sulla DynamicClass.

Tuttavia Java non utilizza il meccanismo sopra riportato per controllare se risponde a? e i messaggi che vengono inviati ad un oggetto (classe) vengono testati da qualche altra parte nel compilatore ma non come un metodo che puoi sovrascrivere.

Conosco un linguaggio chiamato (Magik) che ha il meccanismo di cui sopra che è molto bello ed è un compilatore OTF.

la classe Object in Magik ha un metodo con nome does_not_responds_to() e ogni volta che un messaggio viene inviato a un oggetto viene testato rispetto agli stati e ai comportamenti della classe e infine genera o meglio esegue il metodo do_not_responds_to() nel caso il il nome del metodo (messaggio) non è valido.

È una soluzione molto accurata per implementare il does_not_responds_to? metodo nella classe (DynamicClass) per gestire l'eccezione prima che si alzi. tuttavia, dopo 10 anni di esperienza con Magik, non ha mai avuto bisogno di farlo.

Siamo spiacenti, il mio inglese non è buono, spero di poter spiegare il problema.

Problemi correlati