Search code examples
javastringinputsubstringstringindexoutofbounds

Problem in taking a string as an Input in JAVA


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");
            }
        } 
    } 

Solution

  • 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 using sc.nextInt() which is consuming the integer value but not newline character.

    Replace

    int choice = sc.nextInt();
    

    with

    int choice = Integer.parseInt(sc.nextLine());