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;。最後に a を追加するだけです:

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 アドレスの取得に失敗したという条件を表す文字列を返しますか?

EDITreturn nullこの場合の制御の流れ - OP が最後に前の値を無効にする かどうかを尋ねたとき、実行が成功した場合:

  • enter メソッド - 新しいスタック フレーム (コード内の 1.)
    • try ブロックを入力します (コード内の 2.)
      • try のプロセス命令 (3. コード内)
      • return ステートメント: ブロックの実行を停止し、値を前のスタック フレームに戻します (コードでは 4.)。
      • (現在はそうではありませんが、ブロックがあった場合finally、それが実行され、返された値を上書きすることさえあります...)
  • 呼び出されたメソッドの実行は、戻り値で続行されます

失敗した場合 (UnknownHostException など):

  • enter メソッド - 新しいスタック フレーム (コード内の 1.)
    • try ブロックを入力します (コード内の 2.)
      • try のプロセス命令 (3. コード内)
      • スローされた例外
    • catch ブロックに入る (5. コード内)
      • プロセス キャッチ ブロック (ログ例外、コード内の 6.)
      • (現在はそうではありませんが、ブロックがあった場合finally、それが実行され、返された値を上書きすることさえあります...)
    • return null ステートメント: ブロックの実行を停止し、null値を前のスタック フレームに戻します (コードでは 7.)。
  • 呼び出されたメソッドの実行は、戻り値で続行されます

ご覧のとおり、成功した場合、return null;ステートメントは「実際のリターン」の後であっても、戻り値に影響を与えません。return に到達すると、現在のブロックの実行が停止されます。(実際のコンテキストに 1 つある場合は、適切な finally ブロックが制御を取得します)。

ただし、finallyブロックはトリッキーです。それを読んでください。役に立つ知識になるでしょう。

于 2013-10-09T19:18:32.087 に答える