【问题标题】:Java -- Exception must be thrown, but how?Java——必须抛出异常,但是如何抛出?
【发布时间】:2010-10-15 05:21:16
【问题描述】:

我在 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?这是一种选择,但不是唯一的选择。为什么不能抛出异常?为什么netbeans不允许它?我不使用 Netbeans(我使用 eclipse),但 IDE 不允许更改生成的代码听起来很愚蠢。

标签: java sql exception


【解决方案1】:

再次阅读错误信息,它给了你两个选择。

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

【讨论】:

    【解决方案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
    }
    

    【讨论】:

      【解决方案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 所示,您可以将异常重新抛出为某种 RuntimeException,这样就不需要检查了。

      【讨论】:

        【解决方案4】:

        一般来说,如果您的代码需要抛出签名不支持的 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 的新异常类型,并让您的客户端代码捕获该异常。否则,您将面临捕获任何 RuntimeException 的风险,包括您的客户端代码可能无法处理的 NullPointerException、ArrayIndexOutOfBoundsException 等。

        【讨论】:

        • 我会给你一个+1,因为你有一个解决问题的正确答案,并且很可能最终成为 OP 必须做的事情,但你能否提一下在 RuntimeExceptions 中隐藏的东西通常被认为是不好的做法? :D
        • 有些人认为这是一种不好的做法。在很多情况下,接受检查的异常(根据某些人的说法,它不应该出现在 java 语言中)并将其包装在未经检查的异常中是一件好事。 Hibernate 在所有情况下都会这样做,例如。
        • 我已经编辑了答案以更清楚地解释问题。我对 RuntimeExceptions 没有问题,但我认为创建一个新类型可能是值得的,这样客户端至少可以知道调用失败的原因。
        • 在这种情况下处理几乎肯定会更好:使用 setText() 编写错误消息。
        【解决方案5】:

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

        这里:

        【讨论】:

          【解决方案6】:

          我遇到了这个问题...过去2天一直很困惑..然后我用sublime打开源(.java文件),更改代码,保存,它的效果很神奇......我'当我看到这个作品时,我笑了......跳出框框思考真的很有效......

          【讨论】:

          • 你在源文件中做了什么改变?请提及更改,它将对其他人有所帮助。
          猜你喜欢
          • 2014-09-16
          • 1970-01-01
          • 1970-01-01
          • 2013-03-14
          • 1970-01-01
          • 1970-01-01
          • 2012-07-23
          • 1970-01-01
          • 2013-05-24
          相关资源
          最近更新 更多