- 締切済み
例外を明示的に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("ファイルが存在しません"); } }
- みんなの回答 (7)
- 専門家の回答
みんなの回答
- googoo131
- ベストアンサー率45% (5/11)
すいません。先程の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)
失礼しました。先程の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)
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)
ああ、失礼しました。 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)
こんにちわ。 何をするのかはともかく、タイトルの例外を使うのであれば私なら以下のように使いますね。 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 自作例外("ファイルではありません。"); } }
ディレクトリを渡した場合はどの例外が適切だと思いますか? java.io.File#isFile()ならfalseです NotFound、存在しない訳じゃありません Fileクラスでないものを渡したら?
- gallberry
- ベストアンサー率25% (1/4)
作っているクラスの全容が全く(Fileクラスを継承して独自のFileクラスを作ろうとしているのかな?)見えてこないので確かな回答はできません。 そもそも、IllegalArgumentExceptionをスローする場合、引数は何になると思いますか?引数のチェックを行っていないのにこの例外を起こすのはちょっとおかしいですね。 オリジナルのクラスを作るのであれば、オリジナルの例外を作った方が可用性に富むと思います。
補足
ありがとうございます。 >IllegalArgumentExceptionをスローする場合、引数は何になると思いますか? 考えましたが、わかりません。 >オリジナルのクラスを作るのであれば、オリジナルの例外を作った方が可用性に富むと思います。 確かにそうですね。自分で作成したら、しっくりきました。
補足
ありがとうございます。 >ディレクトリを渡した場合はどの例外が適切だと思いますか? 調べましたが、わかりません。 >java.io.File#isFile()ならfalseです >NotFound、存在しない訳じゃありません はい、あくまで普通のファイル以外は例外を出すようにしています。 >Fileクラスでないものを渡したら? この質問がわかりません。教えてください。