2013-10-09 140 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