如何解决在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 举报,一经查实,本站将立刻删除。