0

これは私のコードです:

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

私が解析している出力は次のようになります。

      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
  --

エラーは 2 行"strength = Integer.parseInt(info2[2]);"にあり"kanali = Integer.parseInt(info1[3]);"ますが、どこに問題があるのか​​わかりません。文字列を分割しているとき、出力によると、必要な情報は 2 番目と 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)
4

4 に答える 4

1

この線

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

には二重スペースが含まれているため、split結果には空Stringの s があり、空でないStrings はあなたが考えているインデックスにありません。

"Quality=2/100 Signal level=-89 dBm Noise level=-92 dBm".split(" ");インデックス付きの結果を出力すると、

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

ファイルの先頭にスペースがあるように見えるため、空でないStrings のインデックスはその後になります。

于 2012-11-09T16:04:04.583 に答える
1

あなたは何かをチェックして、何か他のものを置き換えています...

 if(temp.contains("Quality=")){
                    String[] info2 = temp.split(" ");
                    info2[1] = info2[1].replace("level=","");
                    strength = Integer.parseInt(info2[2]);
                }
于 2012-11-09T16:01:36.670 に答える
0

info2[1] から "level=" を削除し、後で何もしません。info2[2] から削除する必要があります。また、ここの別の回答に記載されているように、それらは二重スペースで区切られていることに注意してください。

于 2012-11-09T16:09:16.193 に答える
0

行の前にスペースがあるため、ロジックが機能している両側にスペースを入れずにフォーマットするのに間違った部分を取得しています

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(")", "")));
于 2012-11-09T16:08:20.383 に答える