首页 > 试题广场 >

如下代码的输出的结果是?

[单选题]
如下代码的输出是
package Test;
public class Test {
    private static void test(int[] arr) {
        for (int i = 0; i < arr.length; i++) {
            try {
                if (arr[i] % 2 == 0) {
                    throw new NullPointerException();
                } else {
                    System.out.print(i);
                }
            } finally {
                System.out.print("e");
            }
        }
    }

    public static void main(String[]args) {
        try {
            test(new int[] {0, 1, 2, 3, 4, 5});
        } catch (Exception e) {
            System.out.print("E");
        }
    }

}
可以得到的结论是( )
  • 编译出错
  • eE
  • Ee
  • eE1eE3eE5
  • Ee1Ee3Ee5
推荐
答案:B
由于arr[0] =0,所以在进入 test()方法里面会在第一个if 上抛出一个 NullPointerException,接着会执行 finally 的语句, (finally语句先于 return 和 throw语句执行),输出一个'e,然后回到 main方法中,由于捕捉到异常,所以进入到catch语句中,然后打印一个'E',所以最终结果为"eE"
编辑于 2015-10-08 09:22:22 回复(33)
这题主要是2点:1.finally中的语句一定会执行。 2.是catch捕获到异常后程序结束。
发表于 2015-12-02 23:02:51 回复(19)
发表于 2017-05-27 14:55:24 回复(23)
首先,finally语句肯定会执行,所以肯定会打印e。第一个值就发生异常,else不执行,因为finally语句会早于return或hrow语句执行,所以先打印e。接下来执行throw语句,将异常抛到catch语句可以处理的地方,这里是回到main函数的catch语句,打印E,这时不会再回到test函数,直接在main函数结束。所以结果是“eE”。选第二个,B。
发表于 2015-10-07 18:36:49 回复(4)
1、finally内的代码有无异常都会执行。且try/catch/finally语法中catch不是必须的。
    1.1如果没有异常发生,finally在try内的代码执行结束后执行。
    1.2如果有异常发生且被catch捕获,finally在catch内的代码执行结束后执行。
    1.3如果有异常发生但是没被捕获。finally则在异常抛给上层之前执行。
                                                                                            -----------------Java编程的逻辑
发表于 2018-07-02 16:11:31 回复(0)
答案:B
finally语句块指不论try块如何结束都会执行,并且会先于throw return等语句执行;当i=0时,if条件为true,抛出异常,故先打印e后打印E
发表于 2015-01-04 20:18:36 回复(1)
当一个方法在运行过程中产生未catch的异常,则这个方法终止,但整个程序不终止,继续运行,只是不运行这个方法了。

本题中test方法只执行一次后不再执行, main()方法正常执行

public class TestDemo {
	private static void test(int[]arr) {
        for (int i = 0; i < arr.length; i++) {
            try {
                if (arr[i] % 2 == 0) {
                    throw new NullPointerException();
                } else {
                    System.out.print(i);
                }
            } finally {
                System.out.print("e");
            }
            System.out.println("test");
        }
    }
    public static void main(String[]args) {
        try {
            test(new int[] {0, 1, 2, 3, 4, 5});
        } catch (Exception e) {
            System.out.print("E");
        }
        System.out.println("main");
    }
}
-----------------------
输出eEmain 


编辑于 2016-03-08 11:10:22 回复(6)
解题要点:
1、finally语句只有在非常极端的情况下不会执行,默认肯定会要执行;
2、如果try、catch语句中有return语句或者throw语句,这些语句要在finally执行之后再执行;
3、try中一旦抛出异常,则try语句中的剩下语句则不会执行;
4、抛出异常的方法的调用者捕获到异常后进行处理;
发表于 2016-10-11 14:20:10 回复(1)
答案:D


发表于 2016-07-13 17:01:38 回复(5)
B try语句块,return NullPointerException(),也就是返回E 2.E 保存在一个临时区域里 3.执行finally语句块。若finally语句有返回值,则此返回值将替换掉临时区域的返回值 4.将临时区域的返回值送到上一级方法中。 finally其实是仅在return ; 语句执行前执行,如果return 一个函数,那么会先执行函数,但如果函数内有(return ;)语句,那么finally就会在这个(return ;)语句前执行。
发表于 2015-10-07 14:57:58 回复(1)
重点:finally语句先于 return 和 throw语句执行!!!遇到return和throw语句,程序会终止,且return和throw会先被缓存起来,先执行完finally块,再执行return或者throw语句返回上一级。
发表于 2018-04-03 11:42:15 回复(0)
为什么 test 不 throw exception 不会报错啊?
发表于 2016-10-11 09:38:09 回复(6)
这道题是个陷阱,可能会有人选C(我也是),问题的关键在于,程序出现异常后,循环就停止了。
这道题恰恰抓住了我们“做题”的心理,想要搞清楚输出的序列及顺序,而忽略了基础的问题。所以不能为了做题而做题。
发表于 2016-04-04 13:55:01 回复(1)
进入test方法后,第一步i=0,所以a[0] = 0;  0取余2等于0,就调用了  throw new NullPointerException();这句话就相当于是抛出了一个异常,所以结束了执行该方法,finally方法是出项异常后在return前执行的,所以就先输出e,然后在主函数中抛出异常,输出E
发表于 2015-11-09 18:55:02 回复(0)
因为test方法内部没有catch语句,当try抛出异常时,该方法就挂了,但是finally语句一定会执行,输出e,test方法抛出异常,在main方法中,即try中抛出异常,catch语句捕获异常,输出E,程序结束。 如果test方法中有下边的catch语句,那么输出结果就是Ee1eEe3eEe5e,main方法中的catch语句不会被执行,因为test方法内部抛出的异常在内部被捕获处理掉了,finally方法一定会执行,在try catch之后执行 如果finally中有return语句,前边的返回结果会被覆盖,最终返回finally的返回值,所以finally中一般不写return语句
发表于 2022-01-05 21:46:12 回复(0)
1.NullPointerException是Runtime异常,在test()方法内throw时无须catch显示捕获或者用throws显示声明抛出。所以编译通过
2.调用test()方法时,数组第一个元素为0,0%2==0成立,所以thrownewNullPointerException()执行,test()方法即将退出,test()方法退出之前执行finally代码块内的内容,输出e
3.test()方法结束后回到main方法,捕获到NullPointerException,执行代码块,输出E。
综上,控制台输出eE。
发表于 2021-12-08 17:07:27 回复(0)
整体结构是:try { try (异常)  finally }  catch..
先执行finally,再执行外部catch

发表于 2017-10-09 18:59:01 回复(0)
首先你要知道是main方法调用test方法,而且这test方法是放在main方法中的try语句中,意味着try语句块中的test方法是存在发生异常的可能性,然后要知道throw是抛出一个异常对象。这道题test方法抛出异常。
当test方法抛出一个异常对象。
这个异常对象给谁?
有人说异常对象给main方法,但这句话其实是不完整的。要这样说:异常对象给main方法中try语句块里 。如果你不把test方法放到try语句快里,那么这个异常对象就不会被main中catch住。会一直向上抛异常对象。
那么又有一个问题,是谁在调用main方法呢?
是JVM。 
那如果JVM收到异常对象会怎么做呢?
JVM就会在把异常输出在控制台,并且不会输出我们题目中的正确答案"eE",
总结:如果你不把test方法放到main方法中的try语句中,那么main中就不会捕获这个异常对象。那这个对象就会被抛到JVM,输出在控制台。(另外在抛出空指针异常之前会输出 ‘ e’)。
如果放在放到main方法中的try语句中,那么就对捕获这个异常对象,然后catch语句块处理,就不用输出在控制台了。
发表于 2022-03-19 18:52:28 回复(0)
        在方法内部,在出现编译时异常的地方层层把异常抛出去给调用者,调用者最终抛出给JVM虚拟机,JVM 虚拟机输出异常信息,直接干掉程序,这种方式与默认方式是一样的。
优点:可以解决代码编译时的错误
运行时出现异常,程序还是会立即死亡

补充:
当在 try 块或 catch 块中遇到 return 语句时,finally 语句块将在方法返回之前被执行。在以下 4 种特殊
情况下,finally 块不会被执行:
1. 在 finally 语句块中发生了异常。
2. 在前面的代码中用了 System.exit()退出程序。
3. 程序所在的线程死亡。
4. 关闭 CPU。
发表于 2022-01-27 16:05:33 回复(1)

这题主要是考察对try catch的理解,catch和finally不是必须有的,但是至少要有一个。
题目中test方法的循环里只有try和finally,在try中抛出异常但并没有捕获,所以运行finally然后终止循环,将异常交给上一级也就是mian方法的catch块捕获,因此打印“eE”。
发表于 2021-11-22 20:12:53 回复(0)
大家都知道try catch finally的执行顺序 test方法内没有catch捕获块,但try抛出未捕获异常,就会先上抛,也就是抛到main内,main捕获到异常,输出E,至于为啥先e再E,可以试着把test代码放到main里面看
发表于 2017-12-06 08:45:39 回复(0)