BufferedReader memory buffering error?

I am working on a project for AP Computer Science, where we essentially create a library where you can add clients and books, check books for clients, etc., and we should be able to read / write on CSV. I have problems with this code (this is only part of it, and I'm sure that everything else works, it all approaches 600 lines, in total):

public void readForBook() { try{ BufferedReader CSVFile = new BufferedReader(new FileReader("book.csv")); String dataRow = CSVFile.readLine(); dataRow = CSVFile.readLine(); while (dataRow != null){ String[] dataArray = dataRow.split(", "); int tbuid = Integer.parseInt(dataArray[0]); String t_title = dataArray[1]; String tfirst = dataArray[2]; String tlast = dataArray[3]; String tdescription = dataArray[4]; String tisbn = dataArray[5]; String tdpurchase = dataArray[6]; String tcopyrightyear = dataArray[7]; double tcost = Double.parseDouble(dataArray[8]); dataRow = CSVFile.readLine(); int crYear = Integer.parseInt(tcopyrightyear); Book tempBook = new Book(tbuid, t_title, tfirst, tlast, tdescription, tisbn, tdpurchase, crYear, tcost); BookList.add(tempBook); } CSVFile.close(); } catch(IOException fnfe) { System.out.println(fnfe.getMessage()); } } public void readForCustomer(){ try{ BufferedReader CSVFile = new BufferedReader(new FileReader("customer.csv")); String customerRow = CSVFile.readLine(); customerRow = CSVFile.readLine(); while (customerRow != null){ String[] customerCSVArray = customerRow.split(", "); int tcuid = Integer.parseInt(customerCSVArray[0]); String temp_zip = customerCSVArray[7]; int tzip = Integer.parseInt(temp_zip); String temp_balance = customerCSVArray[8]; double tbalance = Double.parseDouble(temp_balance); Customer tempCustomer = new Customer(tcuid, customerCSVArray[1], customerCSVArray[2], customerCSVArray[3], customerCSVArray[4], customerCSVArray[5], customerCSVArray[6], tzip, tbalance, customerCSVArray[9]); CustomerList.add(tempCustomer); } CSVFile.close(); } catch(IOException fnfe) { System.out.println(fnfe.getMessage()); } } 

Here's the problem: the first, readForBook, works fine, however readForCustomer is the one that has the main exception "Exception in thread" "java.lang.OutOfMemoryError: Java heap space":

 Exception in thread "main" java.lang.OutOfMemoryError: Java heap space at java.nio.HeapByteBuffer.<init>(HeapByteBuffer.java:39) at java.nio.ByteBuffer.allocate(ByteBuffer.java:312) at sun.nio.cs.StreamDecoder.<init>(StreamDecoder.java:231) at sun.nio.cs.StreamDecoder.<init>(StreamDecoder.java:211) at sun.nio.cs.StreamDecoder.forInputStreamReader(StreamDecoder.java:50) at java.io.InputStreamReader.<init>(InputStreamReader.java:57) at java.util.Scanner.<init>(Scanner.java:590) at Customer.<init>(Customer.java:6) at Library.readForCustomer(Library.java:219) at Library.importFromTextFile(Library.java:170) at Library.mainMenu(Library.java:149) at Library.<init>(Library.java:17) at runIt.main(runIt.java:3) 

I ran a bunch of heaps through VisualVM, and he said that there are a large number of string instances.

+4
source share
2 answers

In your while you should continue to call CSV.readLine () . You only call it once outside the loop , which means you will end the endless loop and possibly a complete bunch.

+6
source

Change the loop to:

  while ((customerRow = CSVFile.readLine()) != null){ //... } 

And delete the line above: dataRow = CSVFile.readLine();

+2
source

All Articles