将字符串传递给布尔函数以扫描文件中的相同字符串时出现运行时错误
Runtime error when passing string into boolean function to scan file for an identical string
我正在创建的部分程序需要检查相同的字符串(表示产品的 ID 代码)是否已写入文本文件。这是为了阻止相同的 ID 被写入两次。
我正在使用一个布尔方法,该方法从 GUI 用户输入中传入一个字符串,然后将其与文件中的每个现有行进行比较。
方法如下
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;
}
如果布尔值 returns 为假,数据将被写入文件,如果 returns 为真,将出现错误消息并且不写入任何数据。
下面是依赖布尔输出的代码。
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);
}
}
然而,else 语句永远不会执行,即使相同的数字(例如 44)已多次输入为 ID。
我什至在里面用这个来证明字符串是一样的。并且相同的字符串产生了两次。
while (scanner.hasNextLine()) {
scannedString = scanner.nextLine();
String character = scanner.findInLine(ID);
System.out.println(scannedString);
System.out.println("Product ID: " + ID);
看来错误来自于这个语句:
if ((character) == (ID)) {
比较字符串对象是否相同。
使用以下内容:
if (character.equals(ID)){
应该比较字符串的值。
首先,您使用的是 Scanner 和 BufferedReader,在您的情况下,两者都可以使用,但都不是解决问题所必需的。
您可以尝试类似的片段。
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;
}
另外一个小技巧,变量名不要以大写字母开头(通常类首字母大写)。您可以参考一些在线教程以获得良好的编程实践。
干杯,
找到匹配项后必须中断循环,否则 Decision
值将被下一行覆盖。
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;
}
此外,我认为您在这里不需要 findInLine 方法。我希望这会解决你的问题。根据您的项目结构使用文件路径。
注意::如果我们在代码中遵循命名约定就好了。
将 hasIDAlreadyBeenUsed() 方法中的比较代码更改为以下内容:
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;
}
我正在创建的部分程序需要检查相同的字符串(表示产品的 ID 代码)是否已写入文本文件。这是为了阻止相同的 ID 被写入两次。
我正在使用一个布尔方法,该方法从 GUI 用户输入中传入一个字符串,然后将其与文件中的每个现有行进行比较。
方法如下
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;
}
如果布尔值 returns 为假,数据将被写入文件,如果 returns 为真,将出现错误消息并且不写入任何数据。
下面是依赖布尔输出的代码。
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);
}
}
然而,else 语句永远不会执行,即使相同的数字(例如 44)已多次输入为 ID。
我什至在里面用这个来证明字符串是一样的。并且相同的字符串产生了两次。
while (scanner.hasNextLine()) {
scannedString = scanner.nextLine();
String character = scanner.findInLine(ID);
System.out.println(scannedString);
System.out.println("Product ID: " + ID);
看来错误来自于这个语句:
if ((character) == (ID)) {
比较字符串对象是否相同。
使用以下内容:
if (character.equals(ID)){
应该比较字符串的值。
首先,您使用的是 Scanner 和 BufferedReader,在您的情况下,两者都可以使用,但都不是解决问题所必需的。 您可以尝试类似的片段。
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;
}
另外一个小技巧,变量名不要以大写字母开头(通常类首字母大写)。您可以参考一些在线教程以获得良好的编程实践。 干杯,
找到匹配项后必须中断循环,否则 Decision
值将被下一行覆盖。
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;
}
此外,我认为您在这里不需要 findInLine 方法。我希望这会解决你的问题。根据您的项目结构使用文件路径。
注意::如果我们在代码中遵循命名约定就好了。
将 hasIDAlreadyBeenUsed() 方法中的比较代码更改为以下内容:
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;
}