OVH Cloud OVH Cloud

Return obligatoire inutile...

16 réponses
Avatar
Delf
Salut.
Je code un p'tit programme sous NetBeans.
Voici la fonction qui me pose probleme:

public boolean contains(String pLogin) {

String requestSQL = "SELECT Login FROM User WHERE Login = \"" + pLogin
+ "\"";

try {

ResultSet getResult =
SQLConnection.SQLStatement.executeQuery(requestSQL);

if (getResult.next()) return true;
else return false;
}
catch(Exception e) {

System.out.println("Exception: " + e);
}
/* Ici return demandé... */
}

Et quand j'execute, NetBeans me demande un return la ou je l'ai indique
entre commentaire alors qu'il est completement inutile! Comment contrer
ceci ? Pt'tre que j'ai mal code ma fonction...

Merci anticipe.

--
Delf

6 réponses

1 2
Avatar
yvon.thoravalNO-SPAM
Delf wrote:

Et quand j'execute, NetBeans me demande un return la ou je l'ai indique
entre commentaire alors qu'il est completement inutile! Comment contrer
ceci ? Pt'tre que j'ai mal code ma fonction...


Bon, j'ai un problème analogue, sans erreur à la compil. Ce qui se passe
est que je n'ai pas de valeur retournée.

la classe appellée :

<code>
public class VinePlantNewest extends DefaultSortedTableModel {
/**
* Run the application
*/
public DefaultSortedTableModel VinePlantNewest() {

try {

SortedTableColumn[] columns = {

new
DefaultSortedTableColumn("Description",

Row.class.getDeclaredMethod("getDescription", null),

Row.class.getDeclaredMethod("setDescription",

new Class[]{String.class})),
new
DefaultSortedTableColumn("Synonymes",

Row.class.getDeclaredMethod("getSynonymes", null),

Row.class.getDeclaredMethod("setSynonymes",

new Class[]{String.class})),
new DefaultSortedTableColumn("Origine",

Row.class.getDeclaredMethod("getOrigine", null),

Row.class.getDeclaredMethod("setOrigine",

new Class[]{String.class})),
new DefaultSortedTableColumn("Notes",

Row.class.getDeclaredMethod("getNotes", null),

Row.class.getDeclaredMethod("setNotes",

new Class[]{String.class}))};


String[] fields = {"vp_desc", "vp_syn",
"vp_orig", "vp_notes"};
DBManager dbm = new
DBManager("org.hsqldb.jdbcDriver",

"jdbc:hsqldb:file:data/macave",
"yvon",
"yvon5533");
dbm.setOrderBy("vp_desc");
List bdrows dbm.getTableDatasFields("t_vine_plant_vp", fields);

List rows = new ArrayList();

for (int ir = 0; ir < bdrows.size(); ir++) {
List row = (List)bdrows.get(ir);
rows.add( new Row((String)row.get(0),
(String)row.get(1), (String)row.get(2), (String)row.get(3)));
}

final DefaultSortedTableModel model = new
DefaultSortedTableModel(columns, rows);

return model;
}
catch (Exception e) {
e.printStackTrace();
System.exit(-1);
return null;
}
}

/**
* Definds a row
* @author yvonthor
*/
public static class Row {

private String mDescription;
private String mSynonymes;
private String mOrigine;
private String mNotes;

/**
* Constructs
* @param pDescription the row description
* @param pSynonymes the row Synonymes
* @param pOrigine the row Origine
* @param pNotes the row Notes
*/

public Row(String pDescription, String pSynonymes,
String pOrigine, String pNotes) {
mDescription = pDescription;
mSynonymes = pSynonymes;
mOrigine = pOrigine;
mNotes = pNotes;
}

/**
* Gets the description
* @return String the description
*/
public String getDescription() {
return mDescription;
}

etc... tous les setters et getters...
}
}
</code>

la classe appellante :

<code>
public class MaCave {
/**
* Run the application
*/
public static void main(String[] pArgs) {

DefaultSortedTableModel model = new VinePlantNewest();

JFrame frame = new JFrame();
final SortedTable view = new SortedTable(model);
view.setMakeIndex(true);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JScrollPane(view),
BorderLayout.CENTER);

frame.getContentPane().add(new ToolBarTables(),
BorderLayout.NORTH);

frame.getContentPane().add(new ToolBarManage(),
BorderLayout.EAST);

frame.pack();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.validate();
frame.setVisible(true);
}
}
</code>

Ce qui se passe : pas d'erreurs à la compil, j'ai bien une JTable mais
d'une seule colonne et vide...

Les deux classes précédentes sont extraites d'une seule classe
VinePlantNew qui faisait tout le boulot, j'ai cassé entre l'obtention du
model pour ma JTable (+ requête sql) et la présentation du résultat dans
une frame car j'ai d'autres tables sorties (Bottles, Appellations,
Address...)

La classe VinePlantNew qui fait tout toute seule et qui marche bien :
<code>
public class VinePlantNew {
/**
* Run the application
* @param pArgs the arguments
*/
public static void main(String[] pArgs) {
try {
SortedTableColumn[] columns = {

new DefaultSortedTableColumn("Description",
Row.class.getDeclaredMethod("getDescription", null), Row.class
.getDeclaredMethod("setDescription", new
Class[]{String.class})),
new DefaultSortedTableColumn("Synonymes",
Row.class.getDeclaredMethod("getSynonymes", null), Row.class
.getDeclaredMethod("setSynonymes", new
Class[]{String.class})),
new DefaultSortedTableColumn("Origine",
Row.class.getDeclaredMethod("getOrigine", null), Row.class
.getDeclaredMethod("setOrigine", new
Class[]{String.class})),
new DefaultSortedTableColumn("Notes",
Row.class.getDeclaredMethod("getNotes", null), Row.class
.getDeclaredMethod("setNotes", new
Class[]{String.class}))};


String[] fields = {"vp_desc", "vp_syn", "vp_orig", "vp_notes"};
DBManager dbm = new DBManager("org.hsqldb.jdbcDriver",
"jdbc:hsqldb:file:data/macave", "yvon", "yvon5533");
dbm.setOrderBy("vp_desc");
List bdrows = dbm.getTableDatasFields("t_vine_plant_vp",
fields);

List rows = new ArrayList();

for (int ir = 0; ir < bdrows.size(); ir++) {
List row = (List)bdrows.get(ir);
rows.add( new Row((String)row.get(0),
(String)row.get(1), (String)row.get(2), (String)row.get(3)));
}

final DefaultSortedTableModel model = new
DefaultSortedTableModel(columns, rows);

JFrame frame = new JFrame();
JPanel panelSearch = new JPanel();
final SortedTable view = new SortedTable(model);
view.setMakeIndex(true);
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().add(new JScrollPane(view),
BorderLayout.CENTER);
frame.getContentPane().add(new ToolBarTables(),
BorderLayout.NORTH);
frame.getContentPane().add(new ToolBarManage(),
BorderLayout.EAST);
frame.pack();
frame.setSize(600, 400);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.validate();
frame.setVisible(true);
}
catch (Exception e) {
e.printStackTrace();
System.exit(-1);
}
}

/**
* Definds a row
* @author yvonthor
*/
public static class Row {
private String mDescription;
private String mSynonymes;
private String mOrigine;
private String mNotes;

/**
* Constructs
* @param pDescription the row description
* @param pSynonymes the row Synonymes
* @param pOrigine the row Origine
* @param pNotes the row Notes
*/
public Row(String pDescription, String pSynonymes, String pOrigine,
String pNotes) {
mDescription = pDescription;
mSynonymes = pSynonymes;
mOrigine = pOrigine;
mNotes = pNotes;
}

/**
* Gets the description
* @return String the description
*/
public String getDescription() {
return mDescription;
}

[tous les autres setters et getters]
}
}
</code>

Voila, si quelqu'un peut m'expliquer pourquoi je me retrouve avec une
JTable vide, mon model n'est pas vide car un :

System.out.println(model.toString()); me donne :



C'est sans doute une erreur très bête, je suis un newbie et de + étourdi
...
--
yt

Avatar
vc.spam
(Yvon Thoraval) wrote in message news:<1gklbuu.i1t0typjrychN%...
julien wrote:

le plus simple etant d'utiliser
e.Printstacktrace() si mes souvenir sont bon
ou si tu prefere faire un system.err.println("exception ....)
cela permet par la suite de rediriger la sortie d'erreur vers un journal
d'erreur plutot que de tout afficher sur la sortie standard.


comment fait-on après avoir fait ces system.err.println("exception ....)
pour envoyer ça sur un fichier de log ?


Package: java.lang
Class: System
Function: static void setErr(PrintStream err)
Reassigns the "standard" error output stream.

Tu crées une instance de PrintStream qui pointe sur ton fichier de log
et tu l'utilise avec la fonciton ci-dessus...

Voilà


Avatar
yvon.thoravalNO-SPAM
Vince44 wrote:

Package: java.lang
Class: System
Function: static void setErr(PrintStream err)
Reassigns the "standard" error output stream.

Tu crées une instance de PrintStream qui pointe sur ton fichier de log
et tu l'utilise avec la fonciton ci-dessus...


Cristal clear, merci beaucoup !
--
yt

Avatar
Delf
ZeGrunt wrote:

Mais parce que tu as annoncé que tu allais le faire dans le profile de
la méthode.
Il faut bien comprendre que le 'catch' est le point de reprise de
l'exécution en cas de levée dans le bloc 'try' de l'exeption spécifiée.
Une fois le 'catch' executé, la méthode continue juste après le bloc
'try-catch-finally' (sauf s'il y a un 'throw' ou un 'return' dans le
'catch' ou dans le 'finally', bien sûr).

Par conséquent, comme la méthode continue normalement, il faut qu'elle
respecte son contrat càd retourne un boolean.


Ok, tout devient clair à present.

Quant à la question sur les logs, il y a différentes façons de faire :
soit créer un flux de sortie soi-même, soit écrire sur System.err et
faire une redirection sur la ligne de commande (java MaClass 2>
error.log avec un bash sous Linux/Unix).


Ok.
Merci bcp.

--
Delf

Avatar
julien
oups on a tous repondu en meme temp lol

bon pour fini je dirais que vu ton code le mieux c'est effectivement de
definir ta propre exception du genre peuxpasloggerException
de faire en sorte que ta methode la propage (public blabla blabla throws
peuxpasloggerException { )
ensuite tu fais ton bloc try{}catch Exception e{
et la premiere chose tu fais un petit e.printStackTrace()
ensuite tu leve ton exception a toi throw new peuxpasloggerException(e) ...
(ici si c'est possible construit ta nouvelle exception en prenant l'ancienne
en parametre ca te permettera de remonter plus loin dans la cause de
l'erreur par la suite

par la suite qd tu feras appel a ta methode tu le feras ds un try catch qui
te permetteras de gerer le fait que tu puisse pas obtenir de resultat.

la creation de nouvelle exception et les try catch partout peuvent paraitre
fastidieux au début mais tu seras tres heureux de les avoir fais une foi
arrivé au debuggage ;)
Avatar
jocelyn
Salut,

Juste un petit post pour dire qu'il existe des outils de logging comme log4j
qui fonctionnent tres bien,
qui sont aisément configurables et qui évitent:
- de polluer le code de ton appli
- de réinventer la roue

cf les cahiers du programmeur java 2 ou j'ai decouvert ca...

--
Celui qui lutte contre des monstres doit prendre garde, dans le combat, à ne
pas devenir un monstre lui-même

"Yvon Thoraval" a écrit dans le message news:
1gkm71g.a9kjxn1axwfc8N%
Vince44 wrote:

Package: java.lang
Class: System
Function: static void setErr(PrintStream err)
Reassigns the "standard" error output stream.

Tu crées une instance de PrintStream qui pointe sur ton fichier de log
et tu l'utilise avec la fonciton ci-dessus...


Cristal clear, merci beaucoup !
--
yt



1 2