質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

ただいまの
回答率

90.51%

  • Java

    15822questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

java ユーザー定義例外について

解決済

回答 5

投稿

  • 評価
  • クリップ 0
  • VIEW 2,280

coconuts

score 4

下記条件のユーザー定義例外を作成しようと思っています。
■args[0]~args[2] の値で四則演算を行うプログラム
 ・args[0] = 演算対象値1
 ・args[1] = 演算子(+.-.*./)
 ・args[2] = 演算対象値2

《ユーザー定義例外作成対象PTN》
    ・計算結果が”0~100 ”の範囲を超える場合
    ・演算子に該当しない値が指定された場合


現在記述中のコードです。
(コンパイルは通りません。
ちんぷんかんぷんになってしまい、中断しています(';'))

どういう風に独自の例外クラスを作成すればよいのかイメージから教えていただきたいです。

すいませんが、よろしくお願いします!!


//Mainクラス
public class CalcMain {

    public static void main(String[] args) {

        //入力チェック
        int num1 = Integer.parseInt(args[0]);
        int num2 = Integer.parseInt(args[2]);

        //入力演算子判定処理
        if( args[1].equals("+") ){                //加算パターン
            total = num1 + num2 ;

        }else if ( args[1].equals("-") ) {        //減算パターン
            total = num1 - num2 ;

        }else if ( args[1].equals("*") ) {        //乗算パターン
            total = num1 * num2 ;

        }else if ( args[1].equals("/") ) {        //除算パターン
            total = num1 / num2 ;

        }else{
 Users_Caic calError = new Users_Caic();
            throw calError.calTotal();

        }
        }catch(Users_Caic e){

        //}catch(CalTotalException e) {
        //    CalTotalException calTotalError = new CalTotalException(total);
        //}

//ユーザー定義例外処理クラス 例外演算子ptn
public class Users_Caic extends Exception {

    Users_Caic () throws Users_Caic {

        System.out.println("Users_Caic によるエラーです!");

    }

}

//ユーザー定義例外処理クラス 合計値超過ptn
public class CalTotalException extends Exception {

//    public CalTotalException (int total) {
//
//        if(( 0 <= total)&&(total >= 100 )){
//
//        System.out.println("合計値超過エラー!!!");
//
//        }
//    }
        System.out.println("CalTotalExceptionクラスによる 演算結果値範囲超過エラー");

    }

}

  • 気になる質問をクリップする

    クリップした質問は、後からいつでもマイページで確認できます。

    またクリップした質問に回答があった際、通知やメールを受け取ることができます。

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 5

+2

例外を追加する以前の段階コードはコンパイラを通りましたか?

>ちんぷんかんぷんになってしまい、

という状態ならば、いろんなことを一度にやろうとせずに、
例外処理なしでコンパイラを通るコードを完成させてみてはどうでしょう?

その後、必要に応じて例外を追加していく、という段階を踏んで行った方が、
理解しやすいと思います。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/29 13:13

    ありがとうございました!!

    キャンセル

+2

まずは同類の例外の使い方から覚えましょう。

  • IndexOutOfBoundsException: 配列の範囲外のインデックスが指定された場合の例外
  • NumberFormatException: 文字列を数値に変換する際に文字列が適切でない場合の例外

IndexOutOfBoundsException - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/IndexOutOfBoundsException.html

NumberFormatException  - Java SE 8 API ドキュメント
https://docs.oracle.com/javase/jp/8/docs/api/java/lang/NumberFormatException.html

これらは、例えば

String s = ... ; // 何らかの値を設定
if ( ... /* 文字列が数値として適切かどうかを判定してNGの場合 */ ) {
    throw new NumberFormatException("数値ではありません: " + s);
}

のようにして使います。

...

IndexOutOfBoundsExceptionのソースコードは以下のようになっています。

java.lang.IndexOutOfBoundsException (.java) - GrepCode Class Source (Raw)
http://grepcode.com/file_/repository.grepcode.com/java/root/jdk/openjdk/8u40-b25/java/lang/IndexOutOfBoundsException.java/?v=source

serialVersionUIDという項目がありますが、ここは今は一旦無視してください。
また、コメント部分は例外クラスかどうかに関係なく書き方がありますが、こちらも今は無視してください。後で別途コメントの書き方を学んでください。
あとはそのままクラス名を変えて同じように書けばOKです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/29 13:13

    ありがとうございました!!

    キャンセル

+1

javadrive, javaload で勉強するとーいいですよ。

public class NumberRangeException extends Exception {
    public NumberRangeException(String msg) { super(msg); }
}
こーして、

public final class CalcUtil {
    public static void checkRange(int low, int cur, int max) 
          throws NumberRangeException {
        if (low < cur || cur > max)
              throw new NumberRangeException("out of range, input value = " + cur);
    }
}
こんな風に実装します。

main メソッド内で、
CalcUtil.checkRange(0, inputvalueLeft, 100);
CalcUtil.checkRange(0, inputValueRight, 100);
みたいにして記述できます。
範囲チェックに引っかかると、例外がスローされ、例外.printStacktrace();
で、out of range, .... メッセージとスタックトレースが印刷されまづ。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/29 13:14

    ありがとうございました!!

    キャンセル

+1

まず概要を掴みたいのならここなんてどうでしょう
8-10 例外1 throwとthrows
8-11 例外2 try catch文

例外が発生した時、その例外の型名でどういう例外かを適切に伝える必要があります。自分で例外を定義する場合、その目的に沿うように適切に名前をつける必要があります。
そしてその例外を知らせる場合、そのオブジェクトを作成してthrowする必要があります。
Exceptionのドキュメントを見てみましょう。Exceptionのコンストラクタがいくつか有りますが、メッセージの文字列や原因となったthrowableという型を受け取るコンストラクタがありますね。自作の例外クラスはExceptionを継承し、これらのコンストラクタを利用して例外を構築するのが主な使い方になります。
今回の場合、

public class CalcException extends Exception {
    public CalcException(String message){
        super(message);
    }
}


こんな感じにして、

public class CalcMain {
    public static void main(String[] args) {
        //計算処理
        } else {  //記号が不適切である場合
            throw new CalcException("記号が適切ではありません");
        }

        if(total >= 100){
            throw new CalcException("演算結果値範囲超過エラー");
        }
    }
}


このようにして使います(ただしこのままでは検査例外を適切に処理してないのでコンパイルエラーになる)。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/02/29 13:12

    有り難う御座いました。
    大変わかりやすかったです。

    キャンセル

checkベストアンサー

0

質問文もコードをベースに動作するように書いてみました。
例外クラスの書き方はあまり適切な例になっていません。
web や書籍で例外クラスの書き方については別途勉強することをお勧めします。

public class CalcMain {

    public static void main(String[] args) {

        //入力チェック
        int num1 = Integer.parseInt(args[0]);
        int num2 = Integer.parseInt(args[2]);
        int total;
        try {
            //入力演算子判定処理
            if ( args[1].equals("+") ) {                //加算パターン
                total = num1 + num2 ;
            } else if ( args[1].equals("-") ) {        //減算パターン
                total = num1 - num2 ;
            } else if ( args[1].equals("*") ) {        //乗算パターン
                total = num1 * num2 ;
            } else if ( args[1].equals("/") ) {        //除算パターン
                total = num1 / num2 ;
            } else {
                throw new BadOperationException(args[1]);
            }
            if (total < 0 || total > 100) {
                throw new CalTotalException("total=" + total);
            }
            System.out.println("total=" + total);
        } catch (BadOperationException ex) {
            System.out.println(ex.toString());
        } catch (CalTotalException ex) {
            System.out.println(ex.toString());
        }
    }
}

//ユーザー定義例外処理クラス 例外演算子
class BadOperationException extends Exception {
    public BadOperationException(String message) {
        super(message);
    }
}

//ユーザー定義例外処理クラス 合計値超過
class CalTotalException extends Exception {
    public CalTotalException(String message) {
        super(message);
    }
}


実行例

$ java CalcMain 1 + 2
total=3

$ java CalcMain 1 x 2
BadOperationException: x

$ java CalcMain 99 + 2
CalTotalException: total=101

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

同じタグがついた質問を見る

  • Java

    15822questions

    Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。