Android - 生成随机数时崩溃

4

所以,我在其他地方查找了如何生成随机数并将其放入Android应用程序中的方法。我希望这能够起作用,但不幸的是,它会崩溃并显示以下LogCat:

11-03 17:06:48.930: W/dalvikvm(8327): threadid=1: thread exiting with uncaught exception (group=0x41ff0300)
11-03 17:06:48.938: E/AndroidRuntime(8327): FATAL EXCEPTION: main
11-03 17:06:48.938: E/AndroidRuntime(8327): java.lang.IllegalArgumentException
11-03 17:06:48.938: E/AndroidRuntime(8327):     at java.util.Random.nextInt(Random.java:187)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at com.spng453.randomnum.RandomNumber$1.onClick(RandomNumber.java:24)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.view.View.performClick(View.java:4084)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.view.View$PerformClick.run(View.java:16966)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.os.Handler.handleCallback(Handler.java:615)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.os.Handler.dispatchMessage(Handler.java:92)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.os.Looper.loop(Looper.java:137)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at android.app.ActivityThread.main(ActivityThread.java:4745)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at java.lang.reflect.Method.invokeNative(Native Method)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at java.lang.reflect.Method.invoke(Method.java:511)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:786)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:553)
11-03 17:06:48.938: E/AndroidRuntime(8327):     at dalvik.system.NativeStart.main(Native Method)
11-03 17:06:51.376: I/Process(8327): Sending signal. PID: 8327 SIG: 9

我已经尝试了所有能想到的方法来使它工作,但是都没有成功。以下是代码:

private OnClickListener Gen = new OnClickListener() {
    public void onClick(View v) {
        Random rand;
        rand = new Random();
        EditText maxin = (EditText)findViewById(R.id.max);
        EditText minin = (EditText)findViewById(R.id.min);
        TextView out = (TextView)findViewById(R.id.out);
        int max = Integer.parseInt(maxin.getText().toString().trim());
        int min = Integer.parseInt(minin.getText().toString().trim());
        out.setText(Integer.toString(rand.nextInt(max-min) + min));
    }
};
2个回答

4
如果您的max文本框中的数字小于或等于min文本框中的数字,那么这肯定会发生。在调用Random.nextInt(int)之前,您应该验证它。正如文档所述:

抛出异常:
IllegalArgumentException - 如果n不是正数

当然,您还应该处理文本框中没有有效数字的情况。
最后,您为什么要将rand的声明和赋值分开呢?
Random rand;
rand = new Random();

为什么不只是这样:
Random rand = new Random();

?


好的,我会看一下。谢谢!编辑:谢谢!我没有意识到,但我把两个文本框搞混了。我总是犯这样的愚蠢错误。 - Aearnus
另外,我并不是只是使用了“Random rand = new Random();”,因为我认为那可能是问题所在。最后,这些文本框只能输入数字,如果我找到了一种输入字母的方法,那么我会添加一个字母检查功能。 - Aearnus
@spng453:声明怎么可能是问题呢?听起来你需要更退一步,真正审视错误信息和堆栈跟踪。此外,如果文本框只允许输入数字,为什么还要修剪字符串?如果用户输入无法存储在“int”中的数字会发生什么? - Jon Skeet
是的,你说得对。如果他们输入小数,它仍然会出错。而且,我知道错误不是那个,但为了万无一失,我尝试了所有可能性,只是忘记把它放回到应该的位置。同时,对于修剪(trim)操作,我只是习惯于使用字符串的文本框,这是我的一个习惯,并没有意识到这点。 - Aearnus

1

java.lang.IllegalArgumentException 表示您向 nextInt() 函数传递了非法参数。我猜测您的参数小于零,或者类似于这样的值。请在调试器中检查这些值,确保您的参数是有效的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接