2011-11-17 21 views
0

我已經嘗試了幾個插入finally塊的位置,但無論我嘗試什麼,都會導致代碼變得更糟。找不到地方插入finally塊來擺脫錯誤:插入最後完成TryStatement

這是我的代碼,第4個到最後的結束大括號是給我的錯誤。有什麼想法嗎?


    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

您可以使用一個'try-catch'。你爲什麼嵌套try-catch? –

+0

我沒有寫代碼。這是一個網站,它的目的是作爲一種學習練習被入侵。我被給了額外的代碼來插入來糾正一些安全問題,但是當我這樣做時,我留下了我描述的錯誤。 – Turk

回答

4

即支架是你的外try塊結束的位置。它沒有catch塊,也沒有finally塊,所以你會得到一個錯誤。只需在支架後立即添加一個或另一個,或者如果不需要,請移除try

+0

@Fujin:這是因爲一個沒有抓住的嘗試,也沒有最終沒有意義。 Try/catch是:「如果嘗試引發異常,請執行此操作」。嘗試/最後是「如果嘗試引發異常,終於做到了」 – helios

0

您只有一個catch塊,但有兩個trys。爲第一次嘗試抓住添加一個catch塊,你應該解決你的問題。

編輯:你爲什麼在第一個地方嵌套try-catch?我不認爲有必要這樣做。

+0

我沒有寫代碼。這是一個網站,它的目的是作爲一種學習練習被入侵。我被給了額外的代碼來插入來糾正一些安全問題,但是當我這樣做時,我留下了我描述的錯誤。 – Turk

相關問題