希望这不是重复,因为我已经查找了一些线程。 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)
希望你能帮助我。答案 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时抛出 对象是必需的。其中包括:
- 调用null对象的实例方法。
- 访问或修改空对象的字段。
- 将null的长度视为数组。
- 访问或修改null的插槽,就像它是一个数组一样。
- 抛出null,就好像它是一个Throwable值。
醇>
相反尝试这样
if(rule[0] != null){
// Now you can call methods on your `0th` index element
}