0

我正在开发一个简单的 Java Swing 应用程序,我对main()方法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);

    }

}

main()方法采用经典的args[]数组参数(即字符串数组)

我希望如果该数组中的第一个元素不是已登录的字符串它将启动LoginFrame.class,否则不执行任何操作,并且将自动调用呈现 JFrame 窗口的startUp()方法。

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

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

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

肿瘤坏死因子

安德烈亚

4

6 回答 6

2

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

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

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

if(!(args.length > 0 && args[0].equals("loggedIn"))){
于 2013-11-12T13:21:24.067 回答
1

这是问题

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

您需要传递命令行参数。

或者

你可以这样做

 if(args.length>0&&!("loggedIn".equals(args[0]))){
            launch(LoginFrame.class, args);
 }
于 2013-11-12T13:19:54.627 回答
1

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

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

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

检查是否有任何参数,为避免此类错误,只需执行以下操作:

if(args.length > 0)
于 2013-11-12T13:21:03.143 回答
0

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

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

干杯,

于 2013-11-12T13:21:21.350 回答
0

请记住,长度为 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
}
于 2013-11-12T13:28:14.453 回答
0

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

而不是检查

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

首先做:

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

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

于 2013-11-12T13:29:28.240 回答