11
votes

En Java, comment définir un type de retour si une exception se produit?

hey tout, je suis nouveau à Java et je me demandais si je définis une méthode pour renvoyer un objet de base de données

comme xxx

si la connexion échoue quand je Essayez de le créer, que dois-je retourner? Eclipse me dit que je dois retourner un objet de connexion, mais si cela échoue, je ne suis pas sûr de quoi faire.

merci!

code mis à jour pour laisser exception bulle: xxx


2 commentaires

Franchement, je suis étonné. Eclipse est normalement assez intelligente pour comprendre qu'une fois que vous avez lancé quelque chose, vous n'avez pas besoin de renvoyer quoi que ce soit. Mais pour le rendre heureux, mettez un "retour nul;" après la fin du bloc de capture.


@Paul: En réalité, Eclipse n'est pas satisfait de "exception de type d'exception non gérée" à l'intérieur de la prise (lancers manquants).


6 Réponses :


8
votes

Si une exception est levée, il n'y a pas de valeur normale retournée par la méthode. Habituellement, le compilateur est capable de détecter cela, il n'a même pas pester vous avec « retour nécessaire » avertissements de style / erreurs. Parfois, quand il ne peut pas le faire, vous devez donner une déclaration de retour « alibi », ce qui en fait jamais été exécutée.

Redéfinir votre méthode comme ceci p>

public void doSomething() throws MyException {
    try {
        // code which may throw HibernateException
    } catch (HibernateException e) {
        logger.log("Caught HibernateException", e);
        throw new MyException("Caught HibernateException", e);
    }
}


4 commentaires

Eclipse dit que cette méthode doit renvoyer un type de collection et une icône d'erreur dans la ligne avec la délicatesse de la méthode.


@BeagleGuyy en raison d'un chemin de code qui n'entraînera pas un retour ou un lancer. Cependant, le code que vous avez affiché n'est apparemment pas complet car il ne montre pas un tel chemin de code.


merci Peter, j'ai mis à jour mon code pour supprimer la version Tych / Catch .. La 2e version est meilleure?


@beagle, c'est bon, bien que vous puissiez l'améliorer un peu si vous éliminez conn et simplement retour drivermanager.geconnection (...); à la fin. De plus, vous pouvez extraire la configuration des paramètres de connexion dans une méthode distincte.



1
votes

C'est exactement la situation où vous devriez laisser l'exception propager la pile d'appels (déclarer la méthode sous forme de jette la sqxception ou l'enveloppant dans une exception spécifique à l'application) afin que vous puissiez attraper et gérer à un niveau supérieur.

C'est tout le point d'exception: vous pouvez choisir où les attraper.


0 commentaires

5
votes

Vous devriez simplement éliminer tout votre try / attraper bloquer et permettre à des exceptions à propager, avec une déclaration d'exception appropriée. Cela éliminera l'erreur que Eclipse rapporte, plus maintenant, votre code fait maintenant quelque chose de très mauvais: en attrapant et en rejetant toutes les exceptions, vous détruisez la trace originale de la pile et en cache d'autres informations contenues dans l'objet d'exception d'origine. < / p>

plus, quel est le but de la ligne class.forname ("com.mysql.jdbc.driver"). NewInstance (); ? Vous créez un nouveau pilote MYSQL objet à réflexion (pourquoi?) Mais vous ne faites rien avec elle (pourquoi?).


2 commentaires

Si je n'ai pas cette ligne, je continue à obtenir l'exception: Exception générale: Aucun pilote approprié trouvé pour JDBC: MySQL: /// mydb est une meilleure façon d'obtenir un objet de connexion MySQL?


@BeagleGuyy, je vois de Google que cette méthode de création est réellement recommandée. Hein. Je suppose que les écrivains de JDBC n'ont jamais entendu parler d'injection de dépendance.



2
votes

jamais, jamais, n'utilisez jamais une exception générique comme celle-là. Si vous n'avez pas d'exception prête à faire (dans ce cas, une sqlexception), faites votre propre type d'exception et jetez-la. Chaque fois que je rencontre quelque chose qui déclare qu'il "jette une exception", et il s'avère que cela le fait, car quelque chose qu'il appelle déclare "une exception jette", et ainsi de suite, je veux étrangler l'idiot qui a commencé cette chaîne de la chaîne de Déclarations.


0 commentaires

1
votes

Je suis désolé, mais vous ne devriez pas écrire de code comme celui-ci, même si vous êtes nouveau à Java.

Si vous devez écrire une telle chose, je le ferais plus comme ça: xxx

et vous devez également savoir que les pools de connexion sont le vrai moyen d'aller pour autre chose qu'une application simple et filetée simple.


1 commentaires

Ajouter à la déclaration de méthode Ces exceptions: ClassNotFoundException, InstanciationException, IllégalAccessException



0
votes

Essayez celui-ci

public ActionForward Login(ActionMapping mapping, ActionForm form,
        HttpServletRequest request, HttpServletResponse response) {
    MigForm migForm = (MigForm) form;// TODO Auto-generated method stub

    Connection con = null;
    Statement st = null;
    ResultSet rs = null;

    String uname=migForm.getUname();
    String pwd=migForm.getPwd();

    try{
        Class.forName("oracle.jdbc.driver.OracleDriver");
        con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:XE","uname","pwd");
        if(con.isClosed())
        {
            return mapping.findForward("success");
        }

        //st=con.createStatement();

        }catch(Exception err){

        System.out.println(err.getMessage());
        }


            return mapping.findForward("failure");



}


0 commentaires