我正在尝试编写一个返回计算机 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 ,那么现在就会执行它,甚至可能会覆盖返回的值...)
- 输入try block (2.在代码中)
- 调用的方法继续执行并返回值
在不成功的情况下,(例如UnknownHostException):
- 进入方法 - 新的堆栈帧(1.在代码中)
- 输入try block (2.在代码中)
- 在 try 中处理指令(3.在代码中)
- 抛出异常
- 输入catch block (5.在代码中)
- 处理catch block (记录异常,6.在代码中)
- (现在不是这种情况,但如果有一个
finally
block ,那么现在就会执行它,甚至可能会覆盖返回的值...)
- return null 语句:停止执行 block ,
null
值返回到上一个堆栈帧(代码中的 7.)
- 输入try block (2.在代码中)
- 调用的方法继续执行并返回值
如您所见,在成功的情况下,return null;
语句即使在“真正的返回”之后,也不会影响返回值。每当到达返回时,当前 block 的执行就会停止。 (如果实际上下文中有一个,则相应的finally block 将获得控制权)。
finally
block 虽然很棘手:仔细阅读它,这将是有用的知识。
关于java - 方法中缺少 return 语句错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19280708/