Не удается найти место для вставки блока finally, чтобы избавиться от ошибки. Вставьте параметр Final для завершения TryStatement - PullRequest
0 голосов
/ 17 ноября 2011

Я пробовал несколько мест, чтобы вставить блок finally, но независимо от того, что я пробую, он в итоге ухудшает код.

Вот мой код, 4-ая заключительная фигурная скобка - та, которая дает мне ошибку. Есть мысли?


    package com.tunestore.action;</p>

    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;

                    }
                }
            }
        }
    }

Ответы [ 2 ]

4 голосов
/ 17 ноября 2011

Эта скобка - это место, где заканчивается ваш внешний блок try.У него нет блока catch и блока finally, поэтому вы получаете сообщение об ошибке.Просто добавьте один или другой сразу после скобки или удалите try, если он не нужен.

0 голосов
/ 17 ноября 2011

У вас есть только один блок catch, но две попытки.Добавьте блок catch для первого try-catch, и ваша проблема должна быть решена.

Редактировать: Почему вы сначала вкладываете try-catch?Я не верю, что в этом есть необходимость.

...