2012-09-23 105 views
1

我得到数组绑定错误,但在我看来,数组从0开始,所以这段代码有什么问题?主要方法中的ArrayIndexOutOfBounds异常

public class Quadratic { 

    public static void main(String[] args) { 
     double b = Double.parseDouble(args[0]); 
     double c = Double.parseDouble(args[1]); 

     double discriminant = b*b - 4.0*c; 
     double sqroot = Math.sqrt(discriminant); 

     double root1 = (-b + sqroot)/ 2.0; 
     double root2 = (-b - sqroot)/ 2.0; 

     System.out.println(root1); 
     System.out.println(root2); 
    } 
} 
+4

你传递了​​两个字符串到您的程序?你如何启动它? –

+0

我的目标是要求用户输入b和c,然后让计算机解决方程的根... – Contempt

回答

1

您在args [0]和/或args [1]中没有项目。你需要检查数组中是否有足够的参数。

double b = args.length>=1?Double.parseDouble(args[0]):0.0; 
double c = args.length>=2?Double.parseDouble(args[1]):0.0; 

如果在数组中没有参数的话,就意味着你没有通过一个参数到程序,或者你没有通过足够的参数。

+0

@Mat我不建议OP如何处理这种情况,我只是提供一个如何避免例外的例子。该方案的逻辑一致性完全由OP来确保。 – Kiril

+0

我会说你的解释与你的代码不符。你说“你需要检查是否有足够的参数”,你的代码不会这样做。它检查是否只有一个参数,然后是否恰好有两个参数。 – Mat

+0

@Mat啊,我明白了......> =就是我一直在寻找的东西。 – Kiril

2

保护自己:保持防御。

public class Quadratic { 

    public static void main(String[] args) { 

     if (args.length> 1) { 
      double b = ((args.length > 0) ? Double.parseDouble(args[0]) : 0.0); 
      double c = ((args.length > 1) ? Double.parseDouble(args[1]) : 0.0); 

      double discriminant = b*b - 4.0*c; 
      double sqroot = Math.sqrt(discriminant); 

      double root1 = (-b + sqroot)/ 2.0; 
      double root2 = (-b - sqroot)/ 2.0; 

      System.out.println(root1); 
      System.out.println(root2); 
     } else { 
      System.out.println("two arguments are required: b and c, please"); 
     } 
    } 
} 

如果判别式为负,会发生什么情况?如果它是零呢?

为什么你只限于a = 1的情况?

+0

好吧,我了解长度检查,但0.0是什么意思?我试图将其更改为5.0或其他任何内容,并在控制台中收到“NaN” – Contempt

+0

请阅读代码并研究一下Java。它是三元运算符:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/opsummary.html。如果谓词为真,则返回第一个参数;如果不是,则返回第二个。 – duffymo

0

尝试并调试它。使用System.out.println(args.length);打印参数的大小。 如果大小小于2,则不会将参数传递给主类。

+0

如你所说,我收到0.0后检查。那是什么意思?我的数组是空的? – Contempt

+1

是的,你打电话给你的程序如何? – meirrav

-1

ArrayIndexOutOfBounds当您尝试在数组中错误的位置提取变量时发生异常。

当您在编译e.x后在java中运行程序时。 javac hello然后通过java hello执行类文件,在这种情况下,args[0]的第0位将是文件名,即hello

为了您成功提取在运行时发布的参数,您必须在数组中使用n + 1个位置。例如。如果我正在运行我的程序java hello argument,如果我希望在运行时使用发布的变量argument等,我将使用args[1]等来提取相关文本。

如果你不确定你的声明是否会产生异常与否,它总是使用安全try & catch块.Read - Exception Handling

+1

不在Java中。 'args [0]'是第一个参数,而不是可执行文件的名称。 – Dave