Java 为什么构造函数会在一个类中捕获异常,而不是在另一个类中捕获异常?
就像我说的,伙计们,只需要知道为什么会出现异常。在下面的Javaservlet中调用SQLUtil会导致异常,但在我测试的任何其他类中都不会发生 我正在做一个学校项目,试图将一个SQL表放入一个输出html的servlet中,我知道。在这件事上我没有太多选择。为此,我使用DAO对象导入信息并将其转换为列表。然而,导入该对象似乎只在我的标准java类中起作用,而在servlet中则不起作用,因为servlet捕获了一个异常。这是所有的代码,很抱歉有点可笑 DAO,SQLUtilJava 为什么构造函数会在一个类中捕获异常,而不是在另一个类中捕获异常?,java,Java,就像我说的,伙计们,只需要知道为什么会出现异常。在下面的Javaservlet中调用SQLUtil会导致异常,但在我测试的任何其他类中都不会发生 我正在做一个学校项目,试图将一个SQL表放入一个输出html的servlet中,我知道。在这件事上我没有太多选择。为此,我使用DAO对象导入信息并将其转换为列表。然而,导入该对象似乎只在我的标准java类中起作用,而在servlet中则不起作用,因为servlet捕获了一个异常。这是所有的代码,很抱歉有点可笑 DAO,SQLUtil package s
package sqlUtil;
import java.sql.*;
import java.util.*;
import java.io.*;
import sqlUtil.VideoRecording;
public class SQLUtil {
private Connection myConn;
public SQLUtil() throws Exception
{
// get db properties
Properties props = new Properties();
props.load(new FileInputStream("proj.properties"));
String user = props.getProperty("user");
String password = props.getProperty("password");
String dburl = props.getProperty("dburl");
// connect to database
myConn = DriverManager.getConnection(dburl, user, password);
}
public List<VideoRecording> getAllVideos() throws Exception
{
List<VideoRecording> list = new ArrayList<>();
Statement myStmt = null;
ResultSet myRs = null;
try
{
myStmt = myConn.createStatement();
myRs = myStmt.executeQuery("select * from Video_Recordings");
while(myRs.next())
{
VideoRecording tempRecording = convertRowToVideoRecording(myRs);
list.add(tempRecording);
}
return list;
}
finally{
close(myStmt,myRs);
}
}
private VideoRecording convertRowToVideoRecording(ResultSet myRs) throws SQLException
{
int recording_id = myRs.getInt("recording_id");
String director = myRs.getString("director");
String title = myRs.getString("title");
String category = myRs.getString("category");
String image_name = myRs.getString("image_name");
int duration = myRs.getInt("duration");
String rating = myRs.getString("rating");
int year_released = myRs.getInt("year_released");
double price = myRs.getDouble("price");
int stock_count = myRs.getInt("stock_count");
VideoRecording tempVideo = new VideoRecording(recording_id, director, title, category, image_name, duration, rating, year_released, price, stock_count);
return tempVideo;
}
private static void close(Connection myConn, Statement myStmt, ResultSet myRs)
throws SQLException {
if (myRs != null) {
myRs.close();
}
if (myStmt != null) {
}
if (myConn != null) {
myConn.close();
}
}
private void close(Statement myStmt, ResultSet myRs) throws SQLException {
close(null, myStmt, myRs);
}
}
以及它所在的班级:
package sqlUtil;
import java.util.*;
public class TestUtil {
/**
* @param args
*/
public static void main(String[] args)
{
try{
VideoRecording test = new VideoRecording(1, "directordave", "titletest","categorytest","imagenametest",12,"Ratingtest",1995,21.2,21);
System.out.println(test.getCategory());
SQLUtil util = new SQLUtil();
List<VideoRecording> testList = util.getAllVideos();
System.out.println(testList.size());
System.out.println(testList.get(0).getId());
}
catch(Exception exc)
{
System.out.println("failure");
}
}
}
以及它不工作的servlet类:
@WebServlet("/videos")
public class VideoListing extends HttpServlet {
private static final long serialVersionUID = 1L;
public VideoListing()
{
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
response.setContentType("text/html");
response.setBufferSize(1024);
PrintWriter out = response.getWriter();
try {
SQLUtil util = new SQLUtil();
List<VideoRecording> testList = util.getAllVideos();
System.out.println(testList.size());
System.out.println(testList.get(0).getId());
out.println("<html><body>");
out.println( "<table border='1' style='width=100%'><tr>");
out.println("<td>Recording ID</td>");
out.println("<td>Director</td>");
out.println("<td>Title</td>");
out.println("<td>Category</td>");
out.println("<td>Duration</td>");
out.println("<td>Rating</td>");
out.println("<td>Year Released</td>");
out.println("<td>Price</td>");
out.println("<td>Stock Count</td>");
//For (every employee in list) print each of those as a data object in the table
out.println("<tr>");
//for(int i=0; i<testList.size(); i++)
//{
// out.println("<td>"+testList.get(i).getId()+"</td>");
//}
out.println("</tr>");
out.println("</tr></table>");
out.println( "</body></html>");
}
catch (Exception exc)
{
out.println("complete failure");
}
}
}
提前谢谢你的帮助
我想这是stacktrace。这意味着属性文件找不到该文件,但为什么这只会发生在servlet中,而不是java类中?它们都在同一个项目中,属性文件就在那里
java.io.FileNotFoundException: proj.properties (No such file or directory)
at java.io.FileInputStream.open(Native Method)
at java.io.FileInputStream.<init>(FileInputStream.java:146)
at java.io.FileInputStream.<init>(FileInputStream.java:101)
at sqlUtil.SQLUtil.<init>(SQLUtil.java:14)
at servlets.VideoListing.doGet(VideoListing.java:34)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:936)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:407)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1004)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
当您在IDE中运行程序时,代码可以找到proj.properties文件,因为它是本地的,但是当您在servlet容器中运行程序时,proj.properties要么不在那里,要么不在路径中,要么找不到其他地方。答案很清楚。您可以找到.properties文件,但类装入器无法找到
java.io.FileNotFoundException: proj.properties (No such file or directory)
您不应该使用FileInputStream加载此文件。您应该将它放在类路径中的WEB-INF/classes目录中,并使用servlet上下文加载它
天哪,不要这样把HTML放在servlet中。就像我说的,别无选择。我和你一样讨厌这个主意。stacktrace在哪里?你写道你的一个构造函数中有一个异常。所以,请发布stacktrace。@user3092589在catchException exc块中,添加exc.printStackTrace;。这将打印出堆栈跟踪。啊,我现在明白了!非常感谢你!啊,我明白了!非常感谢。