编译器要求我包含一个return语句,即使我已经包含了一个

时间:2016-01-21 01:32:42

标签: java return

我是Java新手,正在尝试解决初学者在给定数字后找到下一个素数的问题。以下是我提出的两个版本的解决方案。对于第一个版本,编译器要求我在findNextNumber方法的末尾包含第二个return语句(即返回0;),尽管我已经在代码中包含了一个return语句,而第二个版本没有要求我包含额外的退货声明。有人可以告诉我为什么会这样吗?在此先感谢您的帮助!

    public static int findNextPrime(int num) {

// VERSION 1
//        boolean isPrime = false;
//        while(!isPrime){
//            num += 1;
//            int sqt = (int)Math.sqrt(num);
//            for(int i = 2; i <= sqt; i++){
//                if(num % i == 0){
//                    break;
//                } else {
//                    isPrime = true;
//                    return num;
//                }
//            }
//        }
//        return 0;

// VERSION 2       
//        while (true) {
//            boolean isPrime = true;
//            num += 1;
//            int sqt = (int) Math.sqrt(num);
//            for (int i = 2; i <= sqt; i++) {
//                if (num % i == 0) {
//                    isPrime = false;
//                    break;
//                }
//            }
//            if (isPrime) {
//                return num;
//            }
//        }
    }

1 个答案:

答案 0 :(得分:4)

在第二个版本中,编译器知道while(true) {...}只能由return语句退出。

在第一个版本中,编译器发现条件不是常量,并假设while(!isPrime) {...}可能因为isPrime为真而退出循环。你和我知道这不可能发生,但语言不会让你依赖它来省略return语句。

如果您确定while(!isPrime)始终为假,则将while(true)更改为for(;;)isPrime