• ベストアンサー

メソッドが値を返すとき

”メソッドが値を返さない”というエラーで困っています。 次のようなプログラムでは、メソッドが値を返せないのは当たり前なのでしょうか?? public int A(){ int a= 3; int b= 5; if(条件式){ return (Math.sin(a*x)); }else if(条件式){ return (Math.cos(b*x)); }else if(条件式){ return 式 ; } } 「return」をif文のなかに入れてしまうことが,いけないのでしょうか? また,それがしてはいけない事ならば,条件式によって扱うreturn文を変えるには, どうしたら良いかアドバイスを下さい。 よろしくお願いします。

  • Java
  • 回答数2
  • ありがとう数3

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

  • ベストアンサー
  • UKY
  • ベストアンサー率50% (604/1207)
回答No.2

例えば、次のようなメソッドは「メソッドが値を返さない」というエラーになります。 public int method(int value) { if (value > 0) return 0; } もし if の条件(value > 0)が成り立たなかったとき、全く return が行われずにメソッドが終わってしまうからです。次のようなメソッドも、同じ理由で同じエラーになります。 public int method2(int value) {  if (value == 0) {   return 1;  } else if (value == 1) {   return 2;  } } 次のメソッドでは、一見問題がないように思えますが、実はこれもエラーになります。 public int method3(int value) {  if (value >= 0) {   return 3;  } else if (value < 0) {   return 4;  } } 二つの if がどちらも実行されなかった場合、return されずにメソッドが終わってしまうとコンパイラが判断するからです。 上のメソッドでは、実際には (value >= 0) と (value < 0) がどちらも成り立たないということはありえないので、事実上は必ずどちらかの return が実行されるはずではありますが、コンパイラはそこまで見てくれません。 言語の仕様で、「構文」だけを見てエラーかどうか判断する決まりになっているのです。 このメソッドでは、次のように修正すると、正しくコンパイルできます。 public int method3(int value) {  if (value >= 0) {   return 3;  } else {   return 4;  } } この構文では、必ず if と else のどちらかが実行される、と判断されるからです。 以上を参考にして、もう一度 if else の構文を見直してみてください。

maruokundesu
質問者

お礼

詳しく解説して頂き,ありがとうございました。 あまりにも初歩的なミスで,恥ずかしく思います。 とても参考になりました。ありがとうございました。

その他の回答 (1)

  • liar_adan
  • ベストアンサー率48% (730/1515)
回答No.1

>「return」をif文のなかに入れてしまうことが,いけないのでしょうか? それは問題ありません。 このコードから見ると、おそらく、 すべてのif文の条件式が成立しないとき、 値を返せないのでエラーが出ているのだと思います。 メソッドの終わる直前にreturn 0;とでも書いておけば良いのではないでしょうか。

maruokundesu
質問者

お礼

わかりやすい回答をありがとうございました。 指摘されて,やっと気づきました。 感謝しています。

関連するQ&A

  • sinの値を求めるプログラムで質問です。

    sin(x)の値を求めるプログラムで質問です。 cos(x)の値をcosのテーラー展開の式から求めるプログラムを作り、無限級数の項の絶対値が0.00001以下になったら打ち切って、コンピュータで定義されるcos(x)の値との差を 0.0≦x≦0.1 の範囲で0.01刻みに求めよ。ただし、結果はファイルに書き出すこと。 という問いがあり、プログラムは下記のようなものだったのですが、 #include <stdio.h> #include <math.h> double COS(double x); int main(void) { double a; FILE *fout; fout=fopen("file1.txt","w"); for(a=0;a<0.1;a=a+0.01) { fprintf(fout,"a=%f COS=%e cos=%e error=%e\n",a,COS(a),cos(a),COS(a)-cos(a)); } return 0; } double COS(double x) { double t; double y; int n; y=1.0; t=1.0; n=1; while(1) { t=-t*x*x/((2*n)*(2*n-1)); if(fabs(t)<=0.00001) break; y=y+t; n++; } return y; } これが、例えば、cos(x)ではなくsin(x)についてだった場合、上記の最初に書いてある条件もまったく同じでプログラムを作ったとすると、上記のプログラムのどこを変えればいいのでしょうか。どなたか教えてください。

  • sinの値を求めるプログラムでお聞きします。

    cos(x)の値をcosのテーラー展開の式から求めるプログラムを作り、無限級数の項の絶対値が0.00001以下になったら打ち切って、コンピュータで定義されるcos(x)の値との差を 0.0≦x≦0.1 の範囲で0.01刻みに求めよ。ただし、結果はファイルに書き出すこと。 という問いがあり、プログラムは下記のようなものだったのですが、 #include <stdio.h> #include <math.h> double COS(double x); int main(void) { double a; FILE *fout; fout=fopen("file1.txt","w"); for(a=0;a<0.1;a=a+0.01) { fprintf(fout,"a=%f COS=%e cos=%e error=%e\n",a,COS(a),cos(a),COS(a)-cos(a)); } return 0; } double COS(double x) { double t; double y; int n; y=1.0; t=1.0; n=1; while(1) { t=-t*x*x/((2*n)*(2*n-1)); if(fabs(t)<=0.00001) break; y=y+t; n++; } return y; } これが、例えば、cos(x)ではなくsin(x)についてだった場合、上記の最初に書いてある条件もまったく同じでプログラムを作ったとすると、上記のプログラムのどこどのように変えればいいのでしょうか。 分からなくて困っています。助けてください。

  • javaについて質問です

    3つの整数の中央値を求めるメソッドについて質問です。 まずは以下の2つのコードをご覧ください --------------(1)------------------ static int med3(int a,int b,int c){ if(a>=b){ if(b>= c) return b; else if(a<=c) return a; else return c; }else if(a>c) return a; else if(b>c) return c; else return b; } -----------(1)----------- -----------(2)----------- static int med3(int a,int b,int c){ if((b>=a&&c<=a)||(b<=a&&c>=a)) return a; else if((a>b&&c<b)||(a<b&&c>b)) return b; else return c; } -----------(2)----------- 上記の2つのメソッドは参考書の問題に載っているものです。 因みに問題文は、 「中央値を求める手続きは(2)のようにも実現できる。しかしこれは(1)に比べると、実行効率が悪い。その理由を考察せよ」 です。 この問題の解説について質問があります。 解説には、こうあります。 「最初のif文の判定   if ((b >= a && c<= a) || (b <= a && c >= a) に着目します。ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降で   else if ((a > b && c < b) || (b <= a && c > b) と行われます。つまり、最初のifが成立しなかった場合、2番目のifでも(実質的に)同じ判定を行っているため、効率が悪くなるのです。」 そこで2つ質問があるのですが、まず一つ目から。 「ここでb >= aおよびb <= aの判定を裏返した判定(実質的に同一の判定)が、続くelse以降でelse if ((a > b && c < b) || (b <= a && c > b)と行われます。」の部分の日本語は、一体どういう意味なのでしょうか? b >= a,b <= aの判定を裏返したものはb < a,b > aとなると思うのですが、しかしそれだとその後に続くelse if文の条件、(a > b && c < b) || (b <= a && c > b)と合いません。 2つ目の質問です。 なぜ、ifが成立しなかった場合、何故2番目のifでも同じ判定を行っていると言えるのでしょうか?

    • ベストアンサー
    • Java
  • 1と0の文字列作成

    1の後には0.9の確率で1、0.1の確率で0 0の後には0.9の確率で0、0.1の確率で1 という条件で、1と0の文字列作成しようと下のプログラムを作ってみました。 しかし実行してみるとなぜか1の後には0がきてしまうことが多く、条件のようになりません。 どこがおかしいのででしょうか? public class Sample{ public static void main(String[]args){ int a[]=new int[50]; Kansuu1 b = new Kansuu1(); Kansuu2 e = new Kansuu2(); a[0] = 0; for(int i=0; i<50; i++){ if(i==0){ System.out.print(0); }else{ int c = 0; if(a[i-1]==0){ c = b.kan1(a[i]); }else { c = e.kan2(a[i]); }System.out.print(c); } } } } class Kansuu1{ int kan1(int a){ if(Math.random()>0.9){ return 1; }else { return 0; } } } class Kansuu2{ int kan2(int a){ if(Math.random()>0.9){ return 0; }else { return 1; } } }

    • ベストアンサー
    • Java
  • クラスの継承、メソッドのオーバーライド

    ↓の問題が全然わかりません。 問題:サブクラスのsiki2にax2+bx+c=0(b2-4ac>0)とコンストラクタ を定義して、スーパークラスのsiki1にax+b=0とコンストラクタを定義し、解を求めるkaiメソッドを定義する という問題です。途中のプログラムを↓に書きました。 スーパークラス class houteisiki1{ private int kai; private int a; private int b; private int x; //コンストラクタ houteisiki1(int s, int d, int e, int f){ solve=s; a=d; b=e; x=f; } //kaiメソッド kai=(a*x)+b; } サブクラス class houteisiki2 extends houteisiki1{ static int kai(int a, int b, int c, int x){ kai=(a*x*x)+(b*x)+c; if((b*b)+(-4*a*c)>0){ return kai; }else{ println("エラー"); } } } テストクラス class test{ public static void main(string[] args){ ここまで作りましたが、解らなくなりましたので教えてください。 まだ、JAVAを勉強して日が浅いので解りやすく教えてください。

    • ベストアンサー
    • Java
  • クラスやメソッドが理解できません

    今javaを勉強中なのですが、クラスやメソッドで生きず待ってしまいました。 メソッドの定義は 戻り値の型 メソッド名(引数リスト) {  文;  ・・・ return 式;  } ですが、メソッドから返されえる値を戻り値といますよね?呼び出し元に値を返すってどういうことなのでしょうか? int getNum() { System.out.println("調べました") return num; } たとえば、上記のようなものですが。もしも、このメソッドを呼び出すと、”戻り値”が戻ってくるわけですが、これはgetNumという変数のなかに計算式が入っている?という考え方でいいのでしょうか? よろしくお願いいたします。

    • ベストアンサー
    • Java
  • メソッドの中に、作ったメソッドを呼び込みたいんですが

    メソッドの中に、作ったメソッドを呼び込みたいんですが シグネチャを int argCheck(String args[]) に指定して、 引数のチェック処理メソッドというものを作成してるんですが、 よくわからないんです。 内容は (1) 引数の数が1個でない場合、1を返却 (2) 引数が『aaa』でも『ZZZ』でもない場合、99を返却 (3) 以外は、0を返却 public class Test { public static void main(String args[]) { Test test = new Test(); int result = test.argCheck(args); test.argCheck(); //メソッドを呼び込み } private int argCheck(String args[]) { if(args[0].length != 1) // 引数の数が1以外の場合 { return 1; // 1を返す } else if (!args[0].equalsIgnoreCase("aaa") && !args[0].equalsIgnoreCase("ZZZ")) //引数が aaa でも ZZZ でもない場合(大/小文字区別せず) { return 99; // 99を返す } else // それ以外の場合 { return 0; // 0を返す } } }

    • ベストアンサー
    • Java
  • 内部クラスとのやりとり

    jRadioButtonが思うように動かなくて,困っています。 class A {  …  int jRB=10;  void jRadioButton1_actionPerformed(ActionEvent e) {   int jRB = 10;   B.repaint();  }  void jRadioButton2_actionPerformed(ActionEvent e) {   int jRB = 20;   B.repaint();  }  class B{   public double f(){     if(jRB==10){      return 式;     }else if(jRB==20){      return 式;     }else{      return 0;     }  }//f()    public void paint(Graphics g){     f()を使った式;    }  }//classB }//classA 実行結果は… jRadioButton1をクリックしても,jRadioButton2を押しても, 初期値で設定しているjRB=10の時の計算しか行われません。 jRadioButtonのイベント処理で記述している「jRB」の値が, if文の条件文とうまくいっていないようなのです。 「jRB」の設定の仕方が悪いのでしょうか。 どなたかわかる方,ご指摘をお願いします。 また,どのようにするのが良いのかアドバイスを下さい。 JBuilderを使って,アプレットを作成しています。

    • ベストアンサー
    • Java
  • 色変換のライブラリ探してます

    PHPでHSBまたはHSLからhexの色の値を出せるライブラリとかを探してます HSBまたはHSLから一方通行の変換だけできれば十分です また、なければ前にAS3で書いたのを 転用しようかと思ってるんですが とくになんの資料もなくテキトーに こうすればいけんじゃね?的に作ったものなので いろいろ不安です、ムダな処理とか そもそもHSBについて基本的に間違ってるとことか あったら指摘ください public static function HSBClr(H:Number,S:Number,B:Number):int { var H=Math.abs(H%360)/60; while(H<0)H+=6 var S=Math.min(Math.abs(S),100)/100 var B=Math.min(Math.abs(B),100)/100 var rtn:int=0x010101*Math.floor(B*(1-S)*255); var c=255*S*B; var r:int=0; var g:int=0; var b:int=0; if (H<1) { r=Math.floor(c); g=Math.floor(c*H); } else if (H<2) { r=Math.floor(c*(1-H%1)); g=Math.floor(c); } else if (H<3) { g=Math.floor(c); b=Math.floor(c*(H%1)); } else if (H<4) { g=Math.floor(c*(1-H%1)); b=Math.floor(c); } else if (H<5) { b=Math.floor(c); r=Math.floor(c*(H%1)); } else { b=Math.floor(c*(1-H%1)); r=Math.floor(c); } rtn+=r*0x010000+g*0x0100+b; return rtn; }

    • ベストアンサー
    • PHP
  • 値の渡し方?(初心者)

    以前質問したプログラムについて、新たに質問です。 メインプログラムと、関数プログラムを組みました。 関数の中では、print文を使うと計算は正しく行われていて、結果が正しいことが分かりました。 でうが、メイン文の出力では、どこにも出てこない変な値が出てきてしまいます。 値の渡し方がおかしいのでしょうか? 誰か、アドバイスをお願いします。 ***以下プログラムです。*** #include <stdio.h> #include <math.h> double gamma(double x) { double c[9],y,a,r,b,s,z; int i; a=1.; r=1.; c[1]=5.771916e-01; c[2]=9.882058e-01; c[3]=8.970569e-01; c[4]=9.182068e-01; c[5]=7.567040e-01; c[6]=4.821993e-01; c[7]=1.935278e-01; c[8]=3.586834e-02; printf("0 %f\n",x); while(1){ if(x>2.){ x=x-1.; a=a*x; printf("1 %f %f\n",x,a); } else if(x<1.){ a=a/x; x=x+1.; printf("2 %f %f\n",x,a); } else{ break; } } x=x-1.; for(i=1;i<9;i++){ b=(double)(i); s=(c[i]*((double)(pow(-1.,b)))*((double)(pow(x,b)))); printf("3 %d %f\n",i,c[i]); r=r+s; } y=a*r; printf("4 %lf\n",y); return y; } main() { double x,y; printf("数字を入力してください。"); scanf("%lf",&x); printf("メインプログラム x= %lf \n",x); y=gamma(x); printf("x= %f y= %f\n",x,y); }

専門家に質問してみよう