2010-03-22 6 views
0

Ce que je suis en train de faireJSR-75 code spécifique sur les appareils non JSR-75?

Je coder une midlet J2ME, et je veux utiliser JSR-75 pour écrire des fichiers. Je souhaite également pouvoir exécuter mon application sur un appareil ne prenant pas en charge JSR-75.

Comment je fais

J'ai trouvé un site qui explique comment faire (oublié l'URL, désolé):

  • Créer une classe abstraite publique ("Service") cela expose toutes les fonctionnalités.
  • Créez une classe package-private ("ServiceImplementation") en étendant cette classe abstraite, en implémentant toutes les fonctionnalités.
  • Placez les deux dans un paquet séparé, en rendant Service la façade du paquet.

Pour instancier cette classe, la méthode suivante de la classe abstraite est utilisée:

public static Service getInstance() { 
    try { 
     Class.forName("javax.microedition.io.file.FileConnection"); 
     Class c = Class.forName("my.package.Service"); 
     Service service = (Service) (c.newInstance()); 
     return service; 
    } catch (Exception e) { 
     return null; 
    } 
} 

ce qui va mal

Cela fonctionne parfaitement lorsque JSR-75 est présent. Le problème est que je veux aussi que cette midlet fonctionne sur des périphériques non JSR-75, et que ce code lève une exception ClassNotFoundException: javax/microedition/io/file/FileConnection quand j'essaye de le faire, même si j'attrape toutes les exceptions .

J'ai effectué une recherche à l'échelle du projet pour m'assurer que je n'utilise pas FileConnection ailleurs que dans Service et ServiceImplementation.

Est-ce que quelqu'un sait comment je suis censé faire cela?

+0

Faire Class.forName() est suffisant pour lancer ClassNotFoundException car il tente de charger la classe pour créer un objet Class. –

+0

Bien sûr, mais comme j'attrape toutes les exceptions, l'application ne devrait pas s'arrêter avec cette exception. – user299056

Répondre

0

Légèrement confus à propos de ce que vous faites, en particulier avec deux classes dans des paquets différents tous deux appelés Service! Mais j'ai rencontré ce problème lors de l'écriture de code à exécuter sur les combinés à la fois avec et sans certains JSR.

Faites-vous référence à des classes JSR-75 dans votre classe Service? Je suppose que même si vous n'instanciez pas la classe Service, elle est toujours chargée. La JVM rencontre alors ces classes qui ne sont pas présentes.

Déplacez toutes les références aux classes JSR-75 dans une classe référencée à partir de la classe Service.

+0

Je le fais déjà. J'ai seulement une classe nommée Service, et une nommée ServiceImplementation, les deux dans le même paquet. Ce dernier est paquet-privé, et c'est la seule classe où je fais référence aux classes JSR-75. De toute façon, c'est résolu maintenant. Je ne comprends tout simplement pas pourquoi une exception qui aurait dû être interceptée était toujours lancée, provoquant l'arrêt de l'application. – user299056

+0

Est-ce que Service (accessible à partir de tous les combinés) référençant ServiceImplementation (qui fait référence à JSR-75)? Essayez de déplacer les références JSR-75 vers une autre classe, référencée uniquement à partir de ServiceImplementation. – funkybro

+0

Rien ne fait référence directement à ServiceImplementation. La seule "référence" est dans Service, comme suit: Class.forName ("my.package.ServiceImplementation"). NewInstance(). Mais comme vous pouvez le voir dans les commentaires sur ma propre réponse, cela fonctionne maintenant. – user299056

0

Apparemment, je peux l'utiliser:

System.getProperty("microedition.io.file.FileConnection.version"); 

Si cela renvoie NULL, JSR-75 ne sont pas pris en charge. Si ça retourne autre chose, ça l'est.

+0

Les deux approches devraient fonctionner. Si vous remplacez try {Class.forName ("javax.microedition.io.file.FileConnection"); ... etc dans le code ci-dessus avec if (System.getProperty ("microedition.io.file.FileConnection.version")! = null) {... tout fonctionne-t-il correctement? – funkybro

+0

Oui, cette approche fonctionne.Je voulais accepter ma réponse comme réponse acceptée, mais je dois attendre 5 heures de plus ... – user299056

Questions connexes