class ex1
{
static void my() {
System.out.println("asdsdf");
}
public static void main(String args[]) {
try {
for (;;) {
my();
}
} catch (Exception e)//Exception is not caught //Line 1
{
System.out.println("Overflow caught");
} finally {
System.out.println("In Finally");
}
System.out.println("After Try Catch Finally...");
}
}
catch语句(第1行)不处理溢出异常,因此输出继续打印“asdsdf”而不抛出异常。 任何人都可以告诉我为什么无限循环不作为例外处理? 或者这是它的设计和应该工作的方式?
答案 0 :(得分:7)
未捕获异常,因为它永远不会被抛出。您的方法不会导致OverflowException。
无限循环在Java中是完全合法的。它将继续无限期地运行。你的循环也没有构建越来越多的资源,它只是调用一个方法,在打印到标准输出后自我破坏每次迭代。它可以永远运行。
例如,如果您使用方法my();
ITSELF只需调用my()
,那么您会立即获得StackOverflowError
,但这会在您{的第一次迭代时发生{1}}循环。
答案 1 :(得分:1)
要创建“溢出”条件,您实际上必须导致某些内容溢出。像变量一样。
修改你的for语句以增加某些东西但不对循环的连续性施加任何约束,那么就会出现整数溢出。
for (int i=0;;i++) {
}
可替换地,
for (int i=0;i==i;i++) { // i==i is always true.
}
另一种方法是通过递归调用自身而不受限制来引起调用堆栈溢出。每个递归调用都必须保留前面的递归调用的堆栈。
递归功能:
public static my(){
my();
}
递归构造函数:
class My {
My my;
My() {
try{
my = new My();
}
catch (Exception e){
// print exception.
}
}
}
答案 2 :(得分:0)
这就是它设计和打算工作的方式 - 这个叫做Halting problem的东西基本上意味着这是不可能的。
另一方面,如果你的方法是递归的,那么在抛出异常之前会占用越来越多的堆栈空间。
答案 3 :(得分:0)
您的方法只是创建一个无限循环并调用方法。由于没有抛出异常,因此您没有看到任何异常。