Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用字符串输入中的字符填充二维数组_Java_Arrays - Fatal编程技术网

Java 用字符串输入中的字符填充二维数组

Java 用字符串输入中的字符填充二维数组,java,arrays,Java,Arrays,我正在做一个基本的Tic-Tac-Toe游戏,接受玩家以字符串的形式输入(即a2)。根据字母的不同,第一个字符被转换成一个名为row的int,第二个字符被转换成col(对于数组grid[row][col])。我有一段代码,如果第一个字符不是a、b或c,并且第二个字符不是1、2或3,则会引发自定义异常: if(input == null) { throw new NullInputException(); } else if(input.length() != 2)

我正在做一个基本的Tic-Tac-Toe游戏,接受玩家以字符串的形式输入(即a2)。根据字母的不同,第一个字符被转换成一个名为row的int,第二个字符被转换成col(对于数组grid[row][col])。我有一段代码,如果第一个字符不是a、b或c,并且第二个字符不是1、2或3,则会引发自定义异常:

if(input == null) {
        throw new NullInputException();
    }
    else if(input.length() != 2) {
        throw new InvalidInputException();
    }
    else if(!(input.substring(0,1).equalsIgnoreCase("a") &&
            input.substring(0,1).equalsIgnoreCase("b") &&
            input.substring(0,1).equalsIgnoreCase("c") ||
            input.substring(1).equals("1") &&
            input.substring(1).equals("2") &&
            input.substring(1).equals("3"))) {
        throw new InvalidInputException();
    }
问题是,即使输入有效,这段代码也会抛出错误,我不知道为什么。我尝试过使用.charAt()而不是.substring(),还尝试过使用条件语句。我的问题是:如何修复它,使其接受有效的输入

其他没有帮助的问题: ;
您和两个条件:

input.substring(0,1).equalsIgnoreCase("a") &&
            input.substring(0,1).equalsIgnoreCase("b")
两者不能同时为
true
。这就是为什么结果总是
false
并引发异常的原因

你真正想要的是:

String first = input.substring(0,1);
String second = input.substring(1);
    if (!((first.equalsIgnoreCase("a") ||
                first.equalsIgnoreCase("b") ||
                first.equalsIgnoreCase("c")) && 
                (second.equals("1") ||
                second.equals("2") ||
                second.equals("3"))) {
        throw new InvalidInputException();
    }

Neil的小编辑…

您和两个条件:

input.substring(0,1).equalsIgnoreCase("a") &&
            input.substring(0,1).equalsIgnoreCase("b")
两者不能同时为
true
。这就是为什么结果总是
false
并引发异常的原因

你真正想要的是:

String first = input.substring(0,1);
String second = input.substring(1);
    if (!((first.equalsIgnoreCase("a") ||
                first.equalsIgnoreCase("b") ||
                first.equalsIgnoreCase("c")) && 
                (second.equals("1") ||
                second.equals("2") ||
                second.equals("3"))) {
        throw new InvalidInputException();
    }

Neil的小编辑…

有时最好编写一系列更简单的测试,以便阅读和验证

row = input.substring(0,1).toUpperCase();
col = input.substring(1);
boolean validRow = (row.equals("A") ||
                    row.equals("B") ||
                    row.equals("C"));
boolean validCol =
        (col.equals("1") ||
        col.equals("2") ||
        col.equals("3"));

if(!(validRow && validCol)) {

有时编写一系列更简单的测试更好,这些测试更容易阅读和验证

row = input.substring(0,1).toUpperCase();
col = input.substring(1);
boolean validRow = (row.equals("A") ||
                    row.equals("B") ||
                    row.equals("C"));
boolean validCol =
        (col.equals("1") ||
        col.equals("2") ||
        col.equals("3"));

if(!(validRow && validCol)) {

您没有正确使用
&&
|
。另外,请澄清这与二维数组的关系。根据您的代码,唯一有效的输入是包含“abc123”的字符串。这意味着任何两个字符的输入都会立即无效,因为它必然会丢失至少4个其他必需的字符。您没有正确使用
&&
|
。另外,请澄清这与二维数组的关系。根据您的代码,唯一有效的输入是包含“abc123”的字符串。这意味着任何两个字符输入都立即无效,因为它必须至少缺少其他所需字符中的4个。但是,要抛出异常,输入就不一定在两个部分(即d4)上都不好吗?如果用户只是错误输入了一个字符(即c4),那么这会捕获错误吗?@Alex这只允许a1、a2、a3、b1、b2、b3、c1、c2、c3。如果输入不是其中之一,那么它是无效的。它工作得很好。我想我只是在逻辑上有点问题。至于落选的选民,你能解释一下吗?这个解决方案是完美的。看起来我是落选的选民,但我完全不知道这是怎么发生的。我很高兴投票纠正这一点,但网站要求@vojta首先编辑他的答案,因为这已经过去了一段时间。但是,要抛出异常,输入是否必须在两个部分都不好(即d4)?如果用户只是错误输入了一个字符(即c4),那么这会捕获错误吗?@Alex这只允许a1、a2、a3、b1、b2、b3、c1、c2、c3。如果输入不是其中之一,那么它是无效的。它工作得很好。我想我只是在逻辑上有点问题。至于落选的选民,你能解释一下吗?这个解决方案是完美的。看起来我是落选的选民,但我完全不知道这是怎么发生的。我很高兴投票纠正这一点,但该网站要求@vojta首先编辑他的答案,因为这件事已经过去了一段时间。