java - 方法中缺少 return 语句错误

标签 java return

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

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();
        }
    }

最佳答案

所有分支都必须返回一些东西,只需在末尾添加一个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语句:停止执行block,值返回到上一个栈帧(代码中4.)
      • (现在不是这种情况,但如果有一个 finally block ,那么现在就会执行它,甚至可能会覆盖返回的值...)
  • 调用的方法继续执行并返回值

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

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

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

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

关于java - 方法中缺少 return 语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280708/

相关文章:

java - 我怎样才能防止这个异常(exception)? java.sql.SQLException : Fail to convert to internal representation: 异常

java - 在 JSF 的情况下请求的资源不可用

C返回多个值

python - Python 中的另一个类可以调用一个函数返回的内容吗?

c - 函数返回类型决定

java - java中的转义引号

java - 如何确保我的应用程序与 RabbitMQ 的连接是健康的?

java - android-bitmap 低质量问题

android - 将值导入另一个类

Python:如果/Elif 两次问单个问题而不是回答后继续?