所以,我正在尝试做一个应用程序,它获得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开发方面相当新手)
答案 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