当前位置: 首页 > 面试题库 >

如何避免在try语句中设置变量

淳于功
2023-03-14
问题内容

我的问题是我必须在try语句中设置变量,否则会出现编译错误。

稍后我需要使用该变量,但现在超出了范围,所以我相信。我在try语句外部初始化了该变量并将其设置为null,我以为可以在外部访问它,但仍然得到了NullPointerException

下面的代码,其中有很多代码使阅读变得更容易-我知道这是不好的代码,但是我是Servlets的新手,只想看看它与所有活动部件一起运行时应如何工作。

我创建了另一个类,该类调用createDocs(…)并传递所需的参数,并且工作正常。因此,这使我好奇为什么调用该函数时rs.getString("name")会得到NullPointerException,因为这正是我在另一个类中所做的(为方便起见从main方法运行),并且按预期运行。

有问题的变量是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();
    }
}

问题答案:

您的问题是,如果此语句:

rs = docs.getDocs(con, start, end, zone, locality);

抛出异常,则rs的值仍然是null。所以我要做的是将循环移动到同一try-catch块中。另外,您可以在尝试使用它之前检查它是否仍然为空。

在try-catch块之外将值设置为null并不是不好的代码。如果要将rs变量放在try块之外(并且包括在catch子句之一中),则只需要这样做。您的rs
while循环可能应该只在同一try块内。



 类似资料:
  • 问题内容: 在确定文件是否存在时,使用try语句如何避免“竞争条件”? 我之所以这样问是因为高度支持的答案0)(更新:已删除)似乎暗示使用会创造机会,否则这种机会就不会存在。 给出的示例是: 但与以下内容相比,我不了解如何避免出现竞争状况: 调用如何使攻击者能够处理他们无法完成的文件? 问题答案: 比赛条件,当然,你的程序和文件上运行一些其他的代码之间(竞争状态总是需要至少两个平行的进程或线程,看

  • 我如何避免在这里过度使用试捕?我如何简化裁员

  • 问题内容: 如何在执行Update语句时设置变量?我似乎无法弄清楚语法。 所以我想要下面这样的东西,但是它说语法是错误的: 问题答案: 这个有可能 :- 设置整数(不递增)

  • 需要在一个PDF文件中导出所有的表单,所以我找到了这段代码,它工作(导出一个单PDF,每个表单有一页)。但是我不想使用select/active语句,我更喜欢使用存储对象的变量。 问题:在这段代码中如何避免select/ActiveSheet?

  • 我希望我的 print 语句在循环之外,这样语句就不会一遍又一遍地打印相同的内容。下面的 for 循环只是将一个数组中的数字与另一个数组进行对比,以找出找到多少个匹配项。定义上面的变量并打印下面的语句会导致“变量未初始化错误”,这是可以理解的。