Java 为什么构造函数会在一个类中捕获异常,而不是在另一个类中捕获异常?

Java 为什么构造函数会在一个类中捕获异常,而不是在另一个类中捕获异常?,java,Java,就像我说的,伙计们,只需要知道为什么会出现异常。在下面的Javaservlet中调用SQLUtil会导致异常,但在我测试的任何其他类中都不会发生 我正在做一个学校项目,试图将一个SQL表放入一个输出html的servlet中,我知道。在这件事上我没有太多选择。为此,我使用DAO对象导入信息并将其转换为列表。然而,导入该对象似乎只在我的标准java类中起作用,而在servlet中则不起作用,因为servlet捕获了一个异常。这是所有的代码,很抱歉有点可笑 DAO,SQLUtil package s

就像我说的,伙计们,只需要知道为什么会出现异常。在下面的Javaservlet中调用SQLUtil会导致异常,但在我测试的任何其他类中都不会发生

我正在做一个学校项目,试图将一个SQL表放入一个输出html的servlet中,我知道。在这件事上我没有太多选择。为此,我使用DAO对象导入信息并将其转换为列表。然而,导入该对象似乎只在我的标准java类中起作用,而在servlet中则不起作用,因为servlet捕获了一个异常。这是所有的代码,很抱歉有点可笑

DAO,SQLUtil

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;。这将打印出堆栈跟踪。啊,我现在明白了!非常感谢你!啊,我明白了!非常感谢。