• ベストアンサー

メソッドは値を返さないというエラー?

お世話になります。 JAVAでプログラミングを始めたものですが、本を参考にコーディングしてコンパイルするとエラーになってしまいます。考え方がダメなのか何か足りないのか良く分かりません。 private long longValue(String A,long def) {   long val = def;   try {    if (A != null && !A.equals(""))      val = Long.parseLong(A);   }   catch (NumberFormatException e) {     return val;   } } エラーは、method dose not return a valueです。

noname#29100
noname#29100
  • Java
  • 回答数3
  • ありがとう数4

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

  • ベストアンサー
noname#16216
noname#16216
回答No.3

1.catch (NumberFormatException e) {}   return val; 2.catch (NumberFormatException e) {    return val;   }   return val;   } ↑の結果は全く変わりません。 ただし try~catch文というのは例外が発生したときのリカバリーのための処理を記述する方法ですので、意味が異なります。 1の場合、long型への変換の最中に発生する NumberFormatException は、プログラムの処理の中で「無視する」「処理を続ける」べきエラーとして認識しています。 2の場合、NumberFormatException はエラーとして認識され、このエラーが発生した場合には、リカバリー処理として val を返却値として返すことを明確にします。 どちらが適切かは、この longValue() がどのような場合に呼ばれるのかを考えた上で判断すべきです。。。 今の場合には、それこそどちらでもいいように思いますが。。。 もっと複雑なプログラムになった場合には、そのエラーを無視するのか、それともリカバリーの処理を行うのかを考える必要があるということですね。 ちなみに、 private long longValue(String A,long def) {  long val = def;  try {   if (A != null && !A.equals(""))     val = Long.parseLong(A);  }  catch (NumberFormatException e) {   // 例外が発生したことを表すメッセージや、   // エラーをリカバリーする処理を記述する  } finally {   return val;  } } のように記述して、例外が発生してもしなくても、val を返却値とするのも1つの方法だと思いますね。 こう記述すると、他の人が見たときに、NumberFormatException が発生するのは想定外の値が来た場合だが、問題ないので val を返却してると言うことが、明確になります。

noname#29100
質問者

お礼

分かりやすい説明ありがとうございました。今後もお願いします。

その他の回答 (2)

noname#16216
noname#16216
回答No.2

> 参考書には、 > catch (NumberFormatException e) >  return val; > となっていて、{}がありません。 > 無い文法があるとか? 本当に {} がなければ、誤植ということではないでしょうか。 おそらく、参考書が記述したいのは  try {   if (A != null && !A.equals(""))    val = Long.parseLong(A);  }  catch (NumberFormatException e) {}  return val; だと思われます。 上記のように記述すると、「String A」が long型 に変換できれば その値を、変換できなければ、デフォルト値として「long def」の 値を返却するようになりますが。

noname#29100
質問者

お礼

回答ありがとうございました。 単にミスプリ?だったのでしょうかね。 通常は、{}を省略するものではないと思うのですが・・。 回答をいただいた  catch (NumberFormatException e) {}  return val; と  catch (NumberFormatException e) {  return val;  }   return val; } とでは意味が違うのでしょうか? ちょっと疑問になりました。

  • yuji
  • ベストアンサー率37% (64/169)
回答No.1

Exceptionが発生しない場合に実行するreturn文が ないからエラーになります。 private long longValue(String A,long def) {  long val = def;  try {   if (A != null && !A.equals(""))    val = Long.parseLong(A);  }  catch (NumberFormatException e) {   return val;  }  return val; // ここに return 文がないからエラー } ※でも、これだと、catch () { }の中のreturn文の  存在意義がなくなりますが。

noname#29100
質問者

お礼

早々の回答ありがとうございます。 参考書には、 catch (NumberFormatException e)   return val; となっていて、{}がありません。 無い文法があるとか? 例外処理として文字列を整数に変換できなかた場合valのみを返すだけで良いのですが・・・。 ご指摘の通り追加したところエラーは無くなりました。 また、他の方やyujiさんからのご意見をお待ちして、締め切りたいと思います。

関連するQ&A

  • throwsについて

    こんにちは。 最近、JAVAの勉強を始めたのですがわからない点がありましたので質問に参りました。 こちらのページに http://msugai.fc2web.com/java/throws.html > コンパイル時に、スローされた例外が呼び出し元でキャッチされているかどうかチェックされます。 > キャッチされていなければ、コンパイルエラーになります。 とあったので試しに以下のようなコードを作りました。 class SampleException { public static void main(String[] args) { //try{ exMethod(); //} //catch(NumberFormatException e){} //catch(Exception e){} } private static void exMethod() throws NumberFormatException { String notnum = "非数値"; int suti = Integer.parseInt(notnum); } } (try~catchはコメントアウトしたまま) この説明の通りならコンパイルエラーが出るだろうと思ったのですが コンパイルしてみると成功してしまいました。 (throwsにExceptionを追加すればコンパイルエラーは出ます。) throws NumberFormatExceptionと記述しておけば このメソッド使うときはNumberFormatExceptionかExceptionの例外処理を 必ずしなくてはならないものだと思っていたのですが これは私の認識違いなのでしょうか? それともコードが何か間違えているのでしょうか? よろしくお願いします。

  • 二つの変数の値を入れ替えるメソッドを作成できますか?

    メソッドに二つの同じ型の変数を渡し、その値を入れ替えるメソッドを作りたいのですが、Java では、関数の参照渡しができないためにできません。 できるだけシンプルな記述にしたいのですが、何か方法のわかる方、降りましたら書き込みお願いします。 ちなみにクラスをひとつ作ればできることはわかっています。 <例> public class MainProc { /** * @param args */ public static void main(String[] args) { // TODO Auto-generated method stub ObjectPair objPair = new ObjectPair(); objPair.setObjValue1(new Integer(1)); objPair.setObjValue2(new Integer(2)); objPair.ReplaceValue(); System.out.println("intValue1:"+objPair.getObjValue1()); System.out.println("intValue2:"+objPair.getObjValue2()); } } public class ObjectPair { private Object objValue1 = null; private Object objValue2 = null; public void ReplaceValue(){ Object objWork = objValue1; objValue1 = objValue2; objValue2 = objWork; } public Object getObjValue1() { return objValue1; } public void setObjValue1(Object objValue1) { this.objValue1 = objValue1; } public Object getObjValue2() { return objValue2; } public void setObjValue2(Object objValue2) { this.objValue2 = objValue2; } } よろしくお願いします。

    • ベストアンサー
    • Java
  • constのついたメンバ関数

     こんにちは。 C++を勉強しているのですが疑問に思ったことがあります。 const指定したメンバ関数にメンバ変数の変更をすることはエラーになるはずなんですが、 下記にある(*m_pRefCnt)++; はコンパイルが通るようです。 なぜこの一文だけ通るのでしょうか? 以下にソースを添付しておきます。 #include <iostream> class hogeClass { private: int* m_pRefCnt; int val; void AddRef() const { (*m_pRefCnt)++; // これはOK? val = 100; // これは駄目 } void Release() { } public: explicit hogeClass(char* src = NULL) : val(0) { } int& GetRefCnt() { return *(m_pRefCnt); } virtual ~hogeClass() { Release(); } }; int main() { int c = 435, k = 222; using namespace std; hogeClass a; getchar(); return 0; } 分かる人がいたらよろしくお願いします。

  • defファイルの扱い方

    DEFファイルをつくったら、同じフォルダに入れておけば、コンパイルするときに自動的に影響を与えてくれるのでしょうか? しかしそれではできないようなので、DEFファイルをコンパイルオプションなどに織り込んで明示しなければいけないのでしょうか? 例 //mydll.c int returnInt(int a){ return a; } これをコンパイルしてmydll.dllに。 //mydll.def LIBRARY mydll EXPORTS returnInt @1 NONAME これを同じディレクトリに。 //usedll.c #include <windows.h> int main(){ &nbsp;HINSTANCE hinstDLL; &nbsp;FARPROC pProc; &nbsp;hinstDLL = LoadLibrary("mydll.dll"); &nbsp;if(!hinstDLL){ &nbsp;&nbsp;puts("hinstDLL is NULL"); &nbsp;&nbsp;return 0; &nbsp;} &nbsp;pProc = GetProcAddress(hinstDLL, MAKEINTRESOURCE(1)); &nbsp;if(!pProc){ &nbsp;&nbsp;puts("pProc is NULL"); &nbsp;&nbsp;return 0; &nbsp;} &nbsp;printf("%d\n",pProc(9)); &nbsp;return 0; } これで使おうとしたらGetProcAddressの戻り値がNULLでした。 なにがいけないんでしょう?

  • 関数の引数に未定義の変数を渡すとエラーが出る

    自作の関数で、issetとemptyを一緒に判定する関数を作っているのですがエラーが出ます。 ある変数が「未定義」または「null」または「""(空白)」の場合はnullである、という関数を作りたいです。 ------------------------------------------ function is_null_ex($value){  if (!isset($value)) {return true;}               // 未定義かnullの場合、trueを返す  else if (strlen(strval($value)) === 0) {return true;}   // 空白の場合はtrueを返す  else {return false;}                      // $valueに値が入っている場合はfalseを返す } is_null_ex($val); ------------------------------------------ 上記の関数で$valueが未定義の場合にfuncを使うと、次のようなエラーが出ます。 Notice: Undefined variable: val つまり、未定義の変数を引数に渡すとエラーが出ます。 「未定義なら関数に渡さなければ?」と思うかもしれませんが、そもそもこの関数は「未定義」または「null」または「""(空白)」を判定したい関数なのです。 この場合、どうすれば良いのでしょうか? エラーは出ますが上記の関数で「if (!isset($value)) {return true;}」の部分できちんと判定はされています。 PHP5.3系で運用しています。 ぞうぞよろしくお願い致します。

    • ベストアンサー
    • PHP
  • requireでエラーが起きてしまう

    requireでエラーが起きてしまう タイトルのとおり、requireの箇所でエラー(no such file to load)が起きてしまって先に進めない状態なので、どなたか解決策がわかるかたいらっしゃいましたら教えてください>< 今、 method_area.rb -- def triangle(x, y) return (x * y / 2) end def square(x) return x**2 end -- main.rb -- require 'method_area.rb' puts(triangle(8, 24)) puts(square(15)) -- の2つのファイルを同じディレクトリに置いています。

    • ベストアンサー
    • Ruby
  • java equalsメソッドについて

    こんにちは。 java初心者ですがandroidを触ることになりました。 不可解なコードで大変恐縮ですが、ご教授願えれば幸いです。 スピナーでセレクトされた文字列と変数(A,B,C,D)の値を比較して条件分岐させたいのですが、 うまくいかず悩んでいます。 下記コード ■■■の部分になります。 1) スピナーに表示される文字列を取得し、変数itemqに代入。 2) 変数A(SONY)と変数itemq(?)を比較し、同じ文字列か比較する。 3) 同一の値であればitemqの値をテキストビューに値をセットする。 というようなものです。 equalsメソッドで比較しているのですが、この部分がどうやら間違っているようなのですが、 原因が全く分かりません。 無知な質問になりますが、どうぞ皆様宜しくお願いいたします。 またコードについての指摘や助言もおねがいします。 public class SampleActivity extends Activity { String path = "/sdcard/PriceSearch/topitems.csv"; static List<String> items = new ArrayList<String>(); static ArrayAdapter<String> adapter; private ListView listview; public String itemq; /** Called when the activity is first created. */ @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); final Spinner spinner = (Spinner)findViewById(R.id.spinner1); // read csv file readCsvFile(spinner); spinner.setOnItemSelectedListener(new OnItemSelectedListener(){ public void onItemSelected(AdapterView<?> parent, View viw, int arg2, long arg3) { Spinner spinner = (Spinner)parent; String item = (String)spinner.getSelectedItem(); //トースト表示 Toast.makeText(Price_SearchActivity.this, item, Toast.LENGTH_LONG).show(); itemq = item; listread(); } //Spinnerのドロップダウンアイテムが選択されなかった時 public void onNothingSelected(AdapterView<?> parent) { }}); Button button1 = (Button)findViewById(R.id.btnend); button1.setOnClickListener(new View.OnClickListener() { //@Override public void onClick(View v) { //Activity終了 finish(); return; } }); } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ String A = "SONY"; String B = "TOSHIBA"; String C = "MITSUBISHI"; String D = "FUJITSU"; private void listread() { TextView tv = (TextView)findViewById(R.id.textView2); if (A.equals(itemq) ) { tv.setText(itemq); }else if (B.equals(itemq) ) { tv.setText("itemq"); }else if (C.equals(itemq) ){ tv.setText("itemq"); }else if (D.equals(itemq) ){ tv.setText("itemq"); }else { tv.setText("該当なし"); } } //■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■■ private void readCsvFile(Spinner spinner) { try { // create reader InputStream input = new FileInputStream(path); InputStreamReader ireader=new InputStreamReader(input, "UTF-8"); CSVReader reader = new CSVReader(ireader,',','"',0); String[] csv; //スピナー用 ArrayAdapterを作成 ArrayAdapter<String> adapter = new ArrayAdapter<String>(this, R.layout.spinner); while ((csv = reader.readNext()) != null) { //ドロップダウンアイテムの追加 adapter.add(csv[0]); } //スピナーにadapterを設定 spinner.setAdapter(adapter); reader.close(); ireader.close(); input.close(); } catch (FileNotFoundException e) { Log.e("ERROR", e.toString()); } catch (UnsupportedEncodingException e) { Log.e("ERROR", e.toString()); } catch (IOException e) { Log.e("ERROR", e.toString()); } } }

    • ベストアンサー
    • Java
  • コード中の謎のエラー

    javaを勉強している者です。 あるコードで謎のコンパイルエラーが出てしまいます。下記の中のnumOfLine++; という箇所です。 Eclipseでやっているのですが、「到達不能コード」と出ています・・・。 よろしくお願いします。情報が足りない場合はその旨お願いします。 public static int readToEnd(BufferedReader in){ int numOfLine = 0; while(true){ String ret; try { ret = in.readLine(); if(ret.equals("."));{ break; } numOfLine++;//ここ } catch (IOException e) { e.printStackTrace(); } } return numOfLine; }

    • ベストアンサー
    • Java
  • Excel VBA のコンパイルエラー

    Excel VBA で GDI32 にある API を declare するとメモリ不足のコンパイルエラー となってしまいます。 どなたか解決策を御教示下さい。 使用するAPI は GetTextExtentPoint32 です。 コンパイルエラーが起きるVBAコードは、MSのVBサンプルから拾ったものです。 private Declare Function GetTextExtentPoint32 Lib "gdi32" Alias "GetTextExtentPoint32A" ( _ ByVal hdc As Long, _ ByVal lpsz As String, _ ByVal cbString As Long, _ ByRef lpSize As CSize) As Long Private Type CSize cx As Long cy As Long End Type 同じ GDI32 にある DeleteObject の declare 文はエラーが発生しません。 環境は以下の通りです。 Excel 2007 OSはVista 32bit メモリは 3G で約60%使用 宜しくお願いします。

  • 逆コンパイルの見方について(再度)

    Jad v1.5.8e.で逆コンパイルしています。下段のParseException e;をどう理解していいか分かりません。恐らくsdfFrom.parse(val)との関係だと思うのですが public class Formatter { public Formatter() { } public static String convDateFormat(String val, String formatFrom, String formatTo) throws IllegalArgumentException { SimpleDateFormat sdfFrom; SimpleDateFormat sdfTo; if(val == null || formatFrom == null || formatTo == null) { throw new IllegalArgumentException(); } sdfFrom = Util.getSDF(formatFrom); sdfTo = Util.getSDF(formatTo); sdfFrom.setLenient(false); sdfTo.setLenient(false); return sdfTo.format(sdfFrom.parse(val)); ParseException e; e; return val; } 何卒、宜しく御願いします。

    • ベストアンサー
    • Java