为什么random.nextInt()创建" IllegalArgumentException:n< = 0:-1"?

时间:2016-03-19 18:45:56

标签: java android random

我试图创建一个引用生成器应用程序,应用程序的关键部分是随机()。但由于某种原因,随机在我的MainActivity中,应用程序不会编译。

package com.example.alpak.liftquote;

import android.os.Bundle;
import android.support.design.widget.FloatingActionButton;
import android.support.design.widget.Snackbar;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.View;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;

import java.util.Random;

public class MainActivity extends AppCompatActivity {

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



        // WHERE MY CODE STARTS

        //RANDOM GENERATOR that DOESN'T WORK

        Random rand = new Random();

        final int irandomIndex = rand.nextInt((3 - 1) + 1)+1;
        final int drandomIndex = rand.nextInt((4 - 6) + 1)+4;
        final int prandomIndex = rand.nextInt((7 - 9) + 1)+7;

        final String iIndex = "s"+irandomIndex;
        final String dIndex = "s"+drandomIndex;
        final String pIndex = "s"+prandomIndex;

        final String RiIndex = getString(getApplicationContext().getResources().getIdentifier(iIndex, "string", getPackageName()));
        final String RdIndex = getString(getApplicationContext().getResources().getIdentifier(dIndex, "string", getPackageName()));
        final String RpIndex = getString(getApplicationContext().getResources().getIdentifier(pIndex, "string", getPackageName()));


        //STRING

        final TextView txt = (TextView) findViewById(R.id.textView);

        //BUTTONS
        //

        Button inspireBtn = (Button) findViewById(R.id.iButton);
        Button deepBtn = (Button) findViewById(R.id.dButton);
        Button positiveBtn = (Button) findViewById(R.id.pButton);

        // ON CLICK LISTENRS


        inspireBtn.setOnClickListener(new View.OnClickListener(){
            @Override
            public void onClick(View v){
                txt.setText(RiIndex);
                                                //"cannot resolve symbol 'index';"
            }
        });

我收到的错误消息是:

  

引起:java.lang.IllegalArgumentException:n< = 0:-1

4 个答案:

答案 0 :(得分:3)

你的约束必须是积极的

检查Random#nextInt Javadoc

  

抛出:IllegalArgumentException - 如果绑定不是肯定的

以下两行将引发异常。

final int drandomIndex = rand.nextInt((4 - 6) + 1)+4;
final int prandomIndex = rand.nextInt((7 - 9) + 1)+7;

答案 1 :(得分:0)

您的代码导致负数

    final int drandomIndex = rand.nextInt((4 - 6) + 1)+4;
    final int prandomIndex = rand.nextInt((7 - 9) + 1)+7;

4-6和7-9给出负最大值

答案 2 :(得分:0)

使用Random时,参数必须为正数,否则会引发异常:

  

抛出:IllegalArgumentException

     
      
  • 如果绑定不是正面
  •   

您的代码在zero中生成负值:

nextInt()

相当于:

final int irandomIndex = rand.nextInt((3 - 1) + 1) +1;
final int drandomIndex = rand.nextInt((4 - 6) + 1) +4;
final int prandomIndex = rand.nextInt((7 - 9) + 1) +7;

请注意,在添加之后的数字之前,将首先评估rand.nextInt()。因此final int irandomIndex = rand.nextInt(-1) +1; //negative value in nextInt() final int drandomIndex = rand.nextInt(-1) +4; //negative value in nextInt() final int prandomIndex = rand.nextInt(-1) +7; //negative value in nextInt() 不等于 rand.nextInt(-1) +4;

答案 3 :(得分:0)

nextInt(int)生成一个从0(包括)到n(不包括)的数字。例如,nextInt(3)可能产生0,1或2.因此,值<= 0只是没有意义;你不能产生数字R,使得0 <= R&lt; n如果n是负数。

从您的代码中,您似乎在尝试在两个值之间生成一个随机数。您应该rand.nextInt((7 - 9) + 1)+7而不是rand.nextInt(9 - 7) + 7。这将使它像nextInt(2) + 7,它是(0或1)+ 7,它是7或8.如果你还想产生值9,那么你必须在括号内添加一个。但是在这种情况下,最好只传入10(所以,nextInt(10 - 7) + 7),这样你就会习惯于下界是包容性的,而上界是独占的 - 这是Java中一种非常常见的模式

更一般地说,要在min(包括)和max(不包括)之间生成随机int,公式为nextInt(max - min) + min