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

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

ただいまの
回答率

90.40%

  • Android

    7500questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。

Android用サイコロアプリの無駄な動作を教えてほしい

解決済

回答 2

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,034

本文
うまく動くようになったので改善できるところを教えてください。
(例外は発生しているか試しました)

package com.mycompany.myappdiceplus;
import android.app.*;
import android.os.*;
import android.widget.*;
import android.view.View.*;
import android.view.*;
import java.util.*;
import android.media.*;
import android.content.*;
import android.widget.AutoCompleteTextView.*;

public class MainActivity extends Activity{
    MediaPlayer SE;


    protected void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        Button button=(Button)findViewById(R.id.bn);
        button.setOnClickListener(new OnClickListener(){
                public void onClick(View Vector){

                    final EditText DC=(EditText)findViewById(R.id.Dc);
                    TextView math=(TextView)findViewById(R.id.text);
                    math.setText("???");
                    final EditText MAX=(EditText)findViewById(R.id.MAX);
                    final EditText kai=(EditText)findViewById(R.id.math);
                    SE.start();
                    int max=0;
                    int dice = 0;

                    int kaisu=0;


                    max=Integer.parseInt(MAX.getText().toString());
                    dice=Integer.parseInt(DC.getText().toString());
                    kaisu=Integer.parseInt(kai.getText().toString());
                    try
                    {
                        Thread.sleep(1500);
                    }
                    catch (InterruptedException e)
                    {
                        e.printStackTrace();
                        System.exit(1);
                    }
                    int[] sum = new int[kaisu];
                    StringBuilder strings=new StringBuilder();
                    int Random = 0;

                    int dex=sum.length;
                    dex--;
                    for(int i=0;i<=dex;i++){
                        sum[i]=new Random().nextInt(max);
                        Random+=sum[i];
                    }
                    strings.append(Random <= dice ? "成功(" : "失敗(");
                    strings.append(Random).append("=");

                    for(int index:sum){
                        strings.append(index);
                        strings.append(",");
                    }
                    strings.append(")");

                    String ans=strings.toString();
                    math.setText(ans);
                }
        });
    }

    @Override
    protected void onResume()
    {
        super.onResume();
        SE = MediaPlayer.create(this, R.raw.niconico);

    }

    @Override
    protected void onDestroy()
    {
        onStop();
        super.onDestroy();
    }
}


直る前の文
結果:成功か失敗(右の合計=乱数,乱数…)
と表示したいのですが、
結果:成功(0=)
どうしてでしょうか。直し方を教えてください。
一部省く…

try{
max=Integer.parseInt(MAX.getText().toString());
dice=Integer.parseInt(DC.getText().toString());
kaisu=Integer.parseInt(kai.getText().toString());
Thread.sleep(1500);
}
catch (Exception e){
}
int kaisu-1;

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

質問への追記・修正、ベストアンサー選択の依頼

  • swordone

    2016/04/05 11:46 編集

    ついでに実行時の各パラメータ(max, kaisuなど)の中身も確認しておいたほうがいいですよ

    キャンセル

  • sun-solar-arrow

    2016/04/05 11:48

    分かりました。

    キャンセル

  • sun-solar-arrow

    2016/04/05 14:49

    皆さん、ありがとうございました。最初の質問が解決したためベストアンサーを決めることにしました。
    この後も回答しようとしていたかたもいたかもしれませんが申し訳ございません。
    皆さんありがとうございました!

    キャンセル

回答 2

checkベストアンサー

+1

正直無駄が多く感じ、意味のない操作があるようだったので、肝要な部分だけ抜き出して書きなおしてみました。(Java環境で動くよう乱数発生して合計し判定という部分だけで実行する)

import java.util.Random;

public class Q31458 {

    public static void main(String[] args) {
        int max = 25;
        int dice = 100;
        int kaisu = 5;

        try {
            Thread.sleep(1500);
        } catch (Exception e) {
            e.printStackTrace();
        }

        kaisu -= 1;
        int[] sum = new int[kaisu];
        StringBuilder strings = new StringBuilder();
        int random = 0;

        Random random2 = new Random();
        for (int i = 0; i < kaisu; i++) {
            sum[i] = random2.nextInt(max);
            random += sum[i];
        }

        strings.append("結果:")
            .append(random <= dice ? "成功(" : "失敗(")
            .append(random).append("=");
        for (int i : sum) {
            strings.append(i);
            strings.append(",");
        }
        strings.append(")");

        String ans = strings.toString();
        System.out.println(ans);
    }

}


これを実行した結果、


結果:成功(74=21,10,23,20,)


などのようになり、問題の現象が発生しません。
kaisu -= 1;などの意味不明な操作も気になるのですが、一番問題がありそうなのは、EditTextから取得した文字列を数値に変換する段階で例外が発生している可能性があり、しかもそれがcatch節で握りつぶされてしまっていることです。
その部分のcatchでログを出してチェックするか、catchする例外をInterruptedExceptionに限定するべきです。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 11:47 編集

    直してみました。今はスマホのAIDEで開発しているのでRoot化していないためlogが分からないから
    IntnrruptedExceptionをcatchするようにし、
    catchしたらSystem.exit(1);
    のように強制終了させるようにしましたが、強制終了はしていませんでした。
    無駄な動作を省きやってみます。
    しかし、初心者なので無駄な動作というのがあまり分かってません。ですから思い当たるものだけ消してみます。

    キャンセル

  • 2016/04/05 11:55

    kaisu-1を消したら動くようになりました。

    キャンセル

  • 2016/04/05 12:21

    しかし、
    append(random <= dice ? "成功(" : "失敗(")
    は便利です。一気にコードが短くなりました。
    教えて下さりありがとうございました。

    キャンセル

0

kaisu-=1; 
int[] sum = new int[kaisu]; 
StringBuilder strings=new StringBuilder(); 
int Random = 0;

int dex=sum.length-1; 
for(int i=0;i<=dex;i++){ 
sum[i]=new Random().nextInt(max); 
Random+=sum[i]; 
}


ここで常にdexが-1になるので
Randomが常に0になります。
そのためRandom <= diceが常に成り立ち成功になります。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2016/04/05 12:56

    確かにスマホだと気づかないですよね。

    キャンセル

  • 2016/04/05 13:04

    Thread.sleep(1500);している意図は何でしょうか。
    意味がないように思います。

    キャンセル

  • 2016/04/05 14:52

    サイコロの音に合わせるためです。
    http://commons.nicovideo.jp/material/nc44544

    キャンセル

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

  • ただいまの回答率 90.40%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る

  • Android

    7500questions

    Androidは、Google社が開発したスマートフォンやタブレットなど携帯端末向けのプラットフォームです。 カーネル・ミドルウェア・ユーザーインターフェイス・ウェブブラウザ・電話帳などのアプリケーションやソフトウェアをひとつにまとめて構成。 カーネル・ライブラリ・ランタイムはほとんどがC言語/C++、アプリケーションなどはJavaSEのサブセットとAndroid環境で書かれています。