2013-10-09 101 views
0

我正在尝试编写一个静态方法,该方法返回我的计算机MAC地址的字符串(函数本身在此处找到:http://www.mkyong.com/java/how-to-get-mac-address-in-java/)。我遇到了有关静态函数return方面的问题。我得到的错误是missing return statement。我该如何补救?方法中缺少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(); 
     } 
    } 
+4

如果您得到'UnknownHostException'或'SocketException',该方法会返回什么结果? –

回答

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. 
} 

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

  • 例外 - 你真的只是想打印m在System.err上?
    • 你想打印它们吗?如果你只是需要地址,如果它是有效的?
  • 你愿意有一个字符串返回代表条件,它不是成功的获取MAC地址?

编辑 如何在这种情况下,控制流程 - 如OP问,如果return null末会否定以前的值,在成功执行:

  • 输入法 - 新的堆栈帧(在代码1)
    • 进入尝试块(在代码2)在试
      • 过程指令(3中代码)
      • return语句:停止块的执行,该值返回到前一个堆栈帧(4。在代码)
      • (不是现在的情况下,但如果有一个finally块,那将是现在执行的,而且甚至可能覆盖返回值...)
  • 执行方法调用继续返回值

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

  • 输入方法 - 新的堆栈框架(1。在代码)
    • 进入尝试块(在代码2)在试
      • 过程指令(3中代码)
      • 抛出异常
    • 输入catch块(在代码5)
      • 进程catch块(log exception,6。在代码中)
      • (不是现在的情况下,但如果有一个finally块,那将是现在执行的,而且甚至可能覆盖返回值...)
    • 返回NULL声明:停止执行块;所述null值返回到前一堆栈帧(7.代码)的方法的
  • 执行该调用返回的值

正如所看到的,在成功的CAS继续e,return null;声明即使在“真实返回”之后,也不会影响返回的值。无论何时返回,当前块的执行都会停止。 (并且如果在实际上下文中有一个,则适当的finally块将得到控制权)。

finally块虽然是棘手的:阅读它,这将是有用的知识。

+0

非常感谢你好,先生。你能向我解释一下返回null的重要性吗?这会通过返回一个null而不是我想要的字符串来使我的方法失效吗? – theGreenCabbage

+1

为您的最后陈述+1。 –

+0

我建议在块的前面加上一个变量'String address = null;'在地址前面加上'address = stringBuilder.toString();'内部和'return address;'。 – Kevin