Java子网抛出Java.lang.IllegalArgumentException

Java子网抛出Java.lang.IllegalArgumentException,java,Java,我有下面的代码,基本上是基于ipaddress打印一些东西 private static void getInfo(String ipAddress) { for (String cidr : myNetworkList) { if (InetAddressValidator.getInstance().isValid(ipAddress)) { if

我有下面的代码,基本上是基于ipaddress打印一些东西

    private static void getInfo(String ipAddress) {
for (String cidr : myNetworkList) {             
                if (InetAddressValidator.getInstance().isValid(ipAddress)) {                    
                    if (cidr.equals(ipAddress)) {
                        //Do something
                        break;
                    }
                }
                 else {
                    SubnetUtils subnetUtils = new SubnetUtils(cidr);
                    if (subnetUtils.getInfo().isInRange(ipAddress)) {                       
                        //Do something else             
                        break;
                    }
                }


            }       
}
当我给出一个有效的IP地址作为参数,例如-17.151.126.28时,该方法工作得非常好。但是,如果我用CIDR表示法给出IP地址,例如-17.24.84.0/24,我会得到以下错误-

Exception in thread "main" java.lang.IllegalArgumentException: Could not parse [17.24.84.0/24]
我不知道如何解决这个问题。我在某个地方读到了子网的问题,因为它不支持IpV4地址。我不是网络专家,所以我不知道问题是子网,还是应该使用备用库?

阅读

参数:地址-点分隔的IPv4地址,例如“192.168.0.1”

您正在传递的是
17.24.84.0/24
,它不是点分隔的IPv4地址

您的
ipAddress
变量包含CIDR表示法中的
字符串

以下是如何做到这一点

public boolean testCIDRSubnet(String cidr, String cidrSubnetCandidate) {
    if ("0".equals(cidr.substring(cidr.indexOf("/")+1))) return true;
    if ("0".equals(cidrSubnetCandidate.substring(cidrSubnetCandidate.indexOf("/")+1))) return false;
    SubnetUtils utils = new SubnetUtils(cidrSubnetCandidate);
    String lowIp = utils.getInfo().getLowAddress();
    String highIp = utils.getInfo().getHighAddress();
    utils = new SubnetUtils(cidr);
    return utils.getInfo().isInRange(lowIp) && utils.getInfo().isInRange(highIp);
}

第二个参数接受CIDR IP范围子网候选,如果它是CIDR的完整子网,则该方法返回true。对“/0”CIDR的前两次检查是因为SubnetUtils无法识别这是有效的。

在哪一行引发异常?它在这一行引发Laurent-如果(SubnetUtils.getInfo().isInRange(ipAddress))SSCE正是我上面粘贴的内容。当我从main调用该方法并给出IP地址-17.16.164.0/24时,我得到了异常。我正在使用apache-commons-3.0。1@user2609271字体见下面我的答案。你没有发布一个几乎:它不是独立的:如果它是一个SSCCE,我可以复制、粘贴、编译并运行它来重现你看到的错误。我没有发布一个,因为它是敏感信息,与问题无关。是的,我同意你需要一个来重现错误。你上面说的有道理。除了检查IP地址是否在该范围内,或者检查它是否是有效的CIDR之外,还有其他方法吗?SSCCE很短,因此不需要在其中包含敏感(和无关)信息。在这种情况下,可能是4-5行带有硬编码字符串文字的代码导致了错误。如果
SubnetUtils SubnetUtils=新的SubnetUtils(cidr)
不会抛出异常,那么(显然)
cidr
是一个有效的cidr。这很公平。你能告诉我如何检查IP地址是否在CIDR范围内吗?@user2609271:我不明白你的问题。您可以使用
isInRange()
方法检查IP地址是否在CIDR范围内,但您已经这样做了。是的,但我通过了17.24.84.0/24,这显然是无效的。就像你刚才说的。