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

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

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

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

Q&A

0回答

2588閲覧

スタックオーバーフローの原因箇所がわかりません。

koushi3192

総合スコア0

MySQL

MySQL(マイエスキューエル)は、TCX DataKonsultAB社などが開発するRDBMS(リレーショナルデータベースの管理システム)です。世界で最も人気の高いシステムで、オープンソースで開発されています。MySQLデータベースサーバは、高速性と信頼性があり、Linux、UNIX、Windowsなどの複数のプラットフォームで動作することができます。

JDBC

JDBC(Java DataBase Connectivity)は、Javaとリーレーショナルデータベースに接続させる基本的なAPIです。Java上でSQLステートメントを発行することで、データベースの種類に影響を受ないDB操作を可能とします。

Java

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

0グッド

2クリップ

投稿2021/06/23 17:24

編集2021/06/24 02:38

前提・実現したいこと

Javaで銀行システムを実装しています。

JDBCを使用してデータベースへ接続しSQLによるデータベースへのアクセスと実行結果の受け取りを行います。

getメソッドは引数で指定された口座情報をデータベースから読み出し、Accountクラスのオブジェクトを作成し戻り値として返します。口座が存在しない場合はnullを返します。

以上の機能を実装中にエラーメッセージが発生しました。

発生している問題・エラーメッセージ

java.lang.StackOverflowError

該当のソースコード

java

1import java.sql.DriverManager; 2import java.sql.Connection; 3import java.sql.Statement; 4import java.sql.ResultSet; 5import java.sql.SQLException; 6 7public class DBtable{ 8 private String user = ""; 9 private String password = ""; 10 private String db_url = ""; 11 12 public Account get(String name){ 13 String myName;//読みだす口座名 14 int myBalance;//読みだした残高を入れる変数 15 Connection conn = null;//データベースへの接続 16 Statement stmt = null;//SQL文の実行用オブジェクト 17 try{ 18 //データベースからデータを読み出す 19 conn = DriverManager.getConnection(db_url, user, password); 20 stmt = conn.createStatement(); 21 22 String sql = "SELECT * FROM customer WHERE name ='"+name+"'"; 23 ResultSet rs = stmt.executeQuery(sql); 24 if(rs.next()){ 25 myBalance = rs.getInt("balance");//変数への残高の格納 26 } 27 rs.close(); 28 }catch(SQLException e){ 29 return null;//エラーは表示せずnullを返す 30 }finally{ 31 try{ 32 if(stmt != null) { 33 stmt.close(); 34 } 35 if(conn != null) { 36 stmt.close(); 37 } 38 }catch(SQLException e){ 39 return null;//エラーは表示せずnullを返す 40 } 41 } 42//後処理 戻り値となるAccountオブジェクトの生成 43 Account myAccount = new Account(name); 44 myAccount.deposit(myBalance); 45 return myAccount; 46 }

Java

1public class Bank{ 2 private DBtable customer;//口座リスト 3 4 public Bank(){//口座リストを初期化 5 customer = new DBtable(); 6 } 7 8 public int open(String name){//口座開設 9 Account x = customer.get(name); 10 if(x == null){ 11 Account myName = new Account(name); 12 customer.put(name,myName);//口座開設 13 int balance = customer.get(name).showBalance(); 14 return 0; 15 }else{ 16 return -7; 17 18 } 19 }

試したこと

Hashtableクラスを使用した場合は問題なく動きました。
DBtableクラスへ変更するとエラーが起きてしまいます。
DBtableクラスのgetメソッドをBankクラスで呼び出しています。

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

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

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

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

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

K_3578

2021/06/23 23:58

StackOverflowになるということは、無限ループになっているのでは?
dodox86

2021/06/24 00:30

> DBtableクラスへ変更するとエラーが起きてしまいます。 そのDBtableクラスとやらは、自作のものですよね。現状挙げられているコードでは第三者には「使い方が悪いのでは」と言う推測以上の判断はつかないと思いますよ。
koushi3192

2021/06/24 02:42

ありがとうございます。 ソースコードを変更してみました。つたない質問で申し訳ありません。
momon-ga

2021/06/24 03:27 編集

myBalanceが未初期化の可能性でコンパイルエラーになると思うのだけど・・・ 正しいソースコードを載せないと回答できない
dameo

2021/07/14 23:58

コードは読んでいません。 スレッドごとにネストして呼び出せるメソッドの最大回数が決まっており、それを決めるのがスタックサイズです。スタックサイズが溢れてしまうと、StackOverflowErrorが発生します。例えば以下のようなコードで起こすことができます。 class StackoverflowSample { private static void recursive(int count) { if (count > 0) { recursive(count - 1); } } public static void main(String[] args) { for (int i = 1; true; ++i) { System.out.println(i); recursive(i); } } } OracleのJavaVMでは、-Xssオプションなどでこのスタックサイズを調整することができます。現在値を知る方法は (unix系)java -XX:+PrintFlagsFinal -version | grep ThreadStackSize (windows系)java -XX:+PrintFlagsFinal -version | findstr ThreadStackSize などです。 現在値を倍にするなどして頻度が減るのであれば、値の調整で済む可能性がありますが、スレッドごとの使用メモリは増えるので別の問題が発生する可能性があります。頻度が減らないのであれば、再帰呼出が無限に実行されている可能性があり、その場合はコードの修正が必要になると思います。 いずれにしても、スタックトレースは出ていると思うので、解析調査は比較的容易だと思うのですが...。 ※お返事を頂いてもこちらからはもうお返事を返せません。あしからず。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問