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

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

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

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

Q&A

解決済

2回答

6391閲覧

「このメソッドは型 ○○○○ の結果を戻す必要があります」のエラーの原因がわからない

Isikoro

総合スコア9

Java

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

0グッド

0クリップ

投稿2020/08/27 06:36

初心者です。

手持ちの参考書にある以下のコードをeclipseにて実行したところ、
次のエラーメッセージが出てしまい、原因をネットで色々調べたのですが分からず困っています。

ItemDAOクラスにて、戻り値であるItem型ArrayListのitemsを「return items;」と書いて返しているのになぜでしょうか...?

ご教授をいただけると有り難いです。

Exception in thread "main" java.lang.Error: Unresolved compilation problem:

このメソッドは型 ArrayList<Item> の結果を戻す必要があります

at ItemDAO.findByMinimumPrice(ItemDAO.java:9)
at Main.main(Main.java:5)

java

1import java.util.ArrayList; 2public class Main { 3 public static void main(String[] args) { 4 System.out.println("1円以上のアイテム一覧表を表示します"); 5 ArrayList<Item> items = ItemDAO.findByMinimumPrice(1); 6 for(Item item : items) { 7 System.out.printf("%10s%4d%4d",item.getName(), item.getPrice(), item.getWeight()); 8 } 9 } 10 11}

java

1import java.sql.Connection; 2import java.sql.DriverManager; 3import java.sql.PreparedStatement; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6import java.util.ArrayList; 7 8public class ItemDAO { 9 public static ArrayList<Item> findByMinimumPrice(int i) { 10 try { 11 Class.forName("org.h2.Driver"); 12 }catch(ClassNotFoundException e) { 13 e.printStackTrace(); 14 } 15 Connection con = null; 16 try { 17 con = DriverManager.getConnection("jdbc:h2:~/example", "sa", ""); 18 PreparedStatement pstmt = con.prepareStatement 19 ("SELECT * FROM ITEMS WHERE PRICE > ?"); 20 pstmt.setInt(1, i); 21 ResultSet rs = pstmt.executeQuery(); 22 // ここでItemを入れていくArrayListを準備 23 ArrayList<Item> items = new ArrayList<Item>(); 24 while(rs.next()) { // 結果表の全行を1つずつ処理 25 Item item = new Item(); 26 item.setName(rs.getString("NAME")); /* 1行分の情報を */ 27 item.setPrice(rs.getInt("PRICE")); /* インスタンスに変換 */ 28 item.setWeight(rs.getInt("WEGIHT")); 29 items.add(item); /* インスタンスをArrayListに追加 */ 30 } 31 rs.close(); 32 pstmt.close(); 33 return items; /* 最後にArrayListを返す */ 34 } catch(SQLException e) { 35 e.printStackTrace(); 36 } finally { 37 if(con != null) { 38 try { 39 con.close(); 40 } catch(SQLException e) { 41 e.printStackTrace(); 42 } 43 } 44 } 45 } 46}

java

1public class Item { 2 private String name; 3 private int price; 4 private int weight; 5 public String getName() { 6 return this.name; 7 } 8 public int getPrice() { 9 return this.price; 10 } 11 public int getWeight() { 12 return this.weight; 13 } 14 public void setName(String name) { 15 this.name = name; 16 } 17 public void setPrice(int price) { 18 this.price = price; 19 } 20 public void setWeight(int weight) { 21 this.weight= weight; 22 } 23}

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

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

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

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

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

guest

回答2

0

ベストアンサー

SQLExceptionが発生した場合、return items;を通りません。

投稿2020/08/27 07:01

momon-ga

総合スコア4820

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

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

Isikoro

2020/08/27 07:49 編集

ご回答ありがとうございました。 頂いた回答をヒントにエラー部分を特定しようと思い、デバッグ機能で1行ずつチェックしてみたのですがどうも、 ItemDAOクラスの public static ArrayList<Item> findByMinimumPrice(int i) { の時点(SQL接続の前?)で、エラーメッセージが出ているようです。 もしそうなら、SQLException以前の問題なのかなと思ったのですが、どうなのでしょうか....。
Isikoro

2020/08/27 07:49

あ、ちなみに、 ItemDAOクラスの public static ArrayList<Item> findByMinimumPrice(int i) { の行に、実行前に既に赤い×がついていてカーソルを合わせると 既に以下のメッセージが表示されています。 ************************************************************ この行に複数マーカーがあります - このメソッドは型 ArrayList<Item> の結果を戻す必要があります - メソッド・ブレークポイント:ItemDAO [エントリー] - ************************************************************
momon-ga

2020/08/27 08:04 編集

> SQLException以前の問題なのかなと思ったのですが、どうなのでしょうか....。 はい。その通りです。コンパイルエラーなので、それを直してください。 実際に、SQLExceptionが発生するか関係なく、発生した場合に戻り値が返せないコードになっています。
Isikoro

2020/08/27 08:15 編集

そうなんですね。頑張ってエラーの原因を見つけたいと思います。 ありがとうございました。
momon-ga

2020/08/27 08:17

えっと、コンパイルエラーの場所というか、原因は SQLExceptonが発生する場合、戻り値を返さないコードになってるからと回答していますが 実際に、どうしたいっていうの方針がありますか? なければ、e.printStackTrace();のあとに、return null;でコンパイルエラー自体は消えると思います。
Isikoro

2020/08/27 08:29

>e.printStackTrace();のあとに、return null; これを教えて頂いてようやく回答の意味するところが理解できました。 最初からそこまで頭が回れば良かったのですが。。。すみません。。。 上記の修正をしたら目的通りの結果を得ることが出来ました。 本当に助かりました。 ありがとうございました。
guest

0

既に書かれているとおり、return items;を通らないルートが存在するのが問題です。

JAVAでは、返り値のあるメソッドでは必ず返り値を返さないといけません。
例えば以下のように書いた場合、a0以下である場合には、returnを通ることなく、
メソッドは終了します。JAVAではこのようなコードはエラーとしてはじいてくれます。

JAVA

1if(a<0){ 2 return 0; 3}

今回の場合は、tryブロックの中で、例外が発生した場合、ブロックのそれ以降を飛ばして、
catch()finallyブロックの中に処理が飛ばされることになります。
その為、tryブロックの中の最後にあるreturn items;は飛ばされてしまい、実行されません。
JAVAのコンパイラはそういう事態を検知して、return items;が実行されない場合がある、と
エラーを出しているのです。
たとえ、例外が起きた時でも、何らかのreturnを返せるよう、見直してみてください。

投稿2020/08/27 08:26

amiya

総合スコア1218

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

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

Isikoro

2020/08/27 08:37

詳細にありがとうございました! 理解が深まりました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問