为什么我的应用程序停止工作?

时间:2017-06-05 15:30:18

标签: java android

所以,我正在尝试做一个应用程序,它获得1到4之间的随机数(包括1和4),之后获取该数字,它会将我的主活动的背景颜色更改为相关数字:

如果获得数字1:更改为蓝色 如果编号2:更改为黑色 如果3:更改为黄色

以下是代码:

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);

    Button button = (Button) findViewById(R.id.button);
    Button button2 = (Button) findViewById(R.id.button2);

    button.setOnClickListener( new  View.OnClickListener() {

            public void onClick(View v) {

            LinearLayout layout = (LinearLayout) findViewById(R.id.layout);
            Random rnd = new Random();
            int random = rnd.nextInt(1 - 4);

                if (random == 1) {

                layout.setBackgroundColor(Color.BLUE);

                } else if (random == 2) {

                layout.setBackgroundColor(Color.BLACK);

                } else {

                layout.setBackgroundColor(Color.YELLOW);

                }


            }
        }
    );
}

代码对我来说似乎很好,Android Studio也没有报告任何错误(仅因为按钮2而发出警告),但每次点击按钮时,应用程序都会关闭并说“不幸”,“运动”已经停止了。"

我的问题是:点击按钮后,为什么应用程序停止工作?

(如果需要更多信息,请告诉我。我从来没有问过,我在询问Android开发方面相当新手)

7 个答案:

答案 0 :(得分:1)

rnd.nextInt(1 - 4);评估为rnd.nextInt(-3);,由于否定参数,将会抛出IllegalArgumentException

由于您自己没有处理该异常,因此您的应用程序会发生不好的事情。要生成范围内的随机整数,请参阅How do I generate random integers within a specific range in Java?

参考:https://docs.oracle.com/javase/7/docs/api/java/util/Random.html#nextInt(int)

答案 1 :(得分:0)

检查您的logcat以获取更多信息。

这条线对我来说很奇怪:rnd.nextInt(1 - 4);

是不是?

答案 2 :(得分:0)

random.nextInt(int bound)方法接受绑定参数,这是JDK中的方法:

public int nextInt(int bound) {
  if (bound <= 0)
    throw new IllegalArgumentException(BadBound);

  int r = next(31);
  int m = bound - 1;
  if ((bound & m) == 0)  // i.e., bound is a power of 2
    r = (int)((bound * (long)r) >> 31);
  else {
    for (int u = r;
      u - (r = u % bound) + m < 0;
      u = next(31))
      ;
  }
  return r;
}

因此,如果bound小于或等于0,则抛出异常,您的边界为-3,从而导致该异常。将您的界限更改为random.nextInt(3) + 1

答案 3 :(得分:0)

声明:LinearLayout layout = (LinearLayout) findViewById(R.id.layout); onClick侦听器的外侧。

另请尝试使用1到4之间的随机数生成器

Random r = new Random();
int i1 = r.nextInt((4 - 1) + 1) + 1;

答案 4 :(得分:0)

int random = rnd.nextInt(1 - 4); 

问题出在上面一行,因为它可以抛出异常。

尝试使用try {} catch {}块捕获此异常,您将看到。

您也可以更改算法,例如使用带颜色的列表

List<Color> colors = Arrays.asList(Color.BLUE, Color.RED, Color.YELLOW);
layout.setBackgroundColor(colors.get(rand.nextInt(colors.size() - 1));

答案 5 :(得分:0)

int random = rnd.nextInt(4);

int random = rnd.nextInt(3);

答案 6 :(得分:0)

正如Bathsheba所说,你对nextInt函数的逻辑是不正确的。

详见Oracle documentation for Random and nextInt(int n),nextInt函数&#34;返回伪随机,均匀分布的int值介于0(含)和指定值(不包括)&#34;。

因此,您试图生成0到-3之间的数字,这会导致&#34; IllegalArgumentException错误&#34;,因为&#39; n&#39;不是积极的。

生成1(包括)和4(不包括)之间的随机数的一种正确方法如下......

int random = rnd.nextInt(3) + 1
  • &#39; rnd.nextInt(2)&#39;将生成0,1或2
  • 在这些选项中添加1可为您提供所需的1,2或3
  • 输出