Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

Outofmemoryエラー

10進数を指定のn進数に変換するプログラムを書きましたが、Outofmemoryエラーが出ました
原因と思われる文は以下の通りです。
nは変換する10進数表記の数字、n2は指定するn進数のnの数値
    static StringBuffer GetArray(int n,int n2){
        int num=n;
        int num2=n2;
        StringBuffer Str=new StringBuffer("");
        String R;
        int r,q;
        do{
            r=num%num2;
            q=num/num2;
            R=String.valueOf(r);
            Str.append(R);//エラー文ではここの行数が表示されていた
        }while(q !=0);
        Str.reverse();
        return Str;
    }
}
        
        

2

回答

378

閲覧

2件の回答

評価

30

OutOfMemoryはStringBufferの中身にデータを入れすぎて(apppendしすぎて)VMのメモリーが
足りなくなったからです。そうなったのはdo文が無限ループに陥ってるからです。

初心者のうちはコードをみても知識不足や勘違いで原因がわからないものです。
ひょっとしたらjavac/javaコマンドでコンソールからプログラムを試してないでしょうか。
その方法は初心者には厳しすぎると思います。IDEを使って一行ずつ実行しながら
変数の値を見るといったデバッグができる環境で勉強することをお勧めします。

評価

30

現象だけが書かれていて、確認したこと、回答者に何を求めているかを書いてない。
つまり質問になってない。

コマンドラインでやる場合は、古典的なprintデバッグをすればいい。
デバッグの基本は、どこまで期待通りで、どこからおかしいのかを追ってみることだ。
直接答えを求めるのではなく、自力で見つけれられるテクニックを身に付けることを考えよう。



で、1つ目の回答者へ。
初心者には厳しすぎる、はおかしい。統合環境ができるまでは皆そうやっていたんだ。
さらに遡れば、端末でジョブを作ってホストにコンパイル依頼していた。
この頃はデバッグといえばプリントアウトして目視で追うもので、お試し実行など以ての外だった。また印刷するにもジョブをつくる必要があった。そして、それが当たり前だった。

今のツールが楽なことと、初心者に厳しいかどうかとはまた別の話だ。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。