我正在尝试用Java编写一个基本程序来检查IP地址是否有效。我试图不使用Scanner类以外的其他外部类,也没有正则表达式。
我的代码this gist提供4个整数作为输入,每个八位字节一个。我也有this code,它比第一个更易读,但更长。
我的问题是,有没有其他方法可以在更少的行中实现这个想法,如果是这样,我将如何实现这一目标?
答案 0 :(得分:1)
虽然这段代码有点冗长,但它简单,自我描述,并且已被证明是紧张的。
!
答案 1 :(得分:0)
只有一些小的改进(我认为你的代码看起来非常好 - 到目前为止我的意见)显然要阅读并且所有工作块都能正确理解....
boolean isFailed = false;
if (first < 0 || first > 255) {
System.out.println("Octet 1 is invalid");
isFailed = true;
}
if (second < 0 || second > 255) {
System.out.println("Octet 2 is invalid");
isFailed = true;
}
if (third < 0 || third > 255) {
System.out.println("Octet 3 is invalid");
isFailed = true;
}
if (fourth < 0 || fourth > 255) {
System.out.println("Octet 4 is invalid");
isFailed = true;
}
if (!isFailed){
System.out.println("IP Address: " + first + "." + second + "." + third + "." + fourth);
}
所以我只是颠倒了打印的顺序 - 这样只会为你节省大检查......
答案 2 :(得分:0)
你的方法是检查每个八位字节......
您可以简单地执行此操作4次或为其编写方法:
private static boolean check(int octet, int index){
if (0xFF & octet < 256) return true;
System.out.println("Octet "+index+" is invalid";
return false;
}
并在main方法中使用此方法
if (check(first,0) && check (second, 2) && check (third, 3) && check(fourth, 4) ){
System.out.println("your ip is valid");
}
注意 - 这只会显示第一个无效的八位字节 - 如果你想检查所有你需要的另一个布尔值
boolean result = check(first,0) &&
check (second, 2) &&
check (third, 3) &&
check(fourth, 4); //reveals all errors
完全不同的方法是使用http://docs.oracle.com/javase/7/docs/api/java/net/InetAddress.html#getByName%28java.lang.String%29
try{
/*InetAdress adress =*/ InetAdress.
getByName(""+first+"."+second+"."+third+"."+forth)
System.out.println("your ip is valid");
}catch (UnknownHostException e){
//TODO represent that error message into a nice expression
System.out.println("your ip is invalid");
}
但是这也没有提供关于那个无效的八位字节的信息......
(顺便说一下 - 您的代码 错误了什么?它很好,真的!)
答案 3 :(得分:0)
我感到很无聊并且写了这个正则表达式
[0] -> {0,0}
[1] -> {2,3}
[2] -> {4,5}
[3] -> {6,7}
[4] -> {0,0}
它在以下数据集上进行了测试:
public static boolean isValid(String ip) {
boolean isvalid;
isvalid = ip.matches(
"(([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3}).){3}" +
"([0-9]|[0-9]{0,2}|1[0-9]*{0,2}|2[0-5][0-5]|0{0,3})"
);
return isvalid;
}