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

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

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

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

Q&A

解決済

4回答

1527閲覧

java.lang.StaticOverflowErrorについて

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

1クリップ

投稿2017/05/17 02:11

2つの自然数n,mの最小公倍数を求めるプログラムを作りたいのですが、これまたコンパイルまではできたのに実行結果で"java.lang.StaticOverflowError"が出てしまいました。
このエラーについて調べたところ、スタック・サイズを増やすだの、ほとんど起こらない問題だのとプログラミング初心者にはキャパオーバーな事柄ばかりで困っています。
ですが、アプリケーションの問題ではなく、根本的にプログラムのどこかが間違っているんだと私は思っています。どなたか解決策を教えていただけないでしょうか。

import java.util.Scanner; public class LCM{ public static int gcd(int n,int m){ int gcd,p; p=1; gcd=1; while((p<=n)&&(p<=m)){ if((n%p==0)&&(m%p==0)){ gcd=p; } p=p+1; } return gcd; } public static int lcm(int n,int m){ int lcm,gcd; gcd=gcd(n,m); lcm=1; lcm=n*m/gcd(n,m); return lcm(n,m); } public static void main(String[] args){ int n,m; Scanner sc=new Scanner(System.in); System.out.println("自然数nを入力してください"); n=sc.nextInt(); System.out.println("自然数mを入力してください"); m=sc.nextInt(); int lcm=lcm(n,m); System.out.println(n+"と"+n+"の最小公倍数は"+lcm(n,m)); } }

実行結果
自然数nを入力してください
4
自然数mを入力してください
6
Exception in thread "main" java.lang.StackOverflowError
at LCM.lcm(LCM.java:18)
at LCM.lcm(LCM.java:23)
at LCM.lcm(LCM.java:23)
at LCM.lcm(LCM.java:23)(以下省略)

よろしくお願いします。

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

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

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

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

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

yohhoy

2017/05/17 02:30

誤記だと思いますがStaticOverflowErrorではなくStackOverflowErrorですね。
退会済みユーザー

退会済みユーザー

2017/05/17 02:36

すいません。つい癖でStaticと書いてしまいました。
guest

回答4

0

よほど深い構造を調べるとか、繰り返しの最適化プログラムを再帰で書いたとかということがない限り、多くのStackOverflowError無限に再帰が続いてしまっていることによります。

java

1public static int lcm(int n,int m){ 2 /* (中略:この間にreturnやn、mの変更処理はなし) */ 3 return lcm(n,m); 4}

このような構造なので、同じ引数でメソッドを呼び続けてしまって、永遠に脱出できません。

投稿2017/05/17 02:17

編集2017/05/17 02:31
maisumakun

総合スコア145121

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

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

0

ベストアンサー

java

1 public static int lcm(int n,int m){ 2 return lcm(n,m); 3 }

lcmメソッドは、間の無駄を省くとこうなります。
こうなると、終わりのない再帰呼び出しになるため、スタックが無限に積みあがります。
辞書でAというわからない言葉を調べたら、「Aという項目を見ろ」と言っているようなものです。
人なら「意味ないじゃん」で終わりますが、コンピュータはそうではなく、前に調べたAという単語を置いておいて、新たにAを調べようとします。この「置いておく」記憶領域がスタックになります。
いずれスタックに積みきれなくなるため、当然スタックオーバーフローになります。

投稿2017/05/17 02:18

swordone

総合スコア20649

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

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

0

public static int lcm(int n,int m){ int lcm,gcd; gcd=gcd(n,m); lcm=1; lcm=n*m/gcd(n,m); return lcm; }

と書き直したところできました。
int gcdで'return gcd;'と書いたのに、int lcmでは別なんてそもそもおかしかったんですね。

投稿2017/05/17 02:34

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

swordone

2017/05/17 02:36

gcdについても言わせてもらうと なんで最大公約数求めるのに小さい側から探すのかとか、 そもそもなんで互除法使わないのかとか(そのことが頭にあったからStackOverflowErrorもそっちの再帰かと思ったら違ったという)
退会済みユーザー

退会済みユーザー

2017/05/17 02:40

元からあった不完全なプログラムを少しだけ手を加えて修正する課題だったので、私もなんで小さい方からやらないんだろうと疑問に思ってました。 お手数をおかけしてすいませんでした。
guest

0

java

1public static int lcm(int n,int m){ 2 int lcm,gcd; 3 gcd=gcd(n,m); 4 lcm=1; 5 lcm=n*m/gcd(n,m); 6 return lcm(n,m); 7}

lcmの中でlcm呼び出して
呼び出されたlcmの中でlcmを呼び出して
呼び出されたlcmの中でlcmを呼び出して
呼び出されたlcmの中でlcmを呼び出して
呼び出されたlcmの中でlcmを呼び出して
...

投稿2017/05/17 02:20

ozwk

総合スコア13512

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問