以前の解説ではHostInfo.javaのcatchに次のように書いて対策していました。
/** 他のホストについて調べる */ import java.net.*; public class HostInfo { public static void main( String[] args ) { try { InetAddress host; host = InetAddress.getByName( args[0] ); System.out.println( "Host Name:" + host.getHostName() ); System.out.println( "IP Address:" + host.getHostAddress() ); } catch( ArrayIndexOutOfBoundsException e ) { System.err.println("アドレスまたはホスト名を指定してください"); System.err.println("Usage:"); System.err.println(" java Hostinfo hoge.exsample.jp"); System.err.println(" java Hostinfo hoge"); System.err.println(" java Hostinfo 10.10.20.1"); } catch( UnknownHostException e ) { System.err.println( "Host not found" ); System.err.println( e ); } } }
よく考えてみると、args[]の要素数をチェックするのが本来のあり方のようにも思えます。そこでちょっと変えてみます。
これが標準的な方法でしょう。
/** 他のホストについて調べる */ import java.net.*; public class HostInfo { public static void main( String[] args ) { if (args.length>0) { try { InetAddress host; host = InetAddress.getByName( args[0] ); System.out.println( "Host Name:" + host.getHostName() ); System.out.println( "IP Address:" + host.getHostAddress() ); } catch( UnknownHostException e ) { System.err.println( "Host not found" ); System.err.println( e ); } } else{ System.err.println("実行には引数が必要です"); System.err.println("アドレスまたはホスト名を指定してください"); System.err.println("たとえば java Hostinfo hoge"); } } }
しかし、InetAddressの本質が見えにくくなってしまいますね。
catchに書く方法はそれなりに読み飛ばしていけたので、InetAddressに集中できるという意味では、優れていたように思えます。
そこで対策をしないことにしました。catchにもコンパイルが通る必要最小限の記述にしています。
もちろん、実用的には引数にホスト名がなければ、キーボードからの入力を要求するというやり方もあります。誤操作の対策がプログラムを肥大化させることを経験するのも大切なことだと思いますが、覚えることは一度に一つずつにしましょう。