Java 为什么在将字符串转换为整数时会出现NumberFormatException?

Java 为什么在将字符串转换为整数时会出现NumberFormatException?,java,parsing,Java,Parsing,这是我的代码: public void setAreaAccessPoints(){ String mac = "",essid = "",status = ""; int strength = 0,kanali = 0; List<String> AccessPoints = new ArrayList<String>(); //i lista me ta access points String temp; try{

这是我的代码:

 public void setAreaAccessPoints(){
    String mac = "",essid = "",status = "";
    int strength = 0,kanali = 0;
    List<String> AccessPoints = new ArrayList<String>(); //i lista me ta access points
    String temp;
    try{
        String[] command = {"/bin/sh", "-c", "sudo iwlist " + wirelessName + " scanning | grep -A5 \"Cell\" "};
        Process child = Runtime.getRuntime().exec(command);
        BufferedReader r = new BufferedReader(new InputStreamReader(child.getInputStream()));
        while((temp = r.readLine()) != null){
            if(temp.contains("Cell")){
                String[] info = temp.split(" ");
                mac = info[3];
                System.out.println(mac);
                do{
                    temp = r.readLine();
                    if(temp.contains("ESSID:")){
                        essid = temp.replace("ESSID:","");
                    }
                    if(temp.contains("Frequency:")){
                        String[] info1 = temp.split(" ");
                        info1[3] = info1[3].replace(")","");
                        kanali = Integer.parseInt(info1[3]);
                    }
                    if(temp.contains("Mode:")){
                        status = temp.replace("Mode:","");
                    }
                    if(temp.contains("Quality=")){
                        String[] info2 = temp.split(" ");
                        info2[3] = info2[3].replace("level=","");
                        strength = Integer.parseInt(info2[3]);
                    }
                    if(temp.contains("Protocol:")){
                        temp = r.readLine();
                    }
                }while(!(temp.contains("Cell")));
                AccessPoint newAP = new AccessPoint(mac,essid,kanali,status,strength); 
                AccessPoints.add(newAP.toString());  //vazoume ta access points sti lista san strings
            }
        }
        r.close();
        for(String s : AccessPoints)
            System.out.println(s);
    }catch(IOException e){e.printStackTrace();}
}
错误出现在两行
“strength=Integer.parseInt(info2[2]);”
“kanali=Integer.parseInt(info1[3]);”
。。。我似乎不知道问题出在哪里。当我拆分字符串时,根据输出,我想要的信息在第二个和第三个字段中。那么为什么它要尝试传递一个
null
字符串来进行整数解析呢

堆栈跟踪:

 Exception in thread "Thread-1" java.lang.NumberFormatException: For input string: ""
    at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
    at java.lang.Integer.parseInt(Integer.java:504)
    at java.lang.Integer.parseInt(Integer.java:527)
    at askisi1.Wireless.setAreaAccessPoints(Wireless.java:213)
    at askisi1.Wireless.run(Wireless.java:43)
    at java.lang.Thread.run(Thread.java:722)

您正在检查某些内容并替换其他内容

 if(temp.contains("Quality=")){
                    String[] info2 = temp.split(" ");
                    info2[1] = info2[1].replace("level=","");
                    strength = Integer.parseInt(info2[2]);
                }
线路

Quality=2/100  Signal level=-89 dBm  Noise level=-92 dBm
包含双空格,因此在
拆分
结果中,有空的
字符串
s,非空的
字符串
s不在您认为的索引处

打印出
“质量=2/100信号电平=-89 dBm噪声电平=-92 dBm”的结果。拆分(“”)具有指数收益率

0: Quality=2/100
1: 
2: Signal
3: level=-89
4: dBm
5: 
6: Noise
7: level=-92
8: dBm

您的文件中似乎有前导空格,因此带有非空
字符串的索引将在稍后出现。

因为在行的前面有空格,所以要格式化的部分是错误的 两边都没有空格,你的逻辑就正常了

String str ="Frequency:2.437 GHz (Channel 6)";
String [] str1 = str.split(" ");
System.out.println(Integer.parseInt(str1[3].replace(")", "")));
您可以执行trim()并检查结果

 temp = r.readLine().trim();
例如,这是有效的

String str ="Frequency:2.437 GHz (Channel 6)";
String [] str1 = str.split(" ");
System.out.println(Integer.parseInt(str1[3].replace(")", "")));

您可以从info2[1]中删除“level=”,然后以后不再对其执行任何操作。您应该将其从info2[2]中删除。另外,请注意,它们之间用双空格分隔,如这里的另一个答案所述。

从错误消息中可以明显看出,info1[3]处的值不是有效的整数。我会做System.out并确保它是有效的整数。它告诉你它不能转换的值-就在堆栈跟踪中。请给出完整的输入文本。是的,我知道它不能转换值“”。。问题是..为什么它应该有值“6”却有这个值?@Stelsawa您必须修剪()临时字符串。检查我的answertemp是否包含整行输出(频率:2.437 GHz(通道6)),这就是为什么我将其拆分并仅替换部分iwant@Stelsavva你喜欢让你的代码不可读,不是吗:)。检查您正在拆分的所有空格,以及您是否正在使用正确的索引。因此,当我拆分字符串时,它如何处理双空格?它是否在信息数组中放入“”值?是的,正是这样。在两个拆分标记之间,有一个空的
字符串
,它被放入
拆分
数组中。好的,我修复了那一行,但是这一行呢?频率:2.437千兆赫(第六频道)?这个不包含双空格,如果我没有弄错的话,我想要的值应该在info1[3](“6)”)中,对吗?我在回答末尾提到的前导空格(当然是在编辑之后).在哪一行中,您现在得到了例外相同的行..我打印了信息数组的数据,并且确实有很多尾随空格..我在所有情况下都使用了temp.trim(),但仍然没有结果