1

我正在尝试创建一个程序,用于将广告 IP 地址作为输入并将 Class、netID 和 hostID 作为输出。我在将 IP 地址作为程序中的字符串输入时遇到问题。

这是我得到的错误的快照

错误:

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)

下面给出的是我遇到错误的代码部分:

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;

按照完整的代码

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

2 回答 2

1

问题在于获取输入。使用sc.nextInt()时,它需要一个整数输入,直到遇到空格。如果遇到空格,它会停止扫描输入。

扫描整数后,扫描仪仍然在同一行,直到我们读取整行才会转到下一行。

因此,在获得整数输入后使用扫描整行。sc.nextLine()

在这里,您可以找到代码。

int choice = sc.nextInt();                 // getting integer
sc.nextLine();                             // passing this line
System.out.print("Enter your address: ");  // scanner is in next Line
String str= sc.nextLine();                 // reading the ip address
于 2020-09-19T11:39:41.793 回答
0

它失败的原因是代码String str= sc.nextLine()正在消耗前一个输入中的悬空换行符(当您按下 时Enter)。对于前面的输入,您使用sc.nextInt()的是整数值而不是换行符。

代替

int choice = sc.nextInt();

int choice = Integer.parseInt(sc.nextLine());
于 2020-09-19T11:43:24.310 回答