在System.out.print中捕获异常时出错

时间:2012-09-27 09:30:13

标签: java exception try-catch throw throws

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

所以我阅读了异常文档或google / textbook,并附带以下代码:

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)

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

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

来源喜欢 http://docs.oracle.com/javase/tutorial/essential/exceptions/ 对我没有什么帮助,我似乎无法理解文字告诉我的内容。我也很难找到具有多个示例的源代码,我可以在实例中理解编码。

所以任何人都可以给我一个上面的短语的源/例子,也许是新Java程序员的一个很好的例子来源?我的书很可怕,我似乎无法在网上找到一个可以理解的上述口号的例子。

4 个答案:

答案 0 :(得分: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()方法现在将继续编译。

答案 1 :(得分:1)

什么是例外?

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

例外情况

  • 检查异常

    这些是应用程序想要从中恢复的条件。如上面给出的示例应用程序将给您错误并将继续工作。

  • 错误

    这是一种在应用程序外部的特殊情况。当没有足够的可用内存且应用程序无法从中恢复时,我们会说OutOfMemoryError

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

    这些例外是应用程序异常,但在这种情况下,应用程序无法从中恢复。 E.g NullpointerException如果value为null,你尝试用它做一些令人讨厌的事情。

因此,只有三个检查过的异常需要缓存。

如何投掷和捕获已检查的例外

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

因此,无论谁想要使用此方法,都必须处理该异常。处理异常意味着调用备用流。与我们的情况一样,我们向用户"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);
      }

答案 2 :(得分: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()));
}

请注意使用“throws”是一种简单的方法;它是一个廉价的委托,有时会使编码更容易......如果可以,你应该尝试总是使用try / catch而不是抛出。

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

答案 3 :(得分:0)

一般来说,为了表示传递给您方法的不正确参数,请使用RuntimeException {{1}}并且不应该被捕获。

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

  

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