0

我有 2 个类,一个实现双重查找(int i);以及我在解决问题时使用该查找(int i)的地方,或者在这种情况下打印查找值。这种情况适用于数组。

所以我阅读了异常文档或谷歌/教科书并附带以下代码:

public double lookup(int i) throws Exception
{
    if( i > numItems)
        throw new Exception("out of bounds");
    return items[i];        
}

并将它交给我的班级并尝试打印我的集合,其中 set 是我在上面的班级中定义的对象类型的名称。

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        System.out.print(set.lookup(i) + ",");

    }
    System.out.print(set.lookup(set.size()));
}

我正在使用两个 print() 来避免打印中的最后一个“,”,但我得到了一个

未处理的异常 Exception(我的异常名称是 Exception)

我想我必须在我的 print() 中捕获我的异常,但无法在线找到正确的格式。我必须写吗

捕获异常异常?因为这给了我一个语法错误,说 catch 上的类型无效。

http://docs.oracle.com/javase/tutorial/essential/exceptions/ 这样的来源对我帮助不大,我似乎无法理解文本告诉我的内容。我也很难找到包含多个示例的来源,我实际上可以理解示例中的编码。

那么任何人都可以给我一个上述流行语的来源/示例,也许是新Java程序员的一个不错的示例来源?我的书太可怕了,我似乎无法在网上找到上述流行语的可理解示例。

4

4 回答 4

1

我永远不会抛出异常。

在您的情况下,IndexOutOfBoundException 或 InvalidArgumentException 将是更好的选择。由于这些不是检查异常,因此您不需要捕获它们。

public double lookup(int i) {
    if(i >= numItems) // assuming numItems is not items.length
        throw new IndexOutOfBoundException("out of bounds " + i + " >= " + numItems);
    return items[i];        
}

注意:检查应该是>=

您的print()方法现在将编译不变。

于 2012-09-27T09:34:04.473 回答
1

什么是异常?

例外是针对特殊情况。通常不会发生的情况。举个例子,你去取钱,你的账户有 100 余额,你要求 200,然后 ATM 应该告诉你余额不足。

异常类型

  • 检查异常

    这些是应用程序想要从中恢复的条件。就像上面给出的例子一样,应用程序会给你错误并继续工作。

  • 错误

    这是应用程序外部的异常情况。我们说OutOfMemoryError当没有足够的可用内存并且应用程序无法从中恢复时。

  • 运行时异常/未经检查的异常

    这些异常是应用程序异常,但在这种情况下应用程序无法从中恢复。例如NullpointerException,如果 value 为 null 并且您尝试对它做一些讨厌的事情。

所以上面三个只有检查的异常需要缓存。

如何抛出和捕获已检查的异常

Exception或任何子类Exception都是检查异常。可以使用throw子句抛出已检查的异常。一旦抛出异常,就必须将其包含在方法声明中的 usingthrows子句中。

因此,任何想要使用此方法的人现在都必须处理该异常。处理异常意味着调用替代流程。就像在我们的例子中,我们向用户显示文本"Error Invalid account number."

调用函数还可以选择throws通过为其调用的方法抛出的那些异常添加子句来传播异常。

Generate:
public static double withdraw(int i) throws Exception {
    if (i <= 0)// Out of bounds
        throw new Exception("Invalid Account Number");
    return 0.0;// something;
}

Handle:

try {
        withdraw(0);
    } catch (Exception e) {
        // do something with exception here.
        // Log the exception
        System.out.println("Error Invalid account number.");
    }

Propagate:
      public static double callWithdraw(int i) throws Exception {//Propagate exceptions
        return withdraw(i);
      }
于 2012-09-27T09:49:37.180 回答
0

尝试这个

try
{
    print(); //print() needs to throw the same exception
} catch(Exception e)
{
   //handle exception
   System.err.println(e.getMessage()+"\n\n"+e.printStackTrace());
}
//finally {
// cleanup here if you like
// }

或这个

public void print()
{
    for (int i = 0; i < set.size() - 1; i++)
    {
        try
        {
            System.out.print(set.lookup(i) + ",");
        } catch(Exception e)
        {
          //handle it here
        }
    }
    System.out.print(set.lookup(set.size()));
}

请注意,使用“投掷”是一种简单的方法;这是一个廉价的委托,有时使编码更容易……如果可以,您应该尝试始终使用 try/catch 而不是 throws。

请注意,无论何时您最终使用带有“抛出”的东西,您都必须将其放入 try/catch 块中并正确处理。

于 2012-09-27T09:32:12.843 回答
0

通常,要表示传递给您的方法的参数不正确,请使用IllegalArgumentException,它是 aRuntimeException并且不应被捕获。

在这种特定情况下,您不必编写任何额外的代码,ArrayIndexOutOfBoundsException应该处理不正确的数组访问。

抛出以指示已使用非法索引访问数组。索引为负数或大于或等于数组的大小。

于 2012-09-27T09:36:09.437 回答