Java——必须抛出异常,但如何抛出?

Java——必须抛出异常,但如何抛出?,java,sql,exception,Java,Sql,Exception,我在NetBeans中收到一个错误,说我必须在此方法中抛出SQLException: private void displayCustomerInfo(java.awt.event.ActionEvent evt) { int custID = Integer.parseInt(customerID.getText()); S

我在NetBeans中收到一个错误,说我必须在此方法中抛出SQLException:

private void displayCustomerInfo(java.awt.event.ActionEvent evt)                                     
{                                         
    int custID = Integer.parseInt(customerID.getText());
    String info = getCustomerInfo(custID);
    results.setText(info);
}
此方法由NetBeans创建,因此它不允许我编辑签名并引发异常。这就是我创建
getCustomerInfo()
方法的原因。此方法确实会引发异常,因为它使用一个方法从数据库中检索有关客户的信息

public String getCustomerInfo(int cid) throws SQLException
{
    Customer c = proc.getCustomer(cid);
    // get info
    return "info";
}
getCustomer
方法也会抛出异常并编译proc.java

确切的错误是

unreported exception java.sql.SQLException; must be caught or declared to be thrown

再次阅读错误消息,它会给您两个选择


您必须将异常声明为抛出(您不能这样做)或捕获异常。试试第二种选择。

它并没有说你必须扔掉它。它说你能抓住它。因此,使用try/catch块并处理它

try {
    ...
}
catch (SQLException e) {
    System.out.println("Exception happened! Abort! Abort!");
    e.printMessage(); //Not sure if this is the correct method name
}

您需要在对
getCustomerInfo()
的调用周围放置一个try/catch块,如下所示:

private void displayCustomerInfo(java.awt.event.ActionEvent evt)                                     
{                                         
    int custID = Integer.parseInt(customerID.getText());
    try {
        String info = getCustomerInfo(custID);
    } catch (SQLException sqle) {
        // Do something with the exception
    }

    results.setText(info);
}

处理异常的两个好选项可能是:记录异常和获取异常的详细信息,或者将其用作重试连接请求的信号。或者,正如Outlaw Programmer所示,您可以将异常作为某种RuntimeException重新抛出,从而消除检查的要求。

通常,如果您的代码需要抛出签名不支持的异常类型,并且您无法控制接口,您可以捕获并重新引用接口所支持的类型。如果您的接口未声明任何选中的异常,则始终可以抛出RuntimeException:

private void displayCustomerInfo(java.awt.event.ActionEven evt)                                     
{        
    try
    {                                 
        int custID = Integer.parseInt(customerID.getText());
        String info = getCustomerInfo(custID);
        results.setText(info);  
    }
    catch (SQLException ex)
    {
        throw new RuntimeException(ex);  // maybe create a new exception type?
    }
}

您几乎肯定希望创建一个扩展RuntimeException的新异常类型,并让客户机代码捕获该异常。否则,您将面临捕获任何运行时异常的风险,包括NullPointerException、ArrayIndexOutOfBoundsException等,您的客户端代码可能无法处理这些异常。

NetBeans生成的组件具有不可修改的代码,我猜它是作为gui生成器的一部分生成的。我会问是否真的是这样,但我还不能发表评论。如果在GUI编辑器中选择生成的对象,则右侧有一个选项卡“代码”,可用于修改代码的灰色区域

此处:

我遇到了这个问题。。。在过去的两天里我一直很困惑。。然后我用sublime打开源代码(.java文件),修改代码,保存,它的效果非常好。。。当我看到这个作品时,我笑了。。。跳出框框思考真的很有效…

我给你一个+1,因为你有一个解决问题的正确答案,并且可能最终成为OP必须做的事情,但是你能提到在RuntimeExceptions中隐藏东西通常被认为是不好的做法吗一些人认为DIts是一种不好的做法。在很多情况下,获取一个检查过的异常(根据一些人的说法,它不应该出现在java语言中)并将其包装在一个未检查的异常中是一件好事。Hibernate在所有情况下都会这样做,例如,我编辑了答案,以便更清楚地解释这个问题。我对RuntimeExceptions没有问题,但我认为创建一个新类型可能是值得的,这样客户端至少可以知道调用失败的原因。在这种情况下,处理它几乎肯定会更好:使用setText()编写错误消息。请原谅,但为什么每个人都在这里谈论try-catch?这是一种选择,但不是唯一的选择。为什么不能抛出异常?为什么netbeans不允许它?我不使用Netbeans(我使用eclipse),但IDE不允许更改生成的代码听起来很愚蠢。您在源文件中更改了什么?。请提及更改,它将帮助其他人。