Java Servlet在为doGet()调用存储过程引发异常时出错
有人知道如何修复以下错误吗Java Servlet在为doGet()调用存储过程引发异常时出错,java,database,servlets,Java,Database,Servlets,有人知道如何修复以下错误吗 未报告的异常javax.naming.NamingException;必须被抓住或宣布被抛出 Context Context=新的InitialContext() Auth.java:46:未报告的异常java.sql.SQLException;必须捕获或声明为抛出conn=ds.getConnection() 我从这个JavaServlet中得到了什么 import javax.servlet.http.HttpServlet; import javax.servl
未报告的异常javax.naming.NamingException;必须被抓住或宣布被抛出
Context Context=新的InitialContext()代码>
Auth.java:46:未报告的异常java.sql.SQLException;必须捕获或声明为抛出conn=ds.getConnection()代码>
我从这个JavaServlet中得到了什么
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import java.io.IOException;
import java.io.PrintWriter;
import java.sql.*;
import javax.sql.DataSource;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import java.sql.SQLException;
import oracle.jdbc.OracleTypes;
public class ABC extends HttpServlet {
@Override
public void init(ServletConfig config) throws ServletException {
super.init(config);
}
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws ServletException, IOException {
Connection conn;
CallableStatement cs;
String xy = req.getParameter("xy");
String zz = req.getParameter("zz");
// call stored procedure
Context context = new InitialContext();
DataSource ds = (DataSource)context.lookup("jdbc/mypool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call mysproc (?,?)}" );
cs.setString(1, xy);
cs.setString(2, zz);
cs.execute();
if ( conn != null ) {
try { conn.close(); } catch ( Exception ex ) {}
conn = null;
}
// Set the content type (MIME Type) of the response.
res.setContentType("text/html");
// Write the HTML to the response
PrintWriter out = res.getWriter();
out.println("<html>");
out.println("<head>");
out.println("<title>my title</title>");
out.println("</head>");
out.println("<body>");
out.println("<h2>my header</h2>");
out.println("my body text<br/>");
out.println("</body>);
out.println("</html>");
out.flush();
out.close();
}
public void destroy() {
}
}
与
或
它们都会产生错误,说我不能重写doGet,因为被重写的方法不会抛出Exception、SQLException或NamingException 你说得对。不能将异常添加到被重写方法的throws
子句中
相反,将有问题的语句放在try
/catch
块中,并处理错误。如果没有其他内容,您可以将它们作为ServletException
重新播放。例如:
Context context;
try {
context = new InitialContext();
}
catch (NamingException e) {
throw new ServletException(e);
}
你说得对。不能将异常添加到被重写方法的throws
子句中
相反,将有问题的语句放在try
/catch
块中,并处理错误。如果没有其他内容,您可以将它们作为ServletException
重新播放。例如:
Context context;
try {
context = new InitialContext();
}
catch (NamingException e) {
throw new ServletException(e);
}
抛出选中的异常NamingException
,应该捕获该异常,或者使用此代码的方法应该有一个与之关联的throws子句
因为您正在扩展和重写方法,所以不能附加新的checked异常,因为这违反了Java中的重写规则
而是将代码放在try-catch块中,然后catchNamingException
所以不是
Context context = new InitialContext();
替换为
Context context = null;
try {
context = new InitialContext();
} catch(NamingException exp){
//Handle Exception
}
类似地,抛出一个应捕获或重新捕获的选中异常SQLException
,再次,您不能向doGet方法添加新的选中异常,因为重写规则必须显式捕获它
try {
DataSource ds = (DataSource)context.lookup("jdbc/mypool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call mysproc (?,?)}" );
cs.setString(1, xy);
cs.setString(2, zz);
cs.execute();
} catch ( SQLException exp ) {
//Handle your exception
} finally {
if (conn != null ) {
try {
conn.close();
} catch(SQLException sqlExp){
// Handle your exception
}
conn = null;
}
}
Java中的重写规则:
- 争论决不能改变
- 除了协变(子类型)返回之外,返回类型不能更改
- 例外情况可以减少/消除。不得抛出新的/更广泛的已检查异常
- 访问权限不得更严格。可以减少限制
- 在运行时调用哪个方法取决于对象类型
抛出一个选中的异常NamingException
,应该捕获该异常,或者使用该代码的方法应该有一个与之关联的throws子句
因为您正在扩展和重写方法,所以不能附加新的checked异常,因为这违反了Java中的重写规则
而是将代码放在try-catch块中,然后catchNamingException
所以不是
Context context = new InitialContext();
替换为
Context context = null;
try {
context = new InitialContext();
} catch(NamingException exp){
//Handle Exception
}
类似地,抛出一个应捕获或重新捕获的选中异常SQLException
,再次,您不能向doGet方法添加新的选中异常,因为重写规则必须显式捕获它
try {
DataSource ds = (DataSource)context.lookup("jdbc/mypool");
conn = ds.getConnection();
cs = conn.prepareCall( "{call mysproc (?,?)}" );
cs.setString(1, xy);
cs.setString(2, zz);
cs.execute();
} catch ( SQLException exp ) {
//Handle your exception
} finally {
if (conn != null ) {
try {
conn.close();
} catch(SQLException sqlExp){
// Handle your exception
}
conn = null;
}
}
Java中的重写规则:
- 争论决不能改变
- 除了协变(子类型)返回之外,返回类型不能更改
- 例外情况可以减少/消除。不得抛出新的/更广泛的已检查异常
- 访问权限不得更严格。可以减少限制
- 在运行时调用哪个方法取决于对象类型
用@mprabhat&@quantummechanical给出的try-catch包装SQL代码是最好的方法
如果你想知道为什么你不能
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws Exception {
或
。。这是因为当您重写一个方法时,有两件重要的事情需要记住
- 重写方法可以有一个更自由的访问器。。示例:如果超类方法声明为
受保护的int-add(…)
,则可以使用公共int-add(…)
进行重写,反之则不可能
- 重写方法必须声明超类异常的相同或子类型。。例如如果超类方法声明为
public int add(),抛出IllegalArgumentException
,则重写方法可以具有以下语法public int add()抛出NumberFormatException
,但它不能有更广泛的语法,如public int add()抛出Exception
谢谢大家没有投反对票 用@mprabhat&@quantummechanical给出的try-catch包装SQL代码是最好的方法
如果你想知道为什么你不能
protected void doGet(HttpServletRequest req, HttpServletResponse res)
throws Exception {
或
。。这是因为当您重写一个方法时,有两件重要的事情需要记住
- 重写方法可以有一个更自由的访问器。。示例:如果超类方法声明为
受保护的int-add(…)
,则可以使用公共int-add(…)
进行重写,反之则不可能
- 重写方法必须声明超类异常的相同或子类型。。例如如果超类方法声明为
public int add(),抛出IllegalArgumentException
,则重写方法可以具有以下语法public int add()抛出NumberFormatException
,但它不能有更广泛的语法,如public int add()抛出Exception
谢谢大家没有投反对票 感谢QuantumMechanical,异常处理特别有用。感谢QuantumMechanical,异常处理特别有用。感谢mprabhat在您的回答中如此完整。这很有帮助!谢谢你的回答如此完整。这很有帮助!