-3

以下は、ファイルを反復処理して 2 つの個別の数値を見つけて比較するために作成したプログラムの一部です。

行が"[Device|Sensors|Checksum]"と等しい開始点を各行で検索します。次に、最初と 2 番目に出現する"Value"を探し、その行の 16 進数を取得し、それをlong型に変換します。これら 2 つの長い数値が等しい場合は問題ありませんが、そうでない場合は問題を報告します

ここに私が使用しているファイルの抜粋があります

Address(18) = 0x0053
Page(18) = Sensor
Value(19) = 0x1
Desc(19) = used bytes from high priority task
Address(19) = 0x0053
Byte_No(19) = 2
Page(19) = Sensor
;end of section [Device|Sensors|Stack]
[Device|Sensors|Checksum]
Address(18) = 0x0053
Page(18) = Sensor
Value(2) = 0xE0A64F36
Address(18) = 0x0053
Page(18) = Sensor
Default(19) = 0x00
Value(3) = 0xE0A64F36
Page(18) = Sensor
Desc(19) = used bytes from high priority task
;end of section [Device|Sensors|Checksum]

既にデバッグしようとしているにもかかわらず、このコードの何が問題なのかを正確に見つけることができません。私が使用したループは健全なようです。

try {

 do {//read line then check if line is "[Device|Sensors|Checksum]" WHILE line isn't ";end of section [Device|Sensors|Checksum]"                    

  line = reader.readLine();//Reads all lines up to "[Device|Sensors|Checksum]"

  if (line.equals("[Device|Sensors|Checksum]")) { //IF line is "[Device|Sensors|Checksum]" then  
                                                  //(check if line is "Value") ELSE read next line                    
   do {// DO read line and (check if line is "Value") WHILE line doesn't contain "Value"

     line = reader.readLine();//Reads all line up to first "Value"

     if (line.contains("Value")) { // IF line is "Value" then retrieve necessary value
                                   // ELSE read next line

      Hex1 = line.split("=")[1].trim();
      l1 = Long.parseLong(Hex1.substring(2), 16);
      JFrame frame1 = new JFrame("JOptionPane showMessageDialog example");
      JOptionPane.showMessageDialog(frame1, "Value has hex number\n " + Hex1 + "\n\n and integer\n" + l1 + "\n");

      System.out.println("Here's the line read  " + line);
      System.out.println("Here's the hex number from the line  " + Hex1);
      System.out.println("Here's the integer from the hex number  " + l1 + "\n");

      break;
     }
    } while (!"Value".contains(line = reader.readLine()));//while2 


   line = reader.readLine();  //Reads the line AFTER the first "Value" has been found

    do {//  Read line and check if line has "Value" WHILE line doesn't contain "Value"

     line = reader.readLine();//Reads all lines up to second "Value"

     if (line.contains("Value")) { // IF line is "Value" then retrieve necessary value
                                   // ELSE read next line

      Hex2 = line.split("=")[1].trim();
      l2 = Long.parseLong(Hex2.substring(2), 16);
      JFrame frame2 = new JFrame("JOptionPane showMessageDialog example");
      JOptionPane.showMessageDialog(frame2, "Value has hex number\n " + Hex2 + "\n\n and integer\n" + l2 + "\n");

      System.out.println("Here's the line read  " + line);
      System.out.println("Here's the hex number from the line  " + Hex2);
      System.out.println("Here's the integer from the hex number  " + l2 + "\n");

      break;

     }
    } while (!"Value".contains(line = reader.readLine()));
   }
  } while (!";end of section [Device|Sensors|Checksum]".equals(line = reader.readLine())); 
 if (l1 == l2) {
   JOptionPane.showMessageDialog(null, "Both checksum values ARE equal!");
   int status1 = 0;
   System.exit(status1);
 } else {
    JOptionPane.showMessageDialog(null, "Both checksum values NOT equal");
    int status2 = 0;
    System.exit(status2);
  }

} catch (IOException e) {
   System.out.println("IO Exception. Could not read file!");
}

編集

NPE の出力とスタック トレースは次のとおりです。

run:
Here's the line read  Value(2) = 0xE0A64F36
Here's the hex number from the line  0xE0A64F36
Here's the integer from the hex number  3768995638

Exception in thread "main" java.lang.NullPointerException
at robertskostalproject.checksumFinder.HexFinder(checksumFinder.java:32)
at robertskostalproject.checksumGUI.askDirectory(checksumGUI.java:43)
at robertskostalproject.RobertsKostalProject.main(RobertsKostalProject.java:18)
BUILD STOPPED (total time: 11 seconds)
4

2 に答える 2

3

「2番目のwhileループ」でNPEを取得する場所を指定していないため、 BufferedReader#readLine()を引用します。

戻り値: 行終了文字を含まない、行の内容を含む文字列、またはストリームの末尾に到達した場合はnull

さらに、frame2初期化されていない変数を使用しています。

于 2013-08-23T07:56:35.043 に答える
0

これが私が今持っているものです。多くの変更はありませんが、ありがたいことに機能します。

class checksumFinder {

public static long l1 = 1;
public static long l2 = 0;
//Default to not equal

String HexFinder(JFileChooser inFileName, String line, String Hex1, String Hex2)
throws FileNotFoundException, IOException {

    File file = inFileName.getSelectedFile();
    BufferedReader reader = new BufferedReader(new FileReader(file));

    try {

      line = reader.readLine();//Read all lines up to "[Device|Sensors|Checksum]"

      do {//Read line then check if line is "[Device|Sensors|Checksum]" WHILE isn't ";end of section [Device|Sensors|Checksum]"                    

        line = reader.readLine();

        if (line.equals("[Device|Sensors|Checksum]")) { //IF line is "[Device|Sensors|Checksum]" then  
                                                        //(check if line is "Value") ELSE read next line                    
          do {// DO read line and check line is "Value" WHILE line doesn't contain "Value"

            if (line.contains("Value")) { //IF line is "Value" then retrieve necessary value
                                          // ELSE read next line

              Hex1 = line.split("=")[1].trim();
              l1 = Long.parseLong(Hex1.substring(2), 16);
              JFrame frame1 = new JFrame("JOptionPane showMessageDialog example");
              JOptionPane.showMessageDialog(frame1, "Value has hex number\n " + Hex1 + "\n\n and integer\n" + l1 + "\n");

              System.out.println("Here's the line read  " + line);
              System.out.println("Here's the hex number from the line  " + Hex1);
              System.out.println("Here's the integer from the hex number  " + l1 + "\n");

              break;
            }
          } while (!"Value".contains(line = reader.readLine()));//while2   

          line = reader.readLine();  //Read the line AFTER first "Value" has been found

          do {//Read line and check if line has "Value" WHILE line doesn't contain "Value"

           if (line.contains("Value")) { // IF line is "Value" then retrieve necessary value
                                        // ELSE read next line

             Hex2 = line.split("=")[1].trim();
             l2 = Long.parseLong(Hex2.substring(2), 16);
             JFrame frame2 = new JFrame("JOptionPane showMessageDialog example");
             JOptionPane.showMessageDialog(frame2, "Value has hex number\n " + Hex2 + "\n\n and integer\n" + l2 + "\n");

             System.out.println("Here's the line read  " + line);
             System.out.println("Here's the hex number from the line  " + Hex2);
             System.out.println("Here's the integer from the hex number  " + l2 + "\n");

             break;
           }
         } while (!"Value".contains(line = reader.readLine()));//while3

         while (!";end of section [Device|Sensors|Checksum]".equals(line)){
            line = reader.readLine();
         }
       }
     } while (!";end of section [Device|Sensors|Checksum]".equals(line)); //while1

     if (l1 == l2) {
       JOptionPane.showMessageDialog(null, "Both checksum values ARE equal!");
       int status1 = 0;
       System.exit(status1);
     } else {
       JOptionPane.showMessageDialog(null, "Both checksum values NOT equal");
       int status2 = 0;
       System.exit(status2);
     }

 } catch (IOException e) {
      System.out.println("IO Exception. Could not read file!");
 }
   return null;
}

}

于 2013-09-06T10:51:49.730 に答える