未报告的异常java.sql.SQLException; 必须被捕获或声明抛出?

10

尝试编译下面的代码时,我得到了这个错误。我想知道我做错了什么。

未报告的异常java.sql.SQLException; 必须被捕获或声明为抛出
 Class.forName(myDriver);
^
private void setupInfo() {

    Driver driver = new org.gjt.mm.mysql.Driver();
    String url = "jdbc:mysql://localhost:3306/test";
    String username = "root";
    String password = "123456";

    String problemFeatureSpecTableName = "ProblemFeatureSpec";
    String solutionFeatureSpectTableName = "SolutionFeatureSpec";
    String classTableName = "Class";
    String extraDataTableName = "ExtraData";
    String casebaseTablename = "CaseBase";
    String problemTableName = "Problem";
    String solutionTableName = "Solution";
    String inactiveContextsTableName = "InactiveContext";
    String constantsTableName = "Constants";
    dbInfo = new DBInfo(new JDBCDriverInfo(driverName, url, username, password),constantsTableName);
    problemSpecInfo = new FeatureSpecRDBInfo(problemFeatureSpecTableName, classTableName, extraDataTableName);
    solutionSpecInfo = new FeatureSpecRDBInfo(solutionFeatureSpectTableName, classTableName, extraDataTableName);
    rdbCasebaseInfo = new RDBCaseBaseInfo(casebaseTablename, solutionTableName, problemTableName, inactiveContextsTableName);
}

4
你正在阅读过时的MySQL JDBC教程/示例。MM driver已经在8年前被MySQL接管,现在被称为Connector/J,使用com.mysql.jdbc.Driver。但MM driver类名仅保留了向后兼容性,你应该真正使用com.mysql.jdbc.Driver。另外,你的编译错误与发布的源代码不匹配。源代码中没有使用Class#forName()任何地方。此外,它根本不会抛出SQLException异常。 - BalusC
4个回答

13

您需要在方法中捕获异常:

public void setupInfo()
{
    try
    {
        // call methods that might throw SQLException
    }
    catch (SQLException e)
    {
        // do something appropriate with the exception, *at least*:
        e.printStackTrace();
    }
}

或者声明该方法抛出SQLException

private void setupInfo() throws SQLException
{
    // call methods that might throw SQLException
}

你能否添加一段简短的说明,解释它们的作用是什么? - Anubian Noob
@AnubianNoob 这是非常基础的Java。http://docs.oracle.com/javase/tutorial/essential/exceptions/catchOrDeclare.html - Matt Ball
我知道它是如何工作的,但这会使答案更清晰。编辑:哦,我没意识到这是2010年的内容,抱歉... - Anubian Noob

2

捕获异常或抛出异常。最好使用IDE(Eclipse或Netbeans),这样在按下回车键的瞬间,它就会告诉您错误信息。


1

这行代码会抛出一个未捕获的异常:

Driver driver = new org.gjt.mm.mysql.Driver();

试试这个:

try {
   Driver driver = new org.gjt.mm.mysql.Driver();
}
catch (java.sql.SQLException e) {
  // you may want to do something useful here
 // maybe even throw new RuntimException();
}

0

始终尝试从您的IDE获得帮助。 IDE通常可以自动修复错误。在IntelliJ IDEA中按alt+enter或在Eclipse中按ctrl+1,并选择修复该错误。


不幸的是(在我看来),对于这个错误的典型纠正方法是捕获异常,将堆栈跟踪打印到stderr并继续执行,就好像什么都没有发生一样。通常这不是正确的做法。 - Stephen C
通常有两个选项 - catch或throws。 - Nowaker

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接