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

时间:2009-03-24 14:13:35

标签: java sql exception

我在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

6 个答案:

答案 0 :(得分:10)

通常,如果您的代码需要抛出签名不支持的Exception类型,并且您无法控制接口,则可以捕获并重新抛出接口支持的类型。如果您的接口未声明任何已检查的异常,则始终可以抛出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的新Exception类型,并让您的客户端代码捕获该异常。否则,您将冒着捕获任何RuntimeException的风险,包括NullPointerException,ArrayIndexOutOfBoundsException等,您的客户端代码可能无法处理它们。

答案 1 :(得分:8)

再次阅读错误消息,它为您提供了两个选择。

您必须将异常声明为抛出(您无法执行)或捕获异常。尝试第二种选择。

答案 2 :(得分:3)

您需要在调用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所示,您可以将Exception重新抛出为某种类型的RuntimeException,从而消除了检查的要求。

答案 3 :(得分:2)

它并没有说你必须抛弃它。它说你可以抓住它。所以使用try / catch块并处理它。

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

答案 4 :(得分:1)

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

下面:
Code tab that is used to modify generated code.

答案 5 :(得分:0)

我遇到过这个问题...过去2天一直困惑..然后我用sublime打开源码(.java文件),更改代码,保存,它可以创造奇迹......我我笑的时候看到这个有用......想在盒子外面真的有用......