I am trying to create a program for taking ad IP address as input and give Class, netID, and hostID as output. I am having a problem in taking IP address as String input in the program.
This is the snap of the error i am getting
Error:
Exception in thread "main" java.lang.StringIndexOutOfBoundsException: begin 0, end -1, length 0
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3756)
at java.base/java.lang.String.substring(String.java:1902)
at cnPrac6.classFromDecimal(cnPrac6.java:7)
at cnPrac6.main(cnPrac6.java:94)
Given below is the part of code i am getting error in:
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
String ipClassD = "";
String ipClassB = "";
System.out.print("In which category you address is: \n 1. Decimal \n 2. Binary \n");
int choice = sc.nextInt();
System.out.print("Enter your address: ");
String str= sc.nextLine();
System.out.print("\n");
switch (choice) {
case 1:
ipClassD = classFromDecimal(str);
System.out.println("Given IP address belings to Class "+ipClassD);
seprate(str,ipClassD);
break;
Following the the full code
import java.util.*;
public class cnPrac6 {
static String classFromDecimal(String str){
int index = str.indexOf('.');
String ipsub = str.substring(0,index);
int ip = Integer.parseInt(ipsub);
if (ip>=1 && ip<=126)
return "A";
else if (ip>=128 && ip<=191)
return "B";
else if (ip>=192 && ip<223)
return "C";
else if (ip >=224 && ip<=239)
return "D";
else
return "E";
}
static String classFromBinary(String str){
if (str.charAt(0)=='0')
return "A";
else if (str.charAt(0)=='1' && str.charAt(1)=='0')
return "B";
else if (str.charAt(0)=='1' && str.charAt(1)=='1' && str.charAt(2)=='0')
return "C";
else if (str.charAt(0)=='1' && str.charAt(1)=='1' && str.charAt(2)=='1' && str.charAt(3)=='0')
return "D";
else if (str.charAt(0)=='1' && str.charAt(1)=='1' && str.charAt(2)=='1' && str.charAt(3)=='1' && str.charAt(4)=='1')
return "E";
else return "Error wrong address";
}
static void seprate(String str, String ipClass){
String network = "", host = "";
if(ipClass == "A"){
int index = str.indexOf('.');
network = str.substring(0,index);
host = str.substring(index+1,str.length());
}
else if(ipClass == "B"){
int index = -1;
int dot = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='.'){
dot +=1;
if(dot==2){
index = i;
break;
}
}
}
network = str.substring(0,index);
host = str.substring(index+1,str.length());
}
else if(ipClass == "C"){
int index = -1;
int dot = 0;
for(int i=0;i<str.length();i++){
if(str.charAt(i)=='.'){
dot +=1;
if(dot==3){
index = i;
break;
}
}
}
network = str.substring(0,index);
host = str.substring(index+1,str.length());
}
else if(ipClass == "D" || ipClass == "E"){
System.out.println("No network or host ID");
return;
}
System.out.println("Network ID is "+network);
System.out.println("Host ID is "+host);
}
public static void main(String[] args) {
Scanner sc= new Scanner(System.in);
String ipClassD = "";
String ipClassB = "";
System.out.print("In which category you address is: \n 1. Decimal \n 2. Binary \n");
int choice = sc.nextInt();
System.out.print("Enter your address: ");
String str= sc.nextLine();
System.out.print("\n");
switch (choice) {
case 1:
ipClassD = classFromDecimal(str);
System.out.println("Given IP address belings to Class "+ipClassD);
seprate(str,ipClassD);
break;
case 2:
ipClassB = classFromBinary(str);
System.out.println("Given IP address belings to Class "+ipClassB);
seprate(str,ipClassB);
break;
default:
System.out.println("Enter correct option");
}
}
}
The reason why it is failing is that the code,
String str= sc.nextLine()
is consuming the dangling new line character (when you press Enter) from the previous input. For the previous input, you are usingsc.nextInt()
which is consuming the integer value but not newline character.Replace
with