微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在JAVA中将字符串作为输入的问题

如何解决在JAVA中将字符串作为输入的问题

我正在尝试创建一个程序,以将广告IP地址作为输入,并为Class,netID和hostID提供输出。 我在将IP地址作为程序中的String输入时遇到问题。

This is the snap of the error i am getting

错误

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

解决方法

问题在于获取输入。使用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
,

失败的原因是代码// private Button button; LayoutInflater lf; @Override public View onCreateView(LayoutInflater inflater,ViewGroup container,Bundle savedInstanceState) { lf=inflater; View view = inflater.inflate(R.layout.fragment_home,container,false); Button button = (Button) view.findViewById(R.id.home_button); button.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { Intent intent=new Intent(lf.getContext(),sunhan_activity.class); startActivity(intent); } }); return view; } 占用了先前输入中悬挂的换行符(当您按 Enter 时)。对于先前的输入,您正在使用String str= sc.nextLine(),它消耗的是整数值,而不是换行符。

替换

sc.nextInt()

使用

int choice = sc.nextInt();

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。