java try中的return语句_关于java:try和Final给出没有return语句的异常,但是在方法中编写return语句时也没有异常...

请解释为什么异常出现在第一个程序中而不是第二个程序中。

1)在read方法中没有return语句

class Example

{

public static void read()

{

try

{

int i = 9/0;

}

finally

{

System.out.println("This proogram is giving exception");

}

}

public static void main(String[] fel)

{

read();

}

}

2)在读取方法中使用return语句

class Example

{

public static void read()

{

try

{

int i = 9/0;

}

finally

{

System.out.println("This proogram is not giving exception");

return;

}

}

public static void main(String[] fel)

{

read();

}

}

请添加适当的语言标签

java的可能吗? 请编辑您的问题并添加合适的语言标签。

请包括异常stacktrace

return语句将覆盖引发的异常。 不要将return语句放在finally块中。

原因是在Java语言规范规则中规定了try / finally块执行的规则。实质上

如果try块抛出异常E,并且最终正常完成,则总体try / finally抛出E

如果try块抛出E,但finally未能正常完成,则E会被忽略,并且由于try最终导致的总try / finally"突然完成"

显式的return被认为是突然的,而不是正常的完成,因此在示例2中,final内部的返回将掩盖try引发的被零除的异常。

因此,在第二个程序中,JVM不会停止运行吗?

最终不应该在内部使用分支语句(return,goto),因为执行此类语句会使最终之前执行的其他指令无效。

Java语言规范说:如果try块的执行由于任何其他原因R突然完成,那么将执行finally块,然后可以选择:

如果finally块正常完成,则try语句由于原因R突然完成。

如果final块由于原因S突然完成,则try语句由于原因S突然完成(并且原因R被丢弃)。

注意-在finally块内的return语句将导致在try或catch块中引发的任何异常都将被丢弃。

因此,在第二个程序中,JVM不会停止运行吗?

在这两种情况下,代码都抛出java.lang.ArithmeticException,但是finally中的return丢弃该异常,并且方法退出而没有将异常转发给调用方。

这就是为什么通常不应该在finally块中使用return的原因之一。

Java语言规范(8),try-finally和try-catch-finally的14.20.2执行中对此进行了描述:

If execution of the try block completes abruptly because of a throw of

a value V, then there is a choice:

... (some similar but for this case irrelevant rules left out)

If the run-time type of V is not assignment compatible with a catchable exception class of any catch clause of the try statement, then the finally block is executed. Then there is a choice:

If the finally block completes normally, then the try statement completes abruptly because of a throw of the value V.

If the finally block completes abruptly for reason S, then the try statement completes abruptly for reason S (and the throw of value V is discarded and forgotten).

您可以在JLS 14.1语句的正常完成和异常完成中找到突然完成和正常完成的定义。但是基本上return被认为是突然完成。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一个使用原生 JDBC 连接 MySQL 数据库并执行 SQL 语句返回结果集的 Java 工具类示例。请注意,为了避免在 JSP 直接使用 Java 代码,这个示例使用了 Servlet 作为控制器,用于接收 JSP 页面传来的参数和返回结果。 ```java import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import java.util.ArrayList; import java.util.List; public class JdbcUtils { // 数据库连接信息 private static final String URL = "jdbc:mysql://localhost:3306/database_name"; private static final String USER = "username"; private static final String PASSWORD = "password"; /** * 获取数据库连接 */ public static Connection getConnection() throws SQLException { return DriverManager.getConnection(URL, USER, PASSWORD); } /** * 执行 SQL 查询语句,返回结果集 */ public static List<Object[]> executeQuery(String sql, Object... params) throws SQLException { List<Object[]> resultList = new ArrayList<>(); try (Connection conn = getConnection(); PreparedStatement ps = conn.prepareStatement(sql)) { // 设置查询参数 for (int i = 0; i < params.length; i++) { ps.setObject(i + 1, params[i]); } // 执行查询并获取结果集 try (ResultSet rs = ps.executeQuery()) { int columnCount = rs.getMetaData().getColumnCount(); while (rs.next()) { Object[] row = new Object[columnCount]; for (int i = 0; i < columnCount; i++) { row[i] = rs.getObject(i + 1); } resultList.add(row); } } } return resultList; } } ``` 你可以在你的 JSP 项目使用这个工具类,例如在 Servlet 调用 `executeQuery` 方法执行 SQL 查询并将结果集传递到 JSP 页面: ```java import java.io.IOException; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class QueryServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String sql = "SELECT * FROM table_name WHERE column_name = ?"; String param = request.getParameter("param"); try { List<Object[]> resultList = JdbcUtils.executeQuery(sql, param); request.setAttribute("resultList", resultList); request.getRequestDispatcher("result.jsp").forward(request, response); } catch (Exception e) { e.printStackTrace(); response.getWriter().println("查询失败:" + e.getMessage()); } } } ``` 在 `result.jsp` 页面,你可以使用 JSTL 标签库或者 EL 表达式展示查询结果: ```html <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %> <table> <thead> <tr> <th>Column 1</th> <th>Column 2</th> <th>Column 3</th> </tr> </thead> <tbody> <c:forEach items="${resultList}" var="row"> <tr> <td>${row[0]}</td> <td>${row[1]}</td> <td>${row[2]}</td> </tr> </c:forEach> </tbody> </table> ``` 这个示例使用了 JSTL 的 `<c:forEach>` 标签循环遍历查询结果集,并使用 EL 表达式 `${row[index]}` 获取每行每列的数据。请注意,这个示例没有对 SQL 语句和参数进行校验和过滤,你需要根据自己的需要添加这些安全措施。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值