方法中缺少return语句错误

时间:2013-10-09 19:17:46

标签: java return

我正在尝试编写一个静态方法,该方法返回计算机MAC地址的字符串(函数本身在此处找到:http://www.mkyong.com/java/how-to-get-mac-address-in-java/)。我遇到了静态函数的return方面的问题。我得到的错误是missing return statement。我该如何解决这个问题?

static String returnMacAddress(){
        InetAddress ip;
        try{
            ip = InetAddress.getLocalHost();

            NetworkInterface network = NetworkInterface.getByInetAddress(ip);
            byte[] mac = network.getHardwareAddress();

            System.out.print("Current MAC address: ");

            StringBuilder stringBuilder = new StringBuilder();
            for(int i = 0; i < mac.length; i++){
                stringBuilder.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
            }
            return stringBuilder.toString();
        }catch(UnknownHostException e){
            e.printStackTrace();
        } catch(SocketException e){
            e.printStackTrace();
        }
    }

1 个答案:

答案 0 :(得分:5)

所有分支都必须返回一些内容,只需在末尾添加return null;

static String returnMacAddress(){             // 1.
    InetAddress ip;
    try{                                      // 2.
        ip = InetAddress.getLocalHost();      // 3. (until return stmt)

        NetworkInterface network = NetworkInterface.getByInetAddress(ip);
        byte[] mac = network.getHardwareAddress();

        System.out.print("Current MAC address: ");

        StringBuilder stringBuilder = new StringBuilder();
        for(int i = 0; i < mac.length; i++){
            stringBuilder.append(String.format("%02X%s", mac[i], (i < mac.length - 1) ? "-" : ""));
        }
        return stringBuilder.toString();       // 4.
    }catch(UnknownHostException e){            // 5.
        e.printStackTrace();                   // 6.
    } catch(SocketException e){
        e.printStackTrace();
    }
    return null;                               // 7.
}

语法正确 - 但你必须考虑这意味着什么语义,如果这是所需的操作:

  • 例外 - 您真的只想在System.err上打印它们吗?
    • 如果您只需要地址,是否要打印它们?
  • 您是否希望返回一个字符串,表示未成功获取MAC地址的条件?

修改 在这种情况下控制如何流动 - 因为OP在成功执行时询问最后的return null是否会否定先前的值:

  • 输入方法 - 新堆栈框架(代码中为1.)
    • 输入try block(2.代码中)
      • 在try中处理指令(3.代码中)
      • return语句:停止执行块,该值返回到前一个堆栈帧(代码中为4.)
      • (现在不是这样,但如果有finally块,那么现在就会执行,甚至可以覆盖返回的值...)
  • 执行调用的方法继续返回值

在不成功的情况下,(例如UnknownHostException):

  • 输入方法 - 新堆栈框架(代码中为1.)
    • 输入try block(2.代码中)
      • 在try中处理指令(3.代码中)
      • 抛出异常
    • 输入catch块(代码中为5.)
      • 进程catch块(日志异常,代码中为6.)
      • (现在不是这样,但如果有finally块,那么现在就会执行,甚至可以覆盖返回的值...)
    • return null statement:停止执行block,null值返回到前一个堆栈帧(代码中为7.)
  • 执行调用的方法继续返回值

如您所见,在成功的情况下,return null;语句即使在“实际返回”之后也不会影响返回的值。每当达到返回时,停止当前块的执行。 (如果实际上下文中有一个,则相应的finally块将获得控件)。

虽然finally块很棘手:请仔细阅读,这将是有用的知识。