• ベストアンサー

範囲外の数値を代入したらエラーを出して止まるようにしたい

大きさが3の配列に対して,たとえば, mat[10] = 4 のように代入しようとすると 「OutOfBoundary 云々」というエラーメッセージが出て プログラムが止まりますよね. 同じように,変数に代入できる範囲を制限できないでしょうか? 次のようなメソッドを作りたいたのですが, x に代入できる範囲を (-1, 1) に制限したいと思っています.    public void test(double x) {       if (x >= -1 && x <= 1) {          this.x = x;       } else {          // ここで 「(1, 1)の範囲じゃなきゃダメ」とう          // ことを伝えるメッセージを出して,          // プログラムを止めたい       }    } どうすればよいでしょうか?

質問者が選んだベストアンサー

  • ベストアンサー
  • Gishi
  • ベストアンサー率57% (11/19)
回答No.3

IllegalArgumentException をスローするのが一般的だと思います。 よく分からなければ、「例外」について勉強することをおすすめします。 public void test(double x) {  if (x < -1 || x > 1) {   throw new IllegalArgumentException("" + x);  }  this.x = x; } より詳しくメッセージを表示したいなら 例外のコンストラクタにエラーメッセージを渡してください。   throw new IllegalArgumentException    ("引数は(-1,1)の範囲でなくてはいけません")

white-tiger
質問者

補足

これは,目的そのものズバリでいいですね. ありがとうございます.

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (2)

  • BLUEPIXY
  • ベストアンサー率50% (3003/5914)
回答No.2

私も例外を投げるようにすればイイと思います。 MyClass は、自分のクラスに変更 ----------------------------------------------------------------    public void test(double x) throws MyClassException {       if (x >= -1 && x <= 1) {          this.x = x;       } else { throw new MyClassException("(1, 1)の範囲じゃなきゃダメ!");       }    } class MyClassException extends Exception { public MyClassException() { super(); } public MyClassException(String msg){ super(msg); } }

white-tiger
質問者

お礼

ありがとうございます.

全文を見る
すると、全ての回答が全文表示されます。
  • process9
  • ベストアンサー率29% (81/272)
回答No.1

Exceptionクラスの派生クラス作って 例外を発行すればいいのでは?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • クラス内での二次元配列への値の代入について

    以下のソースで、配列変数$a[0][0]にbを代入して、メソッドprintAでそれをprintしようとしていますが、"Parse error: syntax error, unexpected '$a' (T_VARIABLE), expecting function (T_FUNCTION) in C:\xampp\htdocs\a.php on line 4"というエラーが出ます。 どうすれば、$a[0][0]にbを代入して、メソッドprintAでそれをprintできるか教えてください。 phpのバージョンは5.5.15です。 <?php class A{ private $a = array(); $a[0][0] = 'b'; function printA(){ print $this->a[0][0]; } } $x = new A(); echo $x->printA(); ?>

    • ベストアンサー
    • PHP
  • 関数の引数なしを変数に代入したら入ってきた数値は何?

    デバッグソフトで自分のプログラムを動かしていたときに、 int test_func(char x) { x = x + 1; ------(中略)----------- return x; } int main(void) { int test_val; ------(中略)----------- test_val = test_func; ------(中略)----------- } このようにtest_func(char x)という関数の戻り値を変数test_valに代入するつもりだったのですが、間違って引数部分を書かずにコンパイルしてしまいました。 このときにコンパイルでエラーが出ると思ったのですが、コンパイル完了でデバッガで変数test_valをみてみると何か値が入っていました。 ちょっと気になったのですが、この変数の中に入った値はいったい何なのでしょうか。ご存じの方いらっしゃいましたらご教授お願いいたします。

  • 変数の大きさを超える代入

    現在作っているプログラムで、一定時間ごとに変数に一定値が 加算され続けるような場所があります。 基本的にはint型の最大値を超えることはまずないのですが、 C言語やC++でたとえばint型で宣言した変数に対し、x++; のように一定周期ごとに記述して加算してゆき、最大値である、 +2147483647を超えた場合、xには何が代入されているんでしょうか。 -2147483648~+2147483647が範囲ですから、一周して、 最低値である-2147483648に加算されてゆくことになるのでしょうか? それとも、超えることが予想される場合、最大値を超えたら0にするなど 明示的に何らかの対処をしたほうがよいのでしょうか。 プログラム的には中身の数値に関してはあまり関係ないので、 その変数型の範囲で不可なく動作するなら問題ありません。 超えることが予想される場合、対処するべきなのか、 放っておいてもよいのかどうかを教えていただきたいです。

  • javaのprivateって?

    privateの必要性がいまいちわからなくて困ってます。 class Car{ private int num; private double gas; public void setNumGas(int n, double g){ num=n; gas=g; ・・・・・・・ このようなプログラムがあります。 変数をprivateにして、下のメソッドでnの値をnumに格納してします。 ここで変数をprivateにする意味ってあるんですか? 本には、勝手な値(-10など)を代入させないためと書いてあります。 これっておかしくないですか? 変数をprivateにしてもメソッドに「-10」を引数として渡したら余裕で格納できるじゃないですか。 代入させないためと書いてあるのに格納できるって・・・・矛盾してるような気がします。 ここでprivateにする意味がわかりません。 誰か教えてください。

  • JavaScriptの変数への代入について

    <単純なデータ型> 1. 以下のようなケースでxに5という値を代入すると1行目の「let x = 1;」で「x」の値が5に変わるというのは理解できます。 この場合、2行目は「y」の値は「1」のままです。「5」でないのがわかりません。 代入したことによって「let y =x」へは影響を及ぼさないのはなぜですか? 少なくともスコープの範囲以内は代入の影響が出るものと考えてしまいます。 { let x = 1; let y = x; x = 5; console.log(x); //5 console.log(y); //1 } <配列> 2.このような配列の場合、「x[0]」に配列である[1, 2];が代入されているわけですよね。 以下のように「x[0]」に5を代入した場合、console.logで見てみると、[5, 2]となるのは理解できます。 しかし、2行目の「let y = x;」も[5, 2]となっています。 上の単純なデータ型のケースをもとに考えるならば、ここは[1, 2]のままでないのはなぜなのでしょうか? 試しに自分で「x[1]」に書き換えてみると両方とも「1, 5」となります。 { let x = [1, 2]; let y = x; x[0] = 5; console.log(x); //[5, 2] console.log(y); //[5, 2] } なぜ、単純なデータ型と配列ではパターンが異なってくるのでしょうか? 初心者です。学習中でまだ基礎的な段階なのですが、つまづいてしまいました。 分かる方いらっしゃいましたら教えて下さい。よろしくお願いいたします。

  • Javaコンパイルエラー

    Javaにて以下のようなプログラムを作成していますが、 「演算子 ^ は引数の型 double, int で未定義です。」とエラーになりました。 色々な方のご協力もあり、ここまで作れましたが、 これより先が行き詰っています。 教えていただけないでしょうか。 ---------------------------------------------- // 分散を返すメソッド public class Kadai16 { public static void main(String args[]){ //double型の配列の生成 double[]a=new double[10]; argument(a); //配列aの要素[0]から[9]の内容を表示 System.out.println(a[0]); System.out.println(a[1]); System.out.println(a[2]); System.out.println(a[3]); System.out.println(a[4]); System.out.println(a[5]); System.out.println(a[6]); System.out.println(a[7]); System.out.println(a[8]); System.out.println(a[9]); //double total=sum(a)を実行する double total =sum(a); System.out.println("合計は"+total+"です。"); //使って平均を出す double heikin; mean(total); heikin = mean(total); System.out.println("平均は"+heikin+"です。"); //分散を返す double bunsan; bunsan = total-heikin^2/10; System.out.println("分散は"+bunsan+"です。"); } /** * ランダムな数値を入れるメソッド * @param a ランダムな数値を入れる配列 */ private static void argument(double[]a) { //引数の配列aの[0]から[9]までランダムな数値を設定する。 for(int i=0; i<a.length;i++) { a[i]=Math.floor(Math.random()*10); } } //配列を受け取って要素の合計を出すメソッド public static double sum(double[] x) { double t=0; for(int i=0; i<x.length;i++) { t= x[i]+t; } return t; } //配列を受け取って平均を出すメソッド public static double mean(double b) { return b/10; } //分散を返すメソッド public static double bunsan(double c) { double t=0; double bnsan =0; for(int i=0; i<c.length; i++) { t =c[i]+t } } }

  • エクセルVBA 変数への代入がうまくできない

    エクセルVBA 変数への代入がうまくできない かなり初心者です。。。 選択範囲を変数に記憶したいのですがうまくいきません。 メソッドが対応していないとエラーになります。。。 stRng2に"A1:A8”のような範囲のデータを記憶したいのです。 dim stRng2 as Range stRng2 = wkb.Worksheets(stSheet1).Selection.Address(ColumnAbsolute:=False, RowAbsolute:=False) すいませんが、どなたか教えてください。

  • 「初心者です」-Xlint: deprecation

    import java.awt.*; import java.applet.*; public class ani_ball extends Applet implements Runnable { Thread th_mvball = null; int X,Y; double x1,y1; double x2,y2; double dx,dy; Graphics g; public void init() { this.setBackground(new Color(150,245,255)); this.X = 250; this.Y = 250; this.setSize(X,Y); this.x1 = this.x2 = this.X/2; this.y1 = this.y2 = this.Y/2; this.dx = 3; this.dy = 2; } public void paint(Graphics g) { g.setColor(Color.red); g.fillOval((int)(this.x2-3),(int)(this.y2-3),6,6); this.x1 = this.x2; this.y1 = this.y2; } public void start() { if(th_mvball == null) { th_mvball = new Thread(this); th_mvball.start(); } } public void run() { while(true) { try { this.move(); this.repaint(); Thread.sleep(10); } catch(InterruptedException e ) { this.stop(); } } } public void move() { if( y2 > Y ) { y2 = 2*Y - y1 - dy; dy = -dy; } else if ( y2 < 0) { y2 = -y1 - dy; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x1 -dx; dx = -dx; } else if ( x2 < 0) { x2 = -x1 - dx; dx = -dx; } if( x2 < 0 ) { x2 = -x2 ; dx = -dx; } else if ( y2 < 0) { y2 = -y2; dy = -dy; } else if ( x2 > X) { x2 = 2*X - x2; dx = -dx; } else if ( y2 > Y) { y2 = 2*Y - y2; dy = -dy; } x2 = x1 + dx; y2 = y1 + dy; } public void stop() { if(th_mvball!=null) { th_mvball stop(); th_mvball=null; } } } ↑のプログラムをコンパイルすると、「-Xlint: deprecation オプションを指定して再コンパイルしてください」とエラーが出ます。 エラーの対処法、またはプログラムの訂正すべき箇所を教えてください。 よろしくお願いします。

    • ベストアンサー
    • Java
  • 複素変数に値が正しく代入されない

    複素変数を使ったプログラムを作るために、 まず複素変数を作成して値を表示するだけのプログラムを作ったのですが、 虚数部分に代入されるはずの値が実数部分に表示され、 虚数部分には0が表示されてしまいます。 書いたプログラムは #include<stdio.h> #include<complex.h> int main(void){ complex<double> a=(1.2,2.3); printf("%g %gi\n",real(a),imag(a)); } 結果は 2.3 0i でした。 どこで書き方を間違えているのでしょうか。 cファイルだとcomplex.hをインクルードしようとすると stdcomp.hでエラーが出るのでcppファイルにしています。 コンパイラはBorland C++ Compiler 5.5を使っています。

  • 数値解析に関する質問です

    以下のプログラムにおいて 1) 初項の絶対値が大きい方の式を選んで消去する理由は何故か? 2)2元1次連立方程式の解が得られないデータ(例えば,1 2 3と2 4 6)を入力した場合,エラーを表示するようにするにはどうすればよいか? 教えてください。 よろしくお願いします。 #include <stdio.h> #include<math.h> //-------------------------------- void inputdata(double [2][3]); void calsol(double [2][3], double [2]); void elimination(double [2][3], double [2][3]); void outputdata(double [2]); void checksol(double [2][3], double [2]); //--------------------------------- main() { double c[2][3], x[2]; printf("Program of Gaussian elimination \n"); inputdata(c); calsol(c, x); outputdata(x); checksol(c, x); return(0); } //----------------------------- void inputdata(double c[2][3]) { printf("----------------------\n"); printf("Input Data\n"); printf("(a0*x0 + a1*x1 = a2)\n"); printf("\n"); printf("Equation 1\n"); printf("Input a0 a1 a2\n"); scanf("%lf%lf%lf" , &c[0][0], &c[0][1], &c[0][2]); printf("Equation 2\n"); printf("Input b0 b1 b2\n"); scanf("%lf%lf%lf", &c[1][0], &c[1][1], &c[1][2]); } //----------------------------- void calsol(double c[2][3], double x[2]){ double cc[2][3]; elimination(c, cc); x[1]=cc[1][2]; x[0]=cc[0][2]-cc[0][1]*x[1]; } //----------------------------- void elimination(double c2[2][3],double cc[2][3]) { int imax; double c1[3]; if(fabs(c2[0][0])>fabs(c2[1][0])){ imax = 0; } else{ imax = 1; } cc[0][0] = 1; if (imax == 0){ cc[0][1]= c2[imax][1]/c2[imax][0]; cc[0][2]=c2[imax][2]/c2[imax][0]; } else{ cc[0][1]=c2[1][1]/c2[1][0]; cc[0][2]=c2[1][2]/c2[1][0]; c1[0]=0; c1[1]=c2[0][1]-(cc[0][1]*c2[0][0]); c1[2]=c2[0][2]-(cc[0][2]*c2[0][0]); } cc[1][0]=c1[0]; cc[1][1]=1; cc[1][2]=c1[2]/c1[1]; } //----------------------------- void outputdata(double x[2]){ printf("--------\n"); printf("Solutions\n"); printf("x0=%14.6e\n", x[0]); printf("x1=%14.6e\n", x[1]); } //----------------------------- void checksol(double check [2][3],double x[2]) { double crt, clt; int ie; printf("---------\n"); printf("Check Solutions\n"); printf("Left Term Right Term\n"); for(ie=0; ie<=1; ie++) { clt = check[ie][0]*x[0] + check[ie][1]*x[1]; crt = check[ie][2]; printf("%14.6e %14.6e\n", clt,crt); } } 実行結果 Program of Gaussian elimination ---------------------- Input Data (a0*x0 + a1*x1 = a2) Equation 1 Input a0 a1 a2 2 3 13 Equation 2 Input b0 b1 b2 4 8 32 -------- Solutions x0= 2.000000e+00 x1= 3.000000e+00 --------- Check Solutions Left Term Right Term 1.300000e+01 1.300000e+01 3.200000e+01 3.200000e+01