2009-03-24 5 views
2

Je reçois une erreur en disant que je dois NetBeans jeter un SQLException dans cette méthode:Java - Une exception doit être levée, mais comment?

private void displayCustomerInfo(java.awt.event.ActionEvent evt)          
{           
    int custID = Integer.parseInt(customerID.getText()); 
    String info = getCustomerInfo(custID); 
    results.setText(info); 
} 

Cette méthode est créée par NetBeans il ne me permet d'éditer la signature et jette l'exception. C'est pourquoi j'ai créé la méthode getCustomerInfo(). Cette méthode lance l'exception, car elle utilise une méthode pour extraire des informations d'une base de données à propos d'un client.

public String getCustomerInfo(int cid) throws SQLException 
{ 
    Customer c = proc.getCustomer(cid); 
    // get info 
    return "info"; 
} 

Le procédé getCustomer jette également l'exception et proc.java compile.

L'erreur exacte est

unreported exception java.sql.SQLException; must be caught or declared to be thrown 
+0

Pardonne-moi, mais pourquoi tout le monde parle * juste * à propos de try-catch ici? C'est une option, mais pas la seule option. Pourquoi l'exception ne peut-elle pas être lancée? Pourquoi les netbeans ne le permettraient-ils pas? Je n'utilise pas Netbeans (j'utilise eclipse) mais il semble stupide qu'un IDE ne permette pas de changer le code généré. – Nivas

Répondre

8

Lire le message d'erreur à nouveau, il vous donne deux choix.

Vous devez déclarer l'exception comme étant levée (ce que vous ne pouvez pas faire) ou intercepter l'exception. Essayez le 2ème choix.

2

Il ne dit pas que vous devez le jeter. Il dit que vous pouvez l'attraper. Utilisez donc un bloc try/catch et gérez-le.

try { 
    ... 
} 
catch (SQLException e) { 
    System.out.println("Exception happened! Abort! Abort!"); 
    e.printMessage(); //Not sure if this is the correct method name 
} 
3

Vous devez mettre un bloc try/catch autour de votre appel à getCustomerInfo(), comme ceci:

private void displayCustomerInfo(java.awt.event.ActionEvent evt)          
{           
    int custID = Integer.parseInt(customerID.getText()); 
    try { 
     String info = getCustomerInfo(custID); 
    } catch (SQLException sqle) { 
     // Do something with the exception 
    } 

    results.setText(info); 
} 

Quelques bonnes options pour gérer l'exception peut-être: l'enregistrement de l'exception et les détails utilisé pour l'obtenir, ou en l'utilisant comme un signal pour réessayer la demande de connexion. Alternativement, comme le montre Outlaw Programmer, vous pouvez relancer l'Exception comme RuntimeException de quelque sorte, ce qui supprime l'exigence de vérification.

9

En général, si votre code doit générer un type d'exception que la signature ne prend pas en charge et que vous n'avez aucun contrôle sur l'interface, vous pouvez l'attraper et le relancer en tant que type pris en charge par l'interface. Si l'interface ne déclare pas vérifié exceptions, vous pouvez toujours jeter un RuntimeException:

private void displayCustomerInfo(java.awt.event.ActionEven evt)          
{   
    try 
    {         
     int custID = Integer.parseInt(customerID.getText()); 
     String info = getCustomerInfo(custID); 
     results.setText(info); 
    } 
    catch (SQLException ex) 
    { 
     throw new RuntimeException(ex); // maybe create a new exception type? 
    } 
} 

Vous presque certainement envie de créer un nouveau type d'exception qui va RuntimeException et avoir votre code client capture cette exception. Sinon, vous courez le risque d'attraper N'IMPORTE QUELLE RuntimeException, y compris NullPointerException, ArrayIndexOutOfBoundsException, etc., que votre code client ne peut probablement pas gérer.

+0

Je vais vous donner un +1 pour avoir une réponse correcte qui résout le problème, et peut bien finir par être ce que l'OP doit faire, mais pourriez-vous s'il vous plaît mentionner que cacher des choses dans RuntimeExceptions est généralement considéré comme une mauvaise pratique? : D – rmeador

+0

Son considéré comme une mauvaise pratique par certains. Il y a beaucoup de cas où prendre une exception vérifiée (qui ne devrait jamais avoir été dans le langage java selon certains) et l'encapsuler dans une exception non cochée est une bonne chose. Hibernate fait cela dans tous les cas, par exemple. – jsight

+0

J'ai modifié la réponse pour expliquer le problème plus clairement. Je n'ai pas de problème avec RuntimeExceptions mais je pense que ça vaut probablement la peine de créer un nouveau type pour que le client puisse au moins savoir pourquoi l'appel a échoué. –

1

Les composants générés par NetBeans ont un code non modifiable, et je suppose qu'il est généré en tant que partie du constructeur gui. Je demanderais si c'était le cas, mais je ne peux pas encore commenter. Si vous sélectionnez un objet généré dans l'éditeur graphique, sur la droite, il y a un onglet "code" qui peut être utilisé pour modifier la zone grisée du code.

ici:
Code tab that is used to modify generated code.

Questions connexes