java.lang.IllegalArgumentException:n必须是正的Android Studio
我正在安卓工作室制作一款小行星道奇游戏。我使用java中内置的java.lang.IllegalArgumentException:n必须是正的Android Studio,java,android,Java,Android,我正在安卓工作室制作一款小行星道奇游戏。我使用java中内置的random生成器为每个小行星创建随机位置。我不断得到java.lang.IllegalArgumentException:n必须是正数,但它在我的手机上仍然运行良好 例外情况: java.lang.IllegalArgumentException: n must be positive at java.util.Random.nextInt(Random.java:300) at ca.alnitakstudios.
random
生成器为每个小行星创建随机位置。我不断得到java.lang.IllegalArgumentException:n必须是正数
,但它在我的手机上仍然运行良好
例外情况:
java.lang.IllegalArgumentException: n must be positive
at java.util.Random.nextInt(Random.java:300)
at ca.alnitakstudios.Asteroids.Asteroids.<init>(Asteroids.java:38)
at ca.alnitakstudios.Screens.GameScreen.<init>(GameScreen.java:36)
at java.lang.reflect.Constructor.newInstance(Constructor.java:526)
at android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:802)
at android.view.LayoutInflater_Delegate.rInflate(LayoutInflater_Delegate.java:64)
at android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
at android.view.LayoutInflater.inflate(LayoutInflater.java:500)
at android.view.LayoutInflater.inflate(LayoutInflater.java:381)
java.lang.IllegalArgumentException:n必须为正
位于java.util.Random.nextInt(Random.java:300)
在阿尔尼塔克工作室。小行星。小行星。(小行星。爪哇:38)
在ca.alnitakstudios.Screens.GameScreen.(GameScreen.java:36)
位于java.lang.reflect.Constructor.newInstance(Constructor.java:526)
位于android.view.LayoutInflater.rInflate_Original(LayoutInflater.java:802)
在android.view.LayoutInflater\u Delegate.rInflate(LayoutInflater\u Delegate.java:64)
位于android.view.LayoutInflater.rInflate(LayoutInflater.java:778)
在android.view.LayoutInflater.充气(LayoutInflater.java:500)
在android.view.LayoutInflater.inflate(LayoutInflater.java:381)
代码:
公共级小行星{
私有随机;
private int amount FasteRoid,最快速度,最慢速度,
最大的,最小的;
私人整数[]x,y,速度,半径;
公共小行星(){
类胡萝卜素=5;
x=新的整数[amountoroids];
y=新的整数[amoonteroid];
速度=新整数[amountoroids];
半径=新整数[amoonteroid];
最快速度=7;
最慢速度=3;
最大=20;
最小=10;
随机=新随机();
for(int i=0;i
}
将负值传递给nextInt
方法,确保在扣除最快速度-最慢速度
和最大-最小速度
时,该值不为负值。或者也可以使用Math.abs使所有负数为正数
示例:
Math.abs(fastestSpeed - slowestSpeed)
查看您的堆栈跟踪,可能是因为您试图在
GameScreen
初始化期间使用GameScreen
的静态成员。这些静态成员是否正确初始化为正值?如果它们被初始化为0
,这将是一个问题
由于您非常确定它应该始终为正值,但不知何故仍然会得到零或负值,因此我建议您创建一个虚拟
Random
类进行调试
package ca.alnitakstudios.Asteroids;
public class Random {
private java.util.Random r = new java.util.Random();
public int nextInt(int i) {
//Debugging (enable if you need to trace)
//new Exception().printStackTrace();
//(or you can also:)
//StackTraceElement ste = new Exception().getStackTrace()[1]; //the caller
//print out ste.getClassName(), ste.getMethodName(), ste.getLineNumber() etc.
System.err.println("nextInt called with value " + i);
return r.nextInt(i);
}
}
这应该覆盖
小行星
类中使用的随机
类,否则您可以显式导入它。没有其他代码更改是必要的,因此您可以确定您没有无意中修复任何东西。不幸的是,这没有帮助。我仍然得到错误。我想这很好,因为我在手机上仍然运行正常,只是弹出错误让人恼火。@TouchyGibbons然后确保结果值不是负值我已经打印出了每个整数,而且似乎都是正值。我将补充一些额外的细节。我使用的是AndroidStudio 0.8.0,当我遇到这个错误时,它还表示存在渲染问题。我在游戏屏幕布局上使用自定义视图。希望这些细节有帮助!很明显,fastestSpeed-slowestSpeed
和maxist-minimable
都是正整数,所以GameScreen.width
或GameScreen.height
似乎都是负整数。@matiash这也是我的想法。但这似乎证明我们错了。我甚至试着在GameScreen
和Asternodes
中打印这两个元素,但它们仍然都是正数以防万一,记住0也不算正数。:)还有一种可能性是,GameScreen.width
是一个非常大的数字,将其乘以2会导致溢出,将其变成负值。但我对此表示怀疑。堆栈跟踪显示问题出在GameScreen
初始化时。@matiash我知道0不是一个正数,而且我从来没有看到0出现过,所以算了@suninsky对于stack trace说问题出在GameScreen
那只是因为我在那里创建了一个小行星的实例。谢谢你的努力,但它仍然不起作用。我开始认为这是android studio中的一个bug。这只是在我将类移动到另一个包之后才开始发生的,而且它在我的手机上运行良好,所以很明显这不是在我的手机上产生的错误。
Math.abs(fastestSpeed - slowestSpeed)
package ca.alnitakstudios.Asteroids;
public class Random {
private java.util.Random r = new java.util.Random();
public int nextInt(int i) {
//Debugging (enable if you need to trace)
//new Exception().printStackTrace();
//(or you can also:)
//StackTraceElement ste = new Exception().getStackTrace()[1]; //the caller
//print out ste.getClassName(), ste.getMethodName(), ste.getLineNumber() etc.
System.err.println("nextInt called with value " + i);
return r.nextInt(i);
}
}