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

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

新規登録して質問してみよう
ただいま回答率
85.48%
Java

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

Q&A

解決済

5回答

5530閲覧

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

coconuts

総合スコア12

Java

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

0グッド

0クリップ

投稿2016/02/12 06:40

下記条件のユーザー定義例外を作成しようと思っています。
■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クラスによる 演算結果値範囲超過エラー");

}

}

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答5

0

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

  • 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

これらは、例えば

lang

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

のようにして使います。

...

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/12 08:06

argius

総合スコア9390

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coconuts

2016/02/29 04:13

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

0

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

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

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

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

投稿2016/02/12 07:30

kozuchi

総合スコア1193

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coconuts

2016/02/29 04:13

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

0

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

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

java

1public class CalcException extends Exception { 2 public CalcException(String message){ 3 super(message); 4 } 5}

こんな感じにして、

java

1public class CalcMain { 2 public static void main(String[] args) { 3 //計算処理 4 } else { //記号が不適切である場合 5 throw new CalcException("記号が適切ではありません"); 6 } 7 8 if(total >= 100){ 9 throw new CalcException("演算結果値範囲超過エラー"); 10 } 11 } 12}

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

投稿2016/02/12 14:20

swordone

総合スコア20651

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coconuts

2016/02/29 04:12

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

0

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

java

1public class NumberRangeException extends Exception { 2 public NumberRangeException(String msg) { super(msg); } 3} 4こーして、 5 6public final class CalcUtil { 7 public static void checkRange(int low, int cur, int max) 8 throws NumberRangeException { 9 if (low < cur || cur > max) 10 throw new NumberRangeException("out of range, input value = " + cur); 11 } 12} 13こんな風に実装します。 14 15main メソッド内で、 16CalcUtil.checkRange(0, inputvalueLeft, 100); 17CalcUtil.checkRange(0, inputValueRight, 100); 18みたいにして記述できます。 19範囲チェックに引っかかると、例外がスローされ、例外.printStacktrace(); 20で、out of range, .... メッセージとスタックトレースが印刷されまづ。

投稿2016/02/12 07:08

ipadcaron

総合スコア1693

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

coconuts

2016/02/29 04:14

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

0

ベストアンサー

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

java

1public class CalcMain { 2 3 public static void main(String[] args) { 4 5 //入力チェック 6 int num1 = Integer.parseInt(args[0]); 7 int num2 = Integer.parseInt(args[2]); 8 int total; 9 try { 10 //入力演算子判定処理 11 if ( args[1].equals("+") ) { //加算パターン 12 total = num1 + num2 ; 13 } else if ( args[1].equals("-") ) { //減算パターン 14 total = num1 - num2 ; 15 } else if ( args[1].equals("*") ) { //乗算パターン 16 total = num1 * num2 ; 17 } else if ( args[1].equals("/") ) { //除算パターン 18 total = num1 / num2 ; 19 } else { 20 throw new BadOperationException(args[1]); 21 } 22 if (total < 0 || total > 100) { 23 throw new CalTotalException("total=" + total); 24 } 25 System.out.println("total=" + total); 26 } catch (BadOperationException ex) { 27 System.out.println(ex.toString()); 28 } catch (CalTotalException ex) { 29 System.out.println(ex.toString()); 30 } 31 } 32} 33 34//ユーザー定義例外処理クラス 例外演算子 35class BadOperationException extends Exception { 36 public BadOperationException(String message) { 37 super(message); 38 } 39} 40 41//ユーザー定義例外処理クラス 合計値超過 42class CalTotalException extends Exception { 43 public CalTotalException(String message) { 44 super(message); 45 } 46}

実行例

$ java CalcMain 1 + 2 total=3 $ java CalcMain 1 x 2 BadOperationException: x $ java CalcMain 99 + 2 CalTotalException: total=101

投稿2016/02/14 10:24

編集2016/02/29 11:24
katoy

総合スコア22324

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問