• 締切済み

例外を明示的にthrowするとき

例外をthrowしたいとき、以下の場合、IllegalArgumentException、FileNotFoundException、どちらを使用していいのかわかりません。 public static void main(String[] args){ try{ AAA(new File(args[0])); }catch(FileNotFoundException e){ System.out.println(e.getMessage); } e)catch(IllegalArgumentException e){ System.out.println(e.getMessgae()); } } public static void AAA(File file){ if(isFile()){ //処理 }else{ throw new IllegalArgumentException("引数が不正です");    //それともthrow new FileNotFoundException("ファイルが存在しません"); } }

みんなの回答

  • googoo131
  • ベストアンサー率45% (5/11)
回答No.7

すいません。先程のMainClass部分まだ間違いありましたので修正しました。 以下のコードが正しいコードです。 public class MainClass {   public static void main(String[] args)   {     try     {       Mainclass mcl = new MainClass();       // 入力チェック       mcl.inputCheck(args[0]);       // ファイル処理       mcl.AAA(new File(args[0]));     }     catch(FileNonExitException e)     {       // ファイル例外エラー       System.out.println(e.toString());     }     catch(NoArgmentException e)     {       // 引数指定エラー       System.out.println(e.toString());     }   } }

  • googoo131
  • ベストアンサー率45% (5/11)
回答No.6

失礼しました。先程のMainClass部分修正します。 public class MainClass {   public static void main(String[] args)   {     try     {       Mainclass mcl = new MainClass();       // 入力チェック       inputCheck(args[0]);       // ファイル処理       AAA(new File(args[0]));     }     catch(FileNonExitException e)     {       // ファイル例外エラー       System.out.println(e.toString());     }     catch(NoArgmentException e)     {       // 引数指定エラー       System.out.println(e.toString());     }   } }

  • googoo131
  • ベストアンサー率45% (5/11)
回答No.5

AAAメソッドの中での例外をthrowするときはFileNotFoundExceptionを使った方がいいです。 あと、コードは以下のようにしてもいいかと思います。 引数判定とファイル判定につきましては自作例外クラスにて処理するようにしました。 public class MainClass {   public static void main(String[] args)   {     try     {       Mainclass mcl = new MainClass();       // 入力チェック       inputCheck(String filename);       // ファイル処理       AAA(new File(args[0]));     }     catch(FileNonExitException e)     {       // ファイル例外エラー       System.out.println(e.toString());     }     catch(NoArgmentException e)     {       // 引数指定エラー       System.out.println(e.getMessgae());     }   } } // 入力チェック public static void inputCheck(String filename) {   if(filename.length() == 0)   {     throw new NoArgmentException("ファイル名が入力されていません。");   } } // ファイル処理 public static void AAA(File file) {   if(file.isFile())   {     //処理   }   else   {     throw new FileNonExitException("ファイルが存在しません");   } } (2) 例外クラスを記述しておきます public class FileNonExitException extends RuntimeException {   private static final long serialVersionUID = 1;   // フィールド   private final String nochstr = "ファイルがありません。";   private String    messtr;   // コンストラクタ   public FileNonExitException()   {     // TODO 自動生成されたコンストラクター・スタブ     messtr = nochstr;   }   public FileNonExitException(String mes)   {     // TODO 自動生成されたコンストラクター・スタブ     messtr = mes;   }   public String toString()   {     return messtr;   } } public class NoArgmentException extends RuntimeException {   private static final long serialVersionUID = 1;   // フィールド   private final String nochstr = "引数指定が不正です。";   private String    messtr;   // コンストラクタ   public NoArgmentException()   {     // TODO 自動生成されたコンストラクター・スタブ     messtr = nochstr;   }   public NoArgmentException(String mes)   {     // TODO 自動生成されたコンストラクター・スタブ     messtr = mes;   }   public String toString()   {     return messtr;   } }

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.4

ああ、失礼しました。 if(args.length == 0){ // 先に引数のチェック今回は空の場合は引数不正とする。 throw new IllegalArgumentException("引数が不正です"); } ではなく if(args.length == 0){ System.out.println("USAGE:このアプリの使い方"); return; } else if (args[0].length() == 0){ // 先に引数のチェック今回は空の場合は引数不正とする。 throw new IllegalArgumentException("引数が不正です"); } こうすべきでしたね。 まだ細かなミスがあるかもしれません。。。

  • ww-_-ww
  • ベストアンサー率51% (46/89)
回答No.3

こんにちわ。 何をするのかはともかく、タイトルの例外を使うのであれば私なら以下のように使いますね。 public static void main(String[] args) { try { if(args.length == 0){ // 先に引数のチェック今回は空の場合は引数不正とする。 throw new IllegalArgumentException("引数が不正です"); } AAA(new File(args[0])); } catch (FileNotFoundException e) { System.out.println(e.getMessage()); } catch (IllegalArgumentException e) { System.out.println(e.getMessage()); } catch (自作例外 e){ System.out.println(e.getMessage()); } } public static void AAA(File file) throws FileNotFoundException { if(!file.exists()){ // ここでファイルの有無チェック throw new FileNotFoundException("ファイルが存在しません"); } if (file.isFile()) { // 処理 } else { throw new 自作例外("ファイルではありません。"); } }

noname#208124
noname#208124
回答No.2

ディレクトリを渡した場合はどの例外が適切だと思いますか? java.io.File#isFile()ならfalseです NotFound、存在しない訳じゃありません Fileクラスでないものを渡したら?

hello_java
質問者

補足

ありがとうございます。 >ディレクトリを渡した場合はどの例外が適切だと思いますか? 調べましたが、わかりません。 >java.io.File#isFile()ならfalseです >NotFound、存在しない訳じゃありません  はい、あくまで普通のファイル以外は例外を出すようにしています。 >Fileクラスでないものを渡したら?  この質問がわかりません。教えてください。

回答No.1

作っているクラスの全容が全く(Fileクラスを継承して独自のFileクラスを作ろうとしているのかな?)見えてこないので確かな回答はできません。 そもそも、IllegalArgumentExceptionをスローする場合、引数は何になると思いますか?引数のチェックを行っていないのにこの例外を起こすのはちょっとおかしいですね。 オリジナルのクラスを作るのであれば、オリジナルの例外を作った方が可用性に富むと思います。

参考URL:
http://sdc.sun.co.jp/java/docs/j2se/1.4/ja/docs/ja/api/java/io/File.html#isFile()
hello_java
質問者

補足

ありがとうございます。 >IllegalArgumentExceptionをスローする場合、引数は何になると思いますか? 考えましたが、わかりません。 >オリジナルのクラスを作るのであれば、オリジナルの例外を作った方が可用性に富むと思います。 確かにそうですね。自分で作成したら、しっくりきました。