2011-11-17 2 views
0

J'ai essayé plusieurs endroits pour insérer le bloc finally, mais peu importe ce que j'essaie, cela finit par empirer le code.Impossible de trouver un endroit pour insérer le bloc finally pour se débarrasser de l'erreur: Insert Enfin pour terminer TryStatement

Voici mon code, le 4ème à dernier accolade de fin est celui qui me donne l'erreur. Des pensées?


    package com.tunestore.action;

import java.io.InputStream; import java.sql.Connection; import java.sql.DriverManager; import java.sql.ResultSet; import java.sql.PreparedStatement; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.apache.commons.logging.Log; import org.apache.commons.logging.LogFactory; import org.apache.struts.action.Action; import org.apache.struts.action.ActionForm; import org.apache.struts.action.ActionForward; import org.apache.struts.action.ActionMapping; import org.apache.struts.action.ActionMessage; import org.apache.struts.action.ActionMessages; import org.apache.struts.action.DynaActionForm; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; import org.owasp.validator.html.*; import org.owasp.esapi.*; public class DownloadAction extends Action { private static final Log log = LogFactory.getLog(DownloadAction.class); public static String DB_URL; static { if (System.getProperty("tunestore.db.location") != null) { DB_URL = "jdbc:derby://localhost:1527/" + System.getProperty("tunestore.db.location"); } else { DB_URL = "jdbc:derby://localhost:1527/" + System.getProperty("user.home") + "/.tunestore"; } System.setProperty("jdbc.tunestore.url", DB_URL); } public static Connection getConnection() throws Exception { log.info("Opening database at " + DB_URL); Class.forName("org.apache.derby.jdbc.ClientDriver").newInstance(); Connection conn = DriverManager.getConnection(DB_URL); return conn; } public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { DynaActionForm daf = (DynaActionForm)form; String user = (String)request.getSession(true).getAttribute("USERNAME"); if(user != null) { Connection conn = null; try { conn = DownloadAction.getConnection(); String sql2 = "SELECT ID FROM CD WHERE CD.BITS = ?"; PreparedStatement stmt2 = conn.prepareStatement(sql2); stmt2.setString(1, request.getParameter("cd")); ResultSet rs2 = stmt2.executeQuery(); rs2.next(); String sql = "SELECT COUNT(*) " + "FROM TUNEUSER_CD " + "WHERE TUNEUSER_CD.TUNEUSER = ? AND TUNEUSER_CD.CD = ?"; PreparedStatement stmt = conn.prepareStatement(sql); stmt.setString(1, user); stmt.setInt(2, rs2.getInt(1)); ResultSet rs = stmt.executeQuery(); rs.next(); int owned = rs.getInt(1); if(owned == 1) { try { // Try to open the stream first - if there's a goof, it'll be here InputStream is = this.getServlet().getServletContext().getResourceAsStream("/WEB-INF/bits/" + request.getParameter("cd")); if (is != null) { response.setContentType("audio/mpeg"); response.setHeader("Content-disposition", "attachment; filename=" + daf.getString("cd")); byte[] buff = new byte[4096]; int bread = 0; while ((bread = is.read(buff)) >= 0) { response.getOutputStream().write(buff, 0, bread); } } else { ActionMessages errors = getErrors(request); errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("download.error")); saveErrors(request, errors); return mapping.findForward("error"); } } catch (Exception e) { e.printStackTrace(); ActionMessages errors = getErrors(request); errors.add(ActionMessages.GLOBAL_MESSAGE, new ActionMessage("download.error")); saveErrors(request, errors); return mapping.findForward("error"); } return null; } } } } }
+0

Vous pouvez utiliser un 'try-catch'. Pourquoi imbriquez-vous 'try-catch'? –

+0

Je n'ai pas écrit le code. C'est un site Web qui doit être piraté comme un exercice d'apprentissage. On m'a donné du code supplémentaire à insérer pour corriger certains des problèmes de sécurité, mais quand je le fais, il me reste les erreurs que j'ai décrites. – Turk

Répondre

4

Ce support est l'endroit où vos extrémités bloc try extérieures. Il n'a aucun bloc catch et aucun bloc finally, donc vous obtenez une erreur. Ajoutez simplement l'un ou l'autre immédiatement après la parenthèse, ou enlevez le try si ce n'est pas nécessaire.

+0

@Fujin: c'est parce qu'un essai sans accroche ni finalement n'a pas de sens. Try/catch est: "si l'essai déclenche une exception, faites ceci". Essayez/enfin est "si l'essai soulève une exception, faites le finalement de toute façon" – helios

0

Vous avez seulement un bloc catch, mais deux trys. Ajouter un bloc catch pour le premier try-catch et vous devriez avoir votre problème résolu.

Éditer: Pourquoi imbriquez-vous d'abord l'essayage? Je ne crois pas qu'il soit nécessaire de le faire.

+0

Je n'ai pas écrit le code. C'est un site Web qui doit être piraté comme un exercice d'apprentissage. On m'a donné du code supplémentaire à insérer pour corriger certains des problèmes de sécurité, mais quand je le fais, il me reste les erreurs que j'ai décrites. – Turk

Questions connexes