检查String Array是填充还是空

时间:2015-03-15 15:58:54

标签: java arrays string

希望这不是重复,因为我已经查找了一些线程。 this one,但它对我没有帮助。

我的程序正在读取一些用户可选的参数。他们可以为游戏添加规则,但不必这样做。 我知道rule将包含5 Numbers。我想将它们保存在String Array with 5 spots中,以便我以后可以使用它们。如果用户无法输入规则,则会采用特定规则。

String[] rule = new String[5];
//reading in the program arguments and stuff..
//here I want to check whether the rule is taken from the user or not
//don't want to check with a boolean check
if (rule[0].equals("")) {
    String[] newRule = "270-90-315-45-90".split("-");
    for (int i = 0; i < newRule.length; i++) {
        rule[i] = newRule[i];
    }
}

已经尝试过这个:

rule[0].equals("")
rule[0].equals(null)
rule[0].equals("null")
rule[0].matches("")
rule[0].matches("null")
rule.length == 0
rule.equals(null)

但是我总是得到一个NullPointerException,否则将跳过if case(length == 0)

希望你能帮助我。

6 个答案:

答案 0 :(得分:0)

你没有尝试过显而易见的事情吗?

if (rule[0] == null) {

答案 1 :(得分:0)

在您向我们提供的示例中,rule[0]包含您可以通过添加以下代码行看到的值null

System.out.println(rule[0]==null);

返回true(试试吧!)

if (rule[0]==null) {

将返回true并进入for循环,如果这是您想要的..请参阅以下课程compile(使用javac myEmpty.java)和run (使用java myEmpty):

class myEmpty {
    public static void main(String[] args) {
        String[] rule = new String[5];
        System.out.println(Arrays.toString(rule));
        //reading in the program arguments and stuff..
        //here I want to check whether the rule is taken from the user or not
        //don't want to check with a boolean check
        System.out.println(rule[0] == null);
        if (rule[0] == null) {
            //if ("".equals(rule[0])) {
            String[] newRule = "270-90-315-45-90".split("-");
            System.out.println(Arrays.toString(newRule));
            for (int i = 0; i < newRule.length; i++) {
                rule[i] = newRule[i];
                System.out.println(rule[i]);
            }
        }
    }
}

如果if (rule[0].equals("")) { 失败,只是因为rule[0]不包含您要检查的值 ""!请注意,""null不一样,相应地使用您的if条款

答案 2 :(得分:0)

因此,您只想更改用户输入的索引。

执行此操作的最佳方法是使用默认值初始化数组,然后覆盖用户指定的数组。

String[] rule = "270-90-315-45-90".split("-");
// Now read "program arguments and stuff"

答案 3 :(得分:0)

使用固定数组时,请尝试使用ArrayList并将值添加到列表中。 ArrrayList类将自动调整列表的长度。

示例:

ArrayList<String> rules = new ArrayList<>();

if (rules.size() == 0) {
    String[] newRule = "270-90-315-45-90".split("-");

    //Instead of newRule.length as a comparison, use the
    //number of rules with a number. Or use a foreach-loop
    //if the number of rules may vary

    for (int i = 0; i < 5; i++) {
        rules.add(newRule[i]);
     }
}

答案 4 :(得分:0)

我想象的NullPointerException来自你创建了一个字符串数组但没有用任何值初始化它们的事实。如果你不给它们一个值,它们将默认为null ...因此NPE。

根据您获得输入的位置,您可以执行以下操作;

private static final String[] DEFAULT_RULES = {"270", "90", "315", "45","90" };
private static String[] rules;

public static void main(String[] args){

     if(!isValidRule(args)){
       // Potentially also check that the args are digits
       throw new IllegalArgumentException("Must contain 5 rules");
     }

     rules = (args.length > 0) ? args : DEFAULT_RULES; // Used brackets on the ternary operator here for readability. Not essential.

     ...

}

private static boolean isValidRule(String[] rules){
    return rules.length > 0 && rules.length != 5;
}

如果您正在使用其他一些采用输入的非静态方法,则同样适用。您可以执行字符串拆分以根据您指定的分隔符获取数组,然后执行相同的操作。

如果没有规则通过,我不会想象你想要传递只包含连字符的字符串?通过尝试在执行拆分后检查字符串是否为空,这是您所暗示的。

另外,如果要检查字符串是否包含字符,请使用isEmpty()方法。如果长度为0,则返回true,否则返回false。这已经实现了你不必要的尝试。

答案 5 :(得分:-1)

在您尝试的每个选项中

rule[0].equals("")
rule[0].equals(null)
rule[0].equals("null")
rule[0].matches("")
rule[0].matches("null")
rule.length == 0
rule.equals(null)

您已假设0索引处的元素不为空,并且在第0个索引处调用元素equals()matches()方法导致NullPointerException

  

当应用程序在某个情况下尝试使用null时抛出   对象是必需的。其中包括:

     
      
  1. 调用null对象的实例方法。
  2.   
  3. 访问或修改空对象的字段。
  4.   
  5. 将null的长度视为数组。
  6.   
  7. 访问或修改null的插槽,就像它是一个数组一样。
  8.   
  9. 抛出null,就好像它是一个Throwable值。
  10.   

相反尝试这样

if(rule[0] != null){
// Now you can call methods on your `0th` index element

}