【问题标题】:java.lang.ArrayIndexOutOfBoundsException: 0 when I try to access to the first argument of args parameters, why?java.lang.ArrayIndexOutOfBoundsException: 0 当我尝试访问 args 参数的第一个参数时,为什么?
【发布时间】:2013-11-24 16:00:26
【问题描述】:

我正在开发一个简单的 Java Swing 应用程序,我对 ma​​in() 方法 args 输入参数有一个愚蠢的怀疑:

我有以下代码:

package com.test.login;

import java.awt.Container;
import java.awt.Dimension;

import javax.swing.JFrame;

import org.jdesktop.application.SingleFrameApplication;

public class MainWindows extends SingleFrameApplication {

    private static final int FIXED_WIDTH = 880;
    private static final Dimension INITAL_SIZE = new Dimension(FIXED_WIDTH, 440);

    // First execute the LoginFrame class to open the login windows:
    public static void main(String[] args) {
        System.out.println("Inside: MainWindows() ---> main()");

        if(!(args[0].equals("loggedIn"))){
            launch(LoginFrame.class, args);
        }

    }

    @Override
    protected void startup() {
        // TODO Auto-generated method stub

        System.out.println("Inside MainWindows ---> startup()");


        JFrame mainFrame = this.getMainFrame();         // main JFrame that represents the Windows
        mainFrame.setTitle("My Appliction MainFrame");

        mainFrame.setPreferredSize(INITAL_SIZE);
        mainFrame.setResizable(false);

        show(mainFrame);

    }

}

ma​​in()方法采用经典的args[]数组参数(即String数组)

我希望如果这个数组中的第一个元素不是字符串 loggedIn 它会启动 LoginFrame.class 否则不做任何事情并且 startUp() 会自动调用渲染 JFrame 窗口的方法。

问题是当我尝试执行此类时,我在 Eclipse 控制台中收到以下错误消息:

Inside: MainWindows() ---> main()
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 0
    at com.test.login.MainWindows.main(MainWindows.java:19)

为什么?问题出在哪里?我该如何解决?

Tnx

安德烈亚

【问题讨论】:

  • 可能没有任何参数。您必须先检查长度。数组的长度可以为 0。即使有预期的参数,您也应该确保在访问数组中的元素之前传递了参数。
  • ...您是否传递了任何命令行参数?
  • 你怎么称呼main??
  • 我没有使用命令行,但我从另一个类调用 main,这样:args[0] = "loggedIn";启动(MainWindows.class, args);

标签: java swing main args


【解决方案1】:

您没有使用任何命令行参数运行它,是吗?在尝试对其执行检查之前,请验证您是否确实具有第一个参数。例如:

if(args.length > 0 && !args[0].equals("loggedIn")){

以上暗示如果没有参数,您不想调用launch()(您的问题对此有点模糊,但这将是一个严格的解释)。如果您确实想在这种情况下致电launch(),请执行以下操作:

if(!(args.length > 0 && args[0].equals("loggedIn"))){

【讨论】:

  • args.length 应该在! 之外。
  • 不确定if (args.length == 0 || !args[0].equals("loggedIn")) { 是否会或多或少令人困惑。
  • 不是我的意思。应该是if(args.length > 0 && !args[0].equals("loggedIn"))。哪个相同。
  • 没有。这与OP想要什么无关。为了解决他的问题,你应该在检查他想要检查的条件之前检查args 是否不为空。检查De Morgan's laws
【解决方案2】:

看起来您的 args 数组为空,因此您将 null 传递给您的 main 方法。

而不是检查

if(!(args[0].equals("loggedIn")))

先做:

if(args==null || !(args[0].equals("loggedIn")))

因此您可以查看参数是否为空(在这种情况下不会计算第二个条件)并执行相同的登录操作。否则,如果您想对空参数执行不同的操作,请编写两个 if 块。

【讨论】:

    【解决方案3】:

    请记住,长度为 0 的数组中没有任何内容,因此没有索引 0。在测试特定索引的值之前,您需要先测试长度。

    String[] args = null;
    
    if(args.length > 0) {  // <- NullPointerException: args is null.
           .....
    }
    
    args = new String[0];
    if("nope".equals(args[0])){ // <- IndexOutOfBoundsException: 'args' does not have 
                                //                               anything at index 0
        ....
    }
    
    args = new String[3];
    if("nope".equals(args[0])){ // <- Good to go, but...
               .....
    }
    if(args != null && args.length > 0){ // <- Safest bet
        if("nope".equals(args[0])){ .. } // Now check
    }
    

    【讨论】:

      【解决方案4】:

      在 C/C++ 中,main() 构造是“借来的”,第一个参数始终是程序本身(因此您确定数组中有一个元素),但在 Java 中并非如此 -这是你的问题。您没有向程序传递任何参数,并且数组为空,导致 OOB。

      在取消引用第一个元素之前测试args.length &gt; 0,你会没事的。

      干杯,

      【讨论】:

        【解决方案5】:

        问题来了

         if(!(args[0].equals("loggedIn"))) 
        

        你需要传递命令行参数。

        你可以这样做

         if(args.length>0&&!("loggedIn".equals(args[0]))){
                    launch(LoginFrame.class, args);
         }
        

        【讨论】:

        • args!=null 不是必需的,根据规范,它永远不会为空。
        【解决方案6】:

        显然你运行你的代码没有任何参数。

        args[0].equals("loggedIn"))
        

        将无法检查,所以有你的ArrayIndexOutOfBoundsException

        检查是否有任何参数,为了避免这样的错误,只需这样做:

        if(args.length > 0)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2019-07-15
          • 2019-10-10
          • 2014-04-03
          • 1970-01-01
          • 2016-06-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多