我有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程序员的一个很好的例子来源?我的书很可怕,我似乎无法在网上找到一个可以理解的上述口号的例子。
答案 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,你尝试用它做一些令人讨厌的事情。
因此,只有三个检查过的异常需要缓存。
如何投掷和捕获已检查的例外
Exception
或Exception
的任何子类都是已检查的异常。可以使用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应该处理不正确的数组访问。
抛出表示已使用非法访问数组 指数。该指数为负数或大于或等于 数组的大小。