2017-11-09 4 views
0

Der Teil des Programms, den ich erstelle, erfordert eine Überprüfung, ob die gleiche Zeichenfolge (ID des Produktcodes) bereits in eine Textdatei geschrieben wurde. Damit wird verhindert, dass dieselbe ID zweimal geschrieben wird.Laufzeitfehler beim Übergeben der Zeichenfolge in die boolesche Funktion zum Durchsuchen der Datei nach einer identischen Zeichenfolge

Ich verwende eine boolesche Methode, die eine Zeichenfolge von der GUI-Benutzereingabe übergibt und dann mit jeder bereits vorhandenen Zeile in der Datei vergleicht.

Die Methode ist unten.

public boolean hasIDAlreadyBeenUsed(String IDBeingTested) { 
     boolean Decision = false; 
     String ID = "Product ID: "+IDBeingTested; 
     BufferedReader theBR; 
     Scanner scanner; 
     String scannedString; 
     try { 
      theBR = new BufferedReader(new FileReader("ProductData.txt")); 
      scanner = new Scanner(new File("ProductData.txt")); 

      while (scanner.hasNextLine()) { 
       scannedString = scanner.nextLine(); 

       String character = scanner.findInLine(ID); 


       if ((character) == (ID)) { 
        Decision = true; 
        System.out.println("they are a match: " + ID); 

       } else { 
        Decision = false; 
       } 
      } 
      theBR.close(); 
      theBR = null; 
     } catch (IOException ioe) { 
      Decision = false; 
      System.out.println(ioe); 
     } 

     return Decision; 
    } 

wenn die boolean ein false zurückgibt, werden die Daten in die Datei geschrieben werden, wenn es erscheint und keine Daten geschrieben liefert einen wahren eine Fehlermeldung.

Unten ist der Code, der auf dem booleschen Ausgang beruht.

private void jAddProductToDatabseButtonActionPerformed(java.awt.event.ActionEvent evt) {               


     if (!product.hasIDAlreadyBeenUsed(jProductIDTextField.getText())) { 
      try { 
       BufferedWriter ProductFileWriter = new BufferedWriter(new FileWriter("ProductData.txt", true)); 

       ProductFileWriter.write("Product Name: " + jProductNameTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product ID: " + jProductIDTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Weight: " + jProductWeightTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Selling Price (£): " + jProductSellingPriceTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Image File Name: " + jNameOfImageFileTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Manufacturer Address: " + jManufacturerAddressTextArea.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Type: " + jProductTypeTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Unit Cost: " + jProductUnitCostTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Delivery Time: " + jProductDeliveryTimeTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Shelf Life: " + jProductShelfLifeTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("Product Stock Level: " + jInitialStockLevelTextField.getText() + System.getProperty("line.separator")); 
       ProductFileWriter.write("==============================" + System.getProperty("line.separator")); 
       ProductFileWriter.flush(); 
       ProductFileWriter.close(); 
       ProductFileWriter = null; 
      } 
      catch (IOException ioe) {} 

     } 
     else { 

      JOptionPane.showMessageDialog(null, "Cannot input, ID HAS ALREADY BEEN USED", "Incorrect ID", JOptionPane.ERROR_MESSAGE); 
     } 
    } 

Die else-Anweisung wird jedoch nie ausgeführt, auch wenn die gleiche Zahl, z. B. 44, mehrmals als ID eingegeben wurde.

Ich benutzte sogar dieses Innere, um zu zeigen, dass die Saiten die gleichen waren. und die gleiche Zeichenfolge wird zweimal erzeugt.

while (scanner.hasNextLine()) { 
      scannedString = scanner.nextLine(); 

      String character = scanner.findInLine(ID); 
      System.out.println(scannedString); 
      System.out.println("Product ID: " + ID); 
+0

Bitte lesen Sie [Unter welchen Umständen kann ich „dringend“ oder andere Ähnliche Ausdrücke auf meine Frage hinzufügen, um schnelle Antworten zu erhalten? ] (// meta.stackoverflow.com/q/326569) - die Zusammenfassung ist, dass dies keine ideale Möglichkeit ist, Freiwillige anzusprechen, und ist wahrscheinlich kontraproduktiv, um Antworten zu erhalten. Bitte unterlassen Sie das Hinzufügen zu Ihren Fragen. – halfer

+0

daran in Zukunft tragen wird :) – giddian

Antwort

0

Sie müssen die Schleife brechen, sobald Sie Übereinstimmung gefunden haben, sonst wird Decision Wert für die nächste Zeile überschrieben.

public static boolean hasIDAlreadyBeenUsed(String IDBeingTested) { 
    boolean Decision = false; 
    String ID = "Product ID:" + IDBeingTested; 

    Scanner scanner; 
    String scannedString; 
    try { 

     scanner = new Scanner(new File("src/ProductData.txt")); 

     while (scanner.hasNextLine()) { 
      scannedString = scanner.nextLine(); 

      if (scannedString.equalsIgnoreCase(ID)) { 

       Decision = true; 
       System.out.println("they are a match: " + ID); 
       break; 

      } 
     } 

    } catch (IOException ioe) { 
     Decision = false; 
     System.out.println(ioe); 
    } 

    return Decision; 
} 

Auch glaube nicht, dass ich Sie hier findInLine Methode benötigen. Ich hove das wird Ihr Problem lösen. Verwenden Sie den Dateipfad gemäß Ihrer Projektstruktur.

Hinweis :: Es ist gut, wenn wir den Namenskonventionen im Code folgen.

+0

das ist gearbeitet, vielen dank. Kannst du bitte klarstellen, dass src einfach den Namen des Dateipfads bedeutet? oder ist das falsch? – giddian

+0

src ist der Ordner, in dem die Datei gespeichert ist. – Tejendra

0

Es scheint, dass der Fehler aus dieser Aussage kommt:

if ((character) == (ID)) { 

Dies vergleicht, wenn die String-Objekte gleich sind.

mit dem folgenden:

if (character.equals(ID)){ 

stattdessen den Wert des Strings vergleichen sollte.

+0

Ich habe den Code wie folgt lief und die folgende Fehlermeldung, „AWT-Eventqueue-0“ java.lang.NullPointerException, Möchten Sie wissen, wie diese zu lösen? – giddian

+0

Die Strings, die ich zu vergleichen versuche, sind zum Beispiel "Product ID: 4" mit "Product ID: 4" .. also denke ich, dass der Grund dafür ist, dass Its versucht, einen numerischen Wert aus einer Zeichenkette abzuleiten. Weißt du, ob ich richtig liege? – giddian

0

Als Erstes verwenden Sie Scanner und BufferedReader, in Ihrem Fall können beide verwendet werden, aber beide sind nicht erforderlich, um Ihr Problem zu lösen. Sie können etwas Schnipsel wie probieren.

public static boolean hasIDAlreadyBeenUsed(String IDBeingTested) throws IOException { 
     boolean Decision = false; 
     String ID = "Product ID: "+IDBeingTested; 
     BufferedReader theBR = null; 
     String scannedString; 
     try { 
      theBR = new BufferedReader(new FileReader("ProductData.txt")); 

      while ((scannedString=theBR.readLine())!=null) { 
       if(!Decision) 
        Decision = scannedString.contains(ID); 
       else 
        break; 
      } 
     } finally { 
      theBR.close(); 
     } 

     return Decision; 
    } 

Auch ein Tipp, den ich, Sie starten die Variablennamen (in der Regel Klassen haben die ersten Buchstaben in der Hauptstadt) mit Großbuchstaben nicht geben möchte. Sie können einige Online-Tutorial für gute Programmierpraktiken verweisen. Prost,

0

Ihren Vergleichscode des folgenden in hasIDAlreadyBeenUsed() -Methode ändern:

String character = scanner.findInLine(ID); 

if ((character.trim().equals(ID)) { // by trimming I'm removing the line separator and then use equals to do a string comparision. 
    Decision = true; 
    System.out.println("they are a match: " + ID); 
} else { 
    Decision = false; 
} 
Verwandte Themen