Mon problème est que je dois définir une variable dans une instruction try sinon j'obtiens une erreur de compilation.Comment éviter de définir une variable dans une instruction try
Plus tard, j'ai besoin d'utiliser cette variable, mais il est maintenant hors de la portée, ou du moins je crois. J'initialise la variable en dehors de l'instruction try et la mets à zéro, je pensais qu'elle pourrait alors être accessible à l'extérieur, mais je reçois quand même un NullPointerException
.
Le code est ci-dessous, avec beaucoup de sorties pour faciliter la lecture - Je sais que c'est un mauvais code, mais je suis nouveau avec Servlets et je voulais juste le voir fonctionner avec toutes les parties mobiles .
J'ai créé une autre classe qui appelle createDocs (...) et transmet les paramètres requis, et cela fonctionne correctement. Donc, cela me rend curieux de savoir pourquoi quand j'appelle rs.getString("name")
, je reçois le NullPointerException
, car c'est exactement ce que je fais de l'autre classe (exécution d'une méthode principale pour plus de commodité) et cela fonctionne comme prévu.
La variable en question est la variable ResultSet "rs" -
public class AgReportServlet extends HttpServlet {
private static final long serialVersionUID = 1L;
public AgReportServlet() {
super();
}
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ResultSet rs = null;
try {
rs = docs.getDocs(con, start, end, zone, locality);
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (InstantiationException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (IllegalAccessException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
response.setContentType("text/xml");
PrintWriter out = response.getWriter();
out.println("<!DOCTYPE html PUBLIC \"-//W3C//DTD XHTML 1.0 Transitional//EN\" \"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd\">\n" +
out.println(
"<table border=\"0\" cellspacing=\"0\" cellpadding=\"6\">\n");
// I have a resultset object need to iterate through it to display the file names
try {
while (rs.next()) { // page through the result set
out.println(
" <tr>\n" +
" <td>: " + rs.getString("name") + "</td>\n" +
" </tr>\n"
);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
out.println(
"</table></body>\n" +
"</html>"
);
out.flush();
out.close();
}
}
Vous vous rendez compte que le code semble avoir une vulnérabilité XSS stockée? –
Je pense que le vrai problème est qu'après une exception est levée, vous continuez comme si rien ne se passait.Si vous lancez une exception ou renvoyez une erreur, vous n'aurez pas à définir rs. Note: Où va la trace de la pile, l'utilisateur ne la verra pas. Il peut être plus convivial de laisser l'utilisateur savoir qu'une erreur s'est produite. –