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

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

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

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

Q&A

解決済

3回答

4378閲覧

java.lang.StackOverflowErrorを解決したい。

Mequitazine

総合スコア8

JSP

JSP(Java Server Pages)とは、ウェブアプリケーションの表示レイヤーに使われるサーバーサイドの技術のことです。

Java

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

HTML

HTMLとは、ウェブ上の文書を記述・作成するためのマークアップ言語のことです。文章の中に記述することで、文書の論理構造などを設定することができます。ハイパーリンクを設定できるハイパーテキストであり、画像・リスト・表などのデータファイルをリンクする情報に結びつけて情報を整理します。現在あるネットワーク上のほとんどのウェブページはHTMLで作成されています。

0グッド

0クリップ

投稿2022/01/17 06:16

編集2022/01/18 07:57

学校の課題なのですが、預金をする際に整数を入力した際にこのエラーが出ました。
調べて自分でコードを見直してみたり、書き換えたりなどしているのですが解決の兆しが見えなかったので質問投稿させていただきます。
至らぬ点が多いため、コード不足や補足事項必要でしたらご指摘よろしくお願いいたします。
文字数の制限のため、預金処理以降のコードしか載せられませんでした。

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

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

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

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

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

int32_t

2022/01/17 06:27 編集

ExtendedBank のコードを開示してください。サーブレットのコードはたぶん不要です。
Mequitazine

2022/01/17 06:31

サーブレットのコードを削除して、追記しますね。
jimbe

2022/01/17 17:47

HashTable や -1 ~ -7 等のマジックナンバー、 get/set のネーミングルールを用いない等、何時の教材を使い回しをしているのやらと言った感じです。 何を変えて良くて何を変えてはいけないのでしょうか。
int32_t

2022/01/18 08:10

解決後でも、コードやスクリーンショットを削除しないでください。質問と回答が他者から見て意味不明になってしまいます。
guest

回答3

0

処理結果を示す戻りを無くして例外にしたり。(一応戻りの値は例外内に code として保存)

java

1package teratail_java.q_c9mdeundv32wxi; 2 3import java.util.HashMap; 4 5import teratail_java.q_c9mdeundv32wxi.Account.AmountException; 6 7public class ExtendedBank { 8 /** 口座例外 */ 9 public static class AccountException extends Exception { 10 public final int code; 11 public AccountException(String message, int code) { 12 super(message+" (code="+code+")"); 13 this.code = code; 14 } 15 } 16 17 /** 口座マップ */ 18 private HashMap<String,Account> customer = new HashMap<>(); 19 20 /** 21 * 口座オブジェクトを取り出す 22 * @param name 口座名 23 * @return Account オブジェクト 24 * @throws AccountException 口座が無かった場合 25 */ 26 private Account getAccount(String name) throws AccountException { 27 Account account = customer.get(name); 28 if(account == null) throw new AccountException(name+" NOT exists.", -7); 29 return account; 30 } 31 32 /** 33 * 金額文字列数値化 34 * @param amount 金額 35 * @throws AmountException 金額が処理出来ない場合 36 */ 37 private int parseAmount(String amount) throws AmountException { 38 try { 39 return Integer.parseInt(amount); 40 } catch(NumberFormatException e) { 41 throw new AmountException(amount, -4, e); 42 } 43 } 44 45 /** 46 * 口座開設 47 * @param name 口座名 48 * @throws AccountException 指定口座が既に有った場合 49 */ 50 public void open(String name) throws AccountException { 51 if(customer.containsKey(name)) throw new AccountException(name+" exists.", -7); 52 customer.put(name, new Account(name)); 53 } 54 55 /** 56 * 口座解約 57 * @param name 口座名 58 * @throws AccountException 指定口座が無かった又は残高が残っている場合 59 */ 60 public void close(String name) throws AccountException { 61 Account account = getAccount(name); 62 if(account.showBalance() != 0) throw new AccountException(name+" has balance.", -1); 63 customer.remove(name); 64 } 65 66 /** 67 * 預金 68 * @param name 口座名 69 * @param amount 金額 70 * @throws AccountException 指定口座が無かった場合 71 * @throws AmountException 金額が処理出来ない場合 72 */ 73 public void deposit(String name, String amount) throws AccountException, AmountException { 74 getAccount(name).deposit(parseAmount(amount)); 75 } 76 77 /** 78 * 預金 79 * @param name 口座名 80 * @param amount 金額 81 * @throws AccountException 指定口座が無かった場合 82 * @throws AmountException 金額が処理出来ない場合 83 */ 84 public void deposit(String name, int amount) throws AccountException, AmountException { 85 getAccount(name).deposit(amount); 86 } 87 88 /** 89 * 引き出し 90 * @param name 口座名 91 * @param amount 金額 92 * @throws AccountException 指定口座が無かった場合 93 * @throws AmountException 金額が処理出来ない場合 94 */ 95 public void withdraw(String name, String amount) throws AccountException, AmountException { 96 getAccount(name).withdraw(parseAmount(amount)); 97 } 98 99 /** 100 * 引き出し 101 * @param name 口座名 102 * @param amount 金額 103 * @throws AccountException 指定口座が無かった場合 104 * @throws AmountException 金額が処理出来ない場合 105 */ 106 public void withdraw(String name, int amount) throws AccountException, AmountException { 107 getAccount(name).withdraw(amount); 108 } 109 110 /** 111 * 残高照会 112 * @param name 口座名 113 * @return 預金残高 114 * @throws AccountException 指定口座が無かった場合 115 */ 116 public int showBalance(String name) throws AccountException { 117 return getAccount(name).showBalance(); 118 } 119}

java

1package teratail_java.q_c9mdeundv32wxi; 2 3public class Account { 4 /** 金額例外 */ 5 public static class AmountException extends Exception { 6 public final int code; 7 public AmountException(int amount, int code) { 8 super("amount="+amount+" (code="+code+")"); 9 this.code = code; 10 } 11 public AmountException(String amount, int code, Throwable cause) { 12 super("amount='"+amount+"' (code="+code+")", cause); 13 this.code = code; 14 } 15 } 16 17 /** 口座名 */ 18 public final String name; 19 /** 残高 */ 20 private int balance; 21 22 /** 23 * 口座 24 * @param name 口座名 25 */ 26 public Account(String name) { 27 this.name = name; 28 balance = 0; 29 } 30 31 /** 32 * 入金 33 * @param amount 金額 34 * @throws AmountException 金額が処理できない値の場合 35 */ 36 public void deposit(int amount) throws AmountException { 37 if(amount <= 0) throw new AmountException(amount, -3); 38 balance += amount; 39 } 40 41 /** 42 * 出金 43 * @param amount 金額 44 * @throws AmountException 金額が処理できない値の場合 45 */ 46 public void withdraw(int amount) throws AmountException { 47 if(amount <= 0 || balance < amount) throw new AmountException(amount, amount<=0?-3:-1); 48 balance -= amount; 49 } 50 51 /** 52 * 残高参照 53 * @return 残高 54 */ 55 public int showBalance() { 56 return balance; 57 } 58}

投稿2022/01/17 19:55

jimbe

総合スコア12632

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

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

0

パッと見、withdraw()の再帰呼び出しが無限ループになって落ちてそうですね。

投稿2022/01/17 06:42

javahack

総合スコア1088

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

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

0

ベストアンサー

java

1 public int deposit(String name,String amount){ // name:口座名 2 ... 3 d_result=deposit(name,amount);

amount のパーズ結果が正のとき、まったく同じ引数で自分自身を呼び出していて、無限再帰になっています。

d_result = deposit(name, result); としたかったんじゃないでしょうか。

投稿2022/01/17 06:40

int32_t

総合スコア20845

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

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

Mequitazine

2022/01/17 07:29

指摘されて見てみると、amountではおかしいことに気付けました。 本当にありがとうございます!値の受け渡しもうまくいき正常に動かせました!
javahack

2022/01/17 08:07

無限再帰はdeposit()の方でしたか。 エラー文をちゃんと読んでなかった。恥ずかしい。。。
int32_t

2022/01/17 08:13

javahack さんの言うとおり、withdraw(String, String) も同じような問題がありますね。
Mequitazine

2022/01/17 08:30

withdrawでも同じく発生しました。 お恥ずかしいのですが、さっきの解答のように w_result=withdraw(name,result); に直して実行してみたところ、残高以下の入力でもうまく引き出しが行えなえず詰まってしまったのですが、コードでおかしいなと感じた部分は他にはなかったでしょうか。
int32_t

2022/01/17 14:11

入力、期待される結果、実際の結果を添えて別の質問を立ててください。
jimbe

2022/01/17 17:53 編集

そもそも再帰は必要無いのでは・・・と思ったらオーバーロードしたメソッドの呼び出しだったんですね。失礼しました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問