0

我正在尝试编写一个返回我的计算机 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();
        }
    }
4

1 回答 1

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 块(2. 在代码中)
      • try 中的处理指令(3. 在代码中)
      • return 语句:停止块的执行,将值返回到上一个栈帧(4.代码中)
      • (现在不是情况,但如果有一个finally块,现在就会执行,甚至可能覆盖返回值......)
  • 调用的方法的执行继续返回值

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

  • 输入方法 - 新堆栈帧(1. 在代码中)
    • 输入 try 块(2. 在代码中)
      • try 中的处理指令(3. 在代码中)
      • 抛出异常
    • 进入 catch 块(5. 在代码中)
      • 进程捕获块(日志异常,6.在代码中)
      • (现在不是情况,但如果有一个finally块,现在就会执行,甚至可能覆盖返回值......)
    • return null 语句:停止执行block,将null值返回到上一个堆栈帧(7.代码中)
  • 调用的方法的执行继续返回值

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

但是,该finally块很棘手:阅读它,这将是有用的知识。

于 2013-10-09T19:18:32.087 回答