Stelios Savva
Stelios Savva

Reputation: 832

Why am I getting NumberFormatException while converting a string to integer?

This is my code:

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

The output which i am parsing looks like this:

      Cell 04 - Address: 00:05:59:30:C1:7C
                Protocol:802.11b/g
                ESSID:"NA home"
                Mode:Managed
                Frequency:2.437 GHz (Channel 6)
                Quality=2/100  Signal level=-89 dBm  Noise level=-92 dBm
  --
      Cell 05 - Address: 00:05:59:43:AE:C9
                Protocol:802.11b/g
                ESSID:"NetFasteR IAD 2 (PSTN)"
                Mode:Managed
                Frequency:2.437 GHz (Channel 6)
                Quality=0/100  Signal level=-91 dBm  Noise level=-94 dBm
  --
      Cell 06 - Address: 00:05:59:3B:C1:FA
                Protocol:802.11b/g
                ESSID:"Kpanagiotou"
                Mode:Managed
                Frequency:2.437 GHz (Channel 6)
                Quality=0/100  Signal level=-91 dBm  Noise level=-94 dBm
  --

The error is in the 2 lines "strength = Integer.parseInt(info2[2]);" and "kanali = Integer.parseInt(info1[3]);" ... I can't seem to figure out where is the problem. When I am splitting the string, the info I want is in the second and third field according to the output. So why does it try to pass a null string for integer parsing?

StackTrace:

 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)

Upvotes: 0

Views: 2266

Answers (4)

Daniel Fischer
Daniel Fischer

Reputation: 183978

The line

Quality=2/100  Signal level=-89 dBm  Noise level=-92 dBm

contains double spaces, so in the split result, you have empty Strings and the non-empty Strings are not at the indices you think they are.

Printing out the result of "Quality=2/100 Signal level=-89 dBm Noise level=-92 dBm".split(" "); with indices yields

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

You seem to have leading spaces in your file, so the indices with nonempty Strings would be later then.

Upvotes: 1

someone
someone

Reputation: 6572

Since you have spaces in-front of the lines you are getting wrong part for to format without any spaces in both sides your logic is working

you could do trim() and check your result

 temp = r.readLine().trim();

For example this is working

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

Upvotes: 0

Zolt&#225;n
Zolt&#225;n

Reputation: 22206

You remove "level=" from info2[1] and then don't do anything with it later. You should remove it from info2[2]. Also, note that they are separated by double spaces as noted in another answer here.

Upvotes: 0

bluesman
bluesman

Reputation: 2260

you are checking for something and replacing something else...

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

Upvotes: 1

Related Questions