スタックオーバーフローを起こす簡単プログラムを作れって、
大学の教授に言われたんですけど、さっぱり分かりません。
コンパイルと実行の仕方しかわからない自分にそんな過酷な課題を・・・
誰か助けてください。
そもそもスタックオーバーフローってなんなんですかね・・・。

このQ&Aに関連する最新のQ&A

A 回答 (5件)

スタックオーバーフローについては既に説明があるので、


サンプルプログラム
こんな感じでスタックを浪費するプログラムを作ればいいと思います。
sum(n)は、1~nまでの数値を足し込むプログラムですが、9000あたりでスタックオーバーフローします。
sum(10000)は50005000で、単純に計算すれば、intの範囲で計算できます。
------------------------------------------------------------

public class Calc {
static int sum(int n){
if(n>0)
return n+sum(n-1);
else
return 0;
}
static public void main(String[] argc){
System.out.println(sum(10000));
}
}

この回答への補足

これをスタックオーバーフローを起こさないようにするためには、
何か1文加える必要があるのでしょうか?
本当に素人なんで、初歩的な質問ですみません。

補足日時:2005/10/21 10:39
    • good
    • 0

#3>これをスタックオーバーフローを起こさないようにするためには、


答えの求め方自体に問題があるので、別の方法にするとか
例えばn*(n+1)/2で答えが求められます。
そうではなくて、例外が起こったときにもプログラムが終了しないようにするという意味ならエラーが起こりそうなところをtry{ }で囲み、catch{}で例外発生時の処理をします。
    • good
    • 0
この回答へのお礼

例外が起こったときにもプログラムが終了しないようにするという意味です。
質問があいまいで申し訳ありませんでした。
try{ }
catch{ }
という方法があるということは、非常に勉強になりました。
ありがとうございます。

お礼日時:2005/10/21 14:01

Javaで書くもっとも簡単な(短い)スタックオーバーフローを起こすものといえばこんな感じでしょう。


永遠に自分を呼びつづけるので一瞬で落ちます。

public class ErrorTest {
public static void main(String[] args) {
main(args);
}
}
    • good
    • 0

メソッドの呼び出しをすると、そのメソッドが終了したら呼び出し元に制御が戻りますよね?



これを実現するため、どこから呼んだのかを記録しておくのがスタックです。

ですから、ものすごくたくさんの回数のメソッドの呼び出しを行えば、スタックに記録しきれなくなりスタックオーバーフローが発生します。

ではどのくらい呼び出せばオーバーフローするかというと、とにかくたくさんで、普通にプログラムを作ったぐらいではオーバーフローはまず起こりません。

あとは自分で考えてみてください。
    • good
    • 3

スタックオーバーフローとはスタック(変数などを格納するメモリ領域)で発生するバッファオーバーフローのことです。

バッファオーバーフローについては参考URLで解説しています。
ただJavaではスタックオーバーフローが起こってもStackOverflowError()にスローされるので致命的な事態にはなりません。

Javaでは配列やStringではスタックオーバーフローを起こせません。そこで、再帰関数による無限ループなどを実行することでスタックオーバーフローエラーが起こります。

参考URL:http://e-words.jp/w/E38390E38383E38395E382A1E382 …

この回答への補足

FORTRANでも同じことが言えるのでしょうか?

補足日時:2005/10/20 17:02
    • good
    • 0

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Qjavaの課題でコンパイルエラーが出てきて困っています

学校の授業でjavaの課題が出たのですが、

javakadai.java:41: ここにインタフェースが必要です。
class javakadaiPanel extends JPanel implements ActionListener,ActionEvent{

というエラーが出て困っています。
どなたか解決方法を教えてくれませんか?

ソースは以下です。
よろしくお願いします。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing.JMenuItem;
import javax.swing.JCheckBoxMenuItem;
import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;
import javax.swing.JRadioButtonMenuItem;
import java.awt.Container;

public class JavaKadai {
public static void main(String[] args) {
JavaKadaiFrame frame = new JavaKadaiFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}

class JavaKadaiFrame extends JFrame {
JavaKadaiFrame() {
super();

setSize(300, 300);
setLocationRelativeTo(null);
setTitle("JavaKadai");

Container c = getContentPane();
c.add(new JavaKadaiPanel(getRootPane()));

}
}

class JavaKadaiPanel extends JPanel implements ActionListener,ActionEvent{
Color color = Color.black;
JCheckBoxMenuItem miR = new JCheckBoxMenuItem("R");
JCheckBoxMenuItem miG = new JCheckBoxMenuItem("G");
JCheckBoxMenuItem miB = new JCheckBoxMenuItem("B");

public JavaKadaiPanel(javax.swing.JRootPane root) {
setBackground(Color.black);

//メニューバーはJFrameのルートペインに追加
JMenuBar bar = new JMenuBar();
JMenu mnBack = new JMenu("BACK");

//メニュー構成
bar.add(mnBack);
mnBack.add(miR);
mnBack.add(miG);
mnBack.add(miB);

//ルートペインへメニューを追加
root.setJMenuBar(bar);

miR.addActionListener(this);
miG.addActionListener(this);
miB.addActionListener(this);

mnBack.setMnemonic('B');//[Alt]+[B]でアクセス
miR.setMnemonic('R');//[R]でアクセス
miG.setMnemonic('G');//[G]でアクセス
miB.setMnemonic('B');//[B]でアクセス
}

public void actionPerformed(ActionEvent e){
int R = miR.isSelected() ? 255:0;
int G = miG.isSelected() ? 255:0;
int B = miB.isSelected() ? 255:0;

color = new Color(R,G,B);
repaint();

}

public void paintComponent(Graphics g) {
super.paintComponent(g);

// 幅、高さ
int height = g.getClipBounds().height;
int width = g.getClipBounds().width;

// 塗潰し
g.setColor(color);
g.fillRect(0, 0, width, height);
}
}

まだ途中なので、現時点では不必要なimport文があります。
よろしくお願いします。

学校の授業でjavaの課題が出たのですが、

javakadai.java:41: ここにインタフェースが必要です。
class javakadaiPanel extends JPanel implements ActionListener,ActionEvent{

というエラーが出て困っています。
どなたか解決方法を教えてくれませんか?

ソースは以下です。
よろしくお願いします。

import javax.swing.JFrame;
import javax.swing.JPanel;
import java.awt.Graphics;
import java.awt.Color;
import javax.swing.JMenuBar;
import javax.swing.JMenu;
import javax.swing...続きを読む

Aベストアンサー

class JavaKadaiPanel extends JPanel implements ActionListener,ActionEvent{

class JavaKadaiPanel extends JPanel implements ActionListener{

QJAVAコンパイルと実行

はじめまして。質問があります。

eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。

コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。

実行できるプログラムとできないプログラムの違いは以下の通りです。

・実行できるプログラム
eclipseで新規でプロジェクトを作成。その直下にソースが存在し、クラスファイルも同じディレクトリに生成されます。

・実行できないプログラム
eclipseで新規でプロジェクトを作成。ソースフォルダ(src)を作成し、その下からパッケージ、クラスを作成しました。そうすると、エクスプローラでそのプロジェクトを見ると、binフォルダが生成されていました。その中にクラスファイルが生成されます。

違いはこのような感じです。実行できないプログラムをコマンドプロンプトで実行させるためにはどうしたらよいでしょうか?eclipseの使い方はだいぶわかってきたのですが、どのように動作しているか(java自体も)がわかりません。ご教授宜しくお願い致します。

OS:windows2000
開発環境:eclipse 3.0(J2SE 1.4.2_03)

はじめまして。質問があります。

eclipseで開発したjavaのソースを実行するとき、メニューからメインクラスを指定し実行するだけでプログラム実行されますが、そのプログラムをコマンドプロンプトで実行する場合、できるプログラムとできないプログラム(例外:NoClassDefFoundError)があります。

コンパイルはeclipceのほうで勝手に.classファイルが生成されるので、そのclassファイルをjava [ファイル名]と打つだけだと思います。

実行できるプログラムとできないプログラムの違いは以下の通りです。
...続きを読む

Aベストアンサー

eclipse使いではないので詳細は分かりませんが,eclipseのヘルプからeclipseコミュニティなどのサイトにアクセスしてみてはいかがですか?

もしくは”eclipse”でネット検索してみるとご希望のサイトが見つかるかもしれません。

Q明示的にコンパイルしてから実行するには

java eclipse3.5を使ってプログラミングの勉強をしています。

ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を
選択すればよいとかかれていたのでやってみたのですが、次のようなエラーが出てしまいます。

Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory

これらのクラスが書かれたソースファイルはすべて同じsocket.110というパッケージに入っています。

このエラーを取り除くには、どうすればよいのでしょうか?
分かる方お願いします。

ThreadMain.javaを載せますので、アドバイスお願いします。
package socket_110;



import java.net.*; // ServerSocket
import java.io.*; // IOException


public class ThreadMain {



public static void main(String[] args) throws Exception {



if (args.length != 3) //

throw new IllegalArgumentException("Parameter(s): [<Optional properties>]"

+ " <Port> <Protocol> <Dispatcher>");



int servPort = Integer.parseInt(args[0]); //

String protocolName = args[1]; //

String dispatcherName = args[2]; //



ServerSocket servSock = new ServerSocket(servPort);

Logger logger = new ConsoleLogger(); //



ProtocolFactory protoFactory = (ProtocolFactory) //

Class.forName(protocolName + "ProtocolFactory").newInstance();



Dispatcher dispatcher = (Dispatcher) //

Class.forName(dispatcherName + "Dispatcher").newInstance();



dispatcher.startDispatching(servSock, logger, protoFactory);

}

}

java eclipse3.5を使ってプログラミングの勉強をしています。

ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。あるサイトを見たら、【プロジェクト】ー>【すべて再ビルド】を
選択すればよいとかかれていたのでやってみたのですが、次のようなエラーが出てしまいます。

Exception in thread "main" java.lang.ClassNotFoundException: EchoProtocolFactory

これらのクラスが書かれた...続きを読む

Aベストアンサー

細かい確認ですが、

> ThreadMain.javaというプログラムを動かすのにEchoProtocolFactoryと
ThreadPerDispatcher.javaとPoolDispatcher.javaを明示的にコンパイ
ルする必要があるのです。

エラーに出ているEchoProtocolFactoryだけ拡張子がないですが、ソースファイルではない、ということでしょうか? それともこれがファイル名そのものなんですか?
ファイル名に拡張子がついてない、というオチだったりしないでしょうか。

QEclipseがコンパイル、および実行時に吐くコマンドについて

Eclipseがコンパイル、および実行時に吐くコマンドについて

JAVA初心者です。

JAVAのプログラムを作成した際、

$javac hoge.java
$java hoge

等とすると思います。

ここで質問なのですが、

###############  質問  #################

Eclipseで実行のボタンをおしてJAVAプログラムをコンパイル、実行した場合に、Eclipseが吐くコマンドを確認するためにはどのようにすればよろしいでしょうか?

######################################

というのも、http://oshiete.goo.ne.jp/qa/5928481.htmlで質問させていただいたことについて、Eclipseだとうまく実行できたので、Eclipseが吐くコマンドが確認できれば「自分の打ち込んだコマンドのどこが誤っていたのか」を知るヒントになると考えたからです。

どなたか方法をご教授頂けないでしょうか。よろしくお願いします。

Aベストアンサー

質問そのものへの回答ではないが、あちらが締められたのでこちらで補足。
前の質問の例であれば、
java -classpath twitter/twitter4j.jar:. Application
でtwitter4j.jarとカレントディレクトリ(/now)下のApplication.class等へのクラスパスが通ると思う。
linux系の場合は必要なパスを:で区切って-classpathまたは-cpで渡せばよい。

Qコマンドプロンプトでは、コンパイル実行できるのに、Eclipseではエラーが出ている。

javaを学習している者です。

「鉛筆パズルゲームプログラミング」という本で勉強しているのですが、その本のコードがコマンドプロンプト上で、与えられてたバッチファイルを実行すると、うまく実行できるのですが、今まで使っていたAll in one Eclipse3.1にソースコードをインポートするとエラーが出てしまいます。

なぜこうなってしまうのか、もし分かる方がいたら、よろしくお願いします。

Aベストアンサー

バッチファイルの中身を確認してみましょう。
ただ指定したソースコードファイルをコンパイルしているだけでなく、例えばクラスパスなどの環境変数を独自に設定しているなどの操作を行っているのかもしれません。だとすると、同じようにEclipseのプロジェクトにも設定する必要があります。

また、初歩的なことですが、ソースコードファイルの保管場所を間違えている(パッケージのディレクトリを正確に指定していない、など)というケアレスミスの可能性も再度確認してみては。


このQ&Aを見た人がよく見るQ&A

このカテゴリの人気Q&Aランキング

おすすめ情報