Exception in thread “main” java.lang.NullPointerException - java

The following problem appears in my console after I execute the code and introduce the first cota l[i].cota = sc.nextLine();
Exception in thread "main" java.lang.NullPointerException
at exercicio6.introlivros(exercicio6.java:18)
at exercicio6.main(exercicio6.java:9)
can anyone tell me what's the issue?
Here is my code
public class exercicio6 {
public static Scanner sc = new Scanner(System.in);
public static void main(String[] args) {
livro l[] = new livro[200];
l = introlivros();
apagarbase(l);
}
public static livro[] introlivros() {
int i = 0;
livro l[] = new livro[200];
do {
System.out.print("Introduza a cota:");
l[i].cota = sc.nextLine();
if (l[i].cota.length() == 0)
break;
do {
System.out.print("Introduza o autor:");
l[i].autor = sc.nextLine();
} while (l[i].autor.length() < 40);
System.out.print("Introduza o titulo:");
l[i].titulo = sc.nextLine();
System.out.println("Introduza a data:");
System.out.println("Dia:");
l[i].data[0] = sc.nextInt();
System.out.println("Mes:");
l[i].data[1] = sc.nextInt();
System.out.println("Ano:");
l[i].data[2] = sc.nextInt();
i++;
} while (i < 200);
return l;
}
public static void remover(livro l[]) {
String cota1 = new String();
boolean verificar = false;
do {
cota1 = sc.nextLine();
if (cota1.length() != 0) {
for (int i = 0; i < 200; i++) {
if (cota1 == l[i].cota) {
l[i].cota = "";
break;
}
if (cota1 != l[i].cota) {
verificar = true;
}
}
}
if (cota1.length() == 0) {
System.out.println("Introduza a cota de novo!");
}
if (verificar == true) {
System.out.println("Esse livro não eciste!");
}
} while (cota1.length() == 0);
}
public static void apagarbase(livro l[]) {
livro p[] = new livro[200];
for (int i = 0; i < 200; i++) {
l[i].cota = null;
l[i].autor = null;
l[i].titulo = null;
l[i].data[0] = 0;
/*
* l[i].data[1]=null; l[i].data[2]=null; l[i].estado[0]=null;
*/
}
}
}
class livro {
String cota = new String();
String autor = new String();
String titulo = new String();
int data[] = new int[3];
char estado[] = new char[1]; // Requisitado R, Livre L, Condicionado C;
}

As stated above - objects are initialized to null
A quick way of populating an array is -
livro l[] = new livro[200];
Arrays.fill(l, new livro());

Here you are instantiating your array:
livro l[] = new livro[200];
However here you are attempting to access an element containing an object that does not exist yet:
l[i].cota = sc.nextLine();
You need to loop through and instantiate a new object at EVERY element. Either use a for loop or Array.fill.

Related

How to input Strings into a 2D array

I have this code and I need to export the strings 'Name','Testav','HWav','Lows','grade' into a 2D array with the columns being the following respectively. I then need to export the 2D array into a csv file. Any help would be greatly appreciated.
import java.util.*;
import java.io.*;
import java.io.PrintWriter;
import java.text.*;
public class ComputeGrades {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.printf("Please enter the name of the input file: ");
String input_name = in.next();
System.out.printf("Please enter the name of the output CSV file: ");
String csv_name = in.next();
System.out.printf("Please enter the name of the output pretty-print file: ");
String pretty_name = in.next();
processGrades(input_name, csv_name, pretty_name);
System.out.printf("\nExiting...\n");
}
public static void processGrades (String input_name, String csv_name, String pretty_name)
{
PrintWriter csv = null;
PrintWriter pretty = null;
String[][] data = readSpreadsheet(input_name);
boolean resultb = sanityCheck(data);
int length = data.length;
ArrayList<String> test_avg = new ArrayList<String>();
ArrayList<String> HW_avg = new ArrayList<String>();
ArrayList<String> NAME = new ArrayList<String>();
ArrayList<String> ColN = new ArrayList<String>();
ArrayList<String> Hell = new ArrayList<String>();
String[][] kill_me = new String[length][];
for(int row = 1; row<length; row++)
{
String name = data[row][0];
String name2 = data[row][1];
String Name = name+" "+name2;
int test1 = Integer.parseInt(data[row][2]);
int test2 = Integer.parseInt(data[row][3]);
int test3 = Integer.parseInt(data[row][4]);
int Test = (test1+test2+test3)/3;
String Testav = Integer.toString(Test);
int hw1 = Integer.parseInt(data[row][5]);
int hw2 = Integer.parseInt(data[row][6]);
int hw3 = Integer.parseInt(data[row][7]);
int hw4 = Integer.parseInt(data[row][8]);
int hw5 = Integer.parseInt(data[row][9]);
int hw6 = Integer.parseInt(data[row][10]);
int hw7 = Integer.parseInt(data[row][11]);
int HW = (hw1+hw2+hw3+hw4+hw5+hw6+hw7)/7;
String HWav = Integer.toString(HW);
int[] trying = {Test, HW};
int low = find_min(trying);
String Lows = Integer.toString(low);
String grade = null;
if(low>=90)
{
grade ="A";
}
if(low < 90 && low>= 80)
{
grade = "B";
}
if(low <80 && low>=70)
{
grade ="C";
}
if(low<70 && low>=60)
{
grade="D";
}
if(low<60)
{
grade = "F";
}
test_avg.add(Testav);
HW_avg.add(HWav);
NAME.add(Name);
Hell.add(Name);
Hell.add(Testav);
Hell.add(HWav);
Hell.add(Lows);
Hell.add(grade);
}
System.out.println(Hell);
System.out.printf("\n");
File csvFile = new File(csv_name);
try (PrintWriter csvWriter = new PrintWriter(new FileWriter(csvFile));){
Hell.stream().forEach(csvWriter::println);
} catch (IOException e) {
}
}
public static int find_min(int[] values)
{
int result = values[0];
for(int i = 0; i<values.length; i++)
{
if(values[i]<result)
{
result = values[i];
}
}
return result;
}
public static boolean sanityCheck(String[][] data)
{
if (data == null)
{
System.out.printf("Sanity check: nul data\n");
return false;
}
if(data.length<3)
{
System.out.printf("Sanity check: %d rows\n",data.length);
return false;
}
int cols= data[0].length;
for(int row = 0; row<data.length; row++)
{
int current_cols = data[row].length;
if(current_cols!=cols)
{
System.out.printf("Sanity Check: %d columns at rows%d\n", current_cols, row);
return false;
}
}
return true;
}
public static String[][] readSpreadsheet(String filename)
{
ArrayList<String> lines = readFile(filename);
if (lines == null)
{
return null;
}
int rows = lines.size();
String[][] result = new String[rows][];
for (int i = 0; i < rows; i++)
{
String line = lines.get(i);
String[] values = line.split(",");
result[i] = values;
}
return result;
}
public static ArrayList<String> readFile(String filename)
{
File temp = new File(filename);
Scanner input_file;
try
{
input_file = new Scanner(temp);
} catch (Exception e)
{
System.out.printf("Failed to open file %s\n",
filename);
return null;
}
ArrayList<String> result = new ArrayList<String>();
while (input_file.hasNextLine())
{
String line = input_file.nextLine();
result.add(line);
}
input_file.close();
return result;
}
}
input file:
First,Last,Exam1,Exam2,Final,H1,H2,H3,H4,H5,H6,H7
Ping,Milledge,43,59,68,69,62,43,60,38,37,40
Elisa,Oltz,76,94,73,100,99,100,90,97,100,92
Leonard,Havers,67,95,57,69,95,71,68,61,93,61
Setsuko,Lovera,78,100,84,89,88,92,65,85,66,97
Franklyn,Degnim,54,74,50,63,78,42,42,41,67,64
Gwyneth,Marsico,61,89,81,59,59,62,88,60,66,66
Abigail,Greep,69,99,93,94,91,85,78,91,69,71
Majorie,Granvold,78,100,100,82,96,100,89,100,100,94
Daphine,Polaco,62,82,88,81,68,89,62,73,90,62
An,Corvera,44,71,37,46,57,42,59,66,54,60
Ayanna,Pensiero,64,42,56,37,53,66,69,52,43,58
Era,Deming,98,81,100,69,65,73,77,78,73,89
Michal,Slentz,73,85,81,82,74,93,81,76,69,81
Corie,Brazen,86,99,66,100,69,97,96,100,70,84
Dona,Tufte,63,54,70,71,55,68,86,66,75,63
Juan,Rohdenburg,78,89,100,91,80,97,92,100,98,100
Orville,Samit,88,63,60,88,81,56,91,76,77,80
Ricky,Knoechel,100,100,93,81,100,90,100,92,100,84
Blythe,Threet,38,68,35,61,63,51,48,72,49,51
Sammie,Wachs,46,53,52,76,50,52,56,68,46,75
Estelle,Veazey,72,87,69,98,96,77,95,91,100,91
Agatha,Keckler,100,92,90,95,85,100,94,85,92,100
Novella,Oros,85,76,100,92,84,77,77,90,86,98
Tanya,Quinlisk,47,78,71,50,79,52,69,66,51,45
Marion,Coltrin,68,68,54,39,61,44,66,58,47,74
Helene,Karow,100,100,75,79,100,100,100,92,89,96
Shonta,Bourek,100,96,90,81,97,84,91,100,100,100
Hyon,Anglemyer,81,76,43,43,47,53,44,60,57,65
Ervin,Kenison,78,53,54,75,55,46,61,75,56,69
Renato,Urch,71,64,64,84,49,57,63,69,81,64
Mikel,Burleigh,88,100,90,100,90,91,90,80,74,74
Val,Royal,100,80,100,99,100,100,76,86,100,96
Jodie,Adolfo,94,77,59,83,67,79,87,82,82,75
Roselee,Lienhard,68,75,58,82,96,62,60,94,68,58
Austin,Holznecht,76,49,79,48,58,68,67,71,70,61
Emelia,Toney,70,95,74,90,99,68,100,66,98,98
Lucy,Rhodd,71,91,100,82,100,93,100,100,71,81
Sacha,Chee,78,71,90,82,74,64,62,87,69,84
Julio,Lackner,56,86,53,88,88,73,57,59,80,85
Salvador,Gretzner,54,83,91,66,78,67,61,84,82,6
export file(csv_name)
name,exam_score,hw_score,min_score,grade
Ping Milledge,56.666667,49.857143,49.857143,F
Elisa Oltz,81.000000,96.857143,81.000000,B
Leonard Havers,73.000000,74.000000,73.000000,C
Setsuko Lovera,87.333333,83.142857,83.142857,B
Franklyn Degnim,59.333333,56.714286,56.714286,F
Gwyneth Marsico,77.000000,65.714286,65.714286,D
Abigail Greep,87.000000,82.714286,82.714286,B
Majorie Granvold,92.666667,94.428571,92.666667,A
Daphine Polaco,77.333333,75.000000,75.000000,C
An Corvera,50.666667,54.857143,50.666667,F
Ayanna Pensiero,54.000000,54.000000,54.000000,F
Era Deming,93.000000,74.857143,74.857143,C
Michal Slentz,79.666667,79.428571,79.428571,C
Corie Brazen,83.666667,88.000000,83.666667,B
Dona Tufte,62.333333,69.142857,62.333333,D
Juan Rohdenburg,89.000000,94.000000,89.000000,B
Orville Samit,70.333333,78.428571,70.333333,C
Ricky Knoechel,97.666667,92.428571,92.428571,A
Blythe Threet,47.000000,56.428571,47.000000,F
Sammie Wachs,50.333333,60.428571,50.333333,F
Estelle Veazey,76.000000,92.571429,76.000000,C
Agatha Keckler,94.000000,93.000000,93.000000,A
Novella Oros,87.000000,86.285714,86.285714,B
Tanya Quinlisk,65.333333,58.857143,58.857143,F
Marion Coltrin,63.333333,55.571429,55.571429,F
Helene Karow,91.666667,93.714286,91.666667,A
Shonta Bourek,95.333333,93.285714,93.285714,A
Hyon Anglemyer,66.666667,52.714286,52.714286,F
Ervin Kenison,61.666667,62.428571,61.666667,D
Renato Urch,66.333333,66.714286,66.333333,D
Mikel Burleigh,92.666667,85.571429,85.571429,B
Val Royal,93.333333,93.857143,93.333333,A
Jodie Adolfo,76.666667,79.285714,76.666667,C
Roselee Lienhard,67.000000,74.285714,67.000000,D
Austin Holznecht,68.000000,63.285714,63.285714,D
Emelia Toney,79.666667,88.428571,79.666667,C
Lucy Rhodd,87.333333,89.571429,87.333333,B
Sacha Chee,79.666667,74.571429,74.571429,C
Julio Lackner,65.000000,75.714286,65.000000,D
Salvador Gretzner,76.000000,71.714286,71.714286,C
export file 2(pretty_name)
name: exam score, hw score, min score, grade
Ping Milledge: 56.67, 49.86, 49.86, F
Elisa Oltz: 81.00, 96.86, 81.00, B
Leonard Havers: 73.00, 74.00, 73.00, C
Setsuko Lovera: 87.33, 83.14, 83.14, B
Franklyn Degnim: 59.33, 56.71, 56.71, F
Gwyneth Marsico: 77.00, 65.71, 65.71, D
Abigail Greep: 87.00, 82.71, 82.71, B
Majorie Granvold: 92.67, 94.43, 92.67, A
Daphine Polaco: 77.33, 75.00, 75.00, C
An Corvera: 50.67, 54.86, 50.67, F
Ayanna Pensiero: 54.00, 54.00, 54.00, F
Era Deming: 93.00, 74.86, 74.86, C
Michal Slentz: 79.67, 79.43, 79.43, C
Corie Brazen: 83.67, 88.00, 83.67, B
Dona Tufte: 62.33, 69.14, 62.33, D
Juan Rohdenburg: 89.00, 94.00, 89.00, B
Orville Samit: 70.33, 78.43, 70.33, C
Ricky Knoechel: 97.67, 92.43, 92.43, A
Blythe Threet: 47.00, 56.43, 47.00, F
Sammie Wachs: 50.33, 60.43, 50.33, F
Estelle Veazey: 76.00, 92.57, 76.00, C
Agatha Keckler: 94.00, 93.00, 93.00, A
Novella Oros: 87.00, 86.29, 86.29, B
Tanya Quinlisk: 65.33, 58.86, 58.86, F
Marion Coltrin: 63.33, 55.57, 55.57, F
Helene Karow: 91.67, 93.71, 91.67, A
Shonta Bourek: 95.33, 93.29, 93.29, A
Hyon Anglemyer: 66.67, 52.71, 52.71, F
Ervin Kenison: 61.67, 62.43, 61.67, D
Renato Urch: 66.33, 66.71, 66.33, D
Mikel Burleigh: 92.67, 85.57, 85.57, B
Val Royal: 93.33, 93.86, 93.33, A
Jodie Adolfo: 76.67, 79.29, 76.67, C
Roselee Lienhard: 67.00, 74.29, 67.00, D
Austin Holznecht: 68.00, 63.29, 63.29, D
Emelia Toney: 79.67, 88.43, 79.67, C
Lucy Rhodd: 87.33, 89.57, 87.33, B
Sacha Chee: 79.67, 74.57, 74.57, C
Julio Lackner: 65.00, 75.71, 65.00, D
Salvador Gretzner: 76.00, 71.71, 71.71, C
This should do it, if you have question about the code, just ask.
public static void processGrades (String input_name, String csv_name, String pretty_name) {
DecimalFormat decimalFormat = new DecimalFormat(".000000");
String[][] data = readSpreadsheet(input_name);
String[][] result = new String[data.length][];
result[0] = new String[]{"name", "exam_score", "hw_score", "min_score", "grade"};
// Export to 2D String array
for(int row = 1; row < data.length; row++) {
String name = data[row][0] + " " + data[row][1];
double testAverage = average(data[row], 2, 5);
double homeworkAverage = average(data[row], 5, 12);
double min = Math.min(testAverage, homeworkAverage);
char grade = (char) (74 - ((int) min / 10));
grade = grade > 'D' ? 'F' : grade;
result[row] = new String[]{
name,
decimalFormat.format(testAverage),
decimalFormat.format(homeworkAverage),
decimalFormat.format(min),
Character.toString(grade)
};
}
// Export 2D array into a csv String
String csv = "";
for (int y = 0; y < result.length; y++) {
for (int x = 0; x < result[y].length - 1; x++) {
csv += result[y][x] + ",";
}
csv += result[y][result[y].length - 1] + "\n";
}
// Save String in file
File file = new File(csv_name);
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(file.getAbsoluteFile()));
bw.write(csv);
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}
private static double average(String[] row, int fromIndex, int toIndex) {
double total = 0;
for (int i = fromIndex; i < toIndex; i++) {
total += Integer.parseInt(row[i]);
}
return total / (toIndex - fromIndex);
}

How do I export the ArrayList to a CSV file

I have this code, it gets the average grade, but I need to export the arraylist Hell to a CSV file. How do I do this?
import java.util.*;
import java.io.*;
import java.io.PrintWriter;
import java.text.*;
public class hello3 {
public static void main(String[] args)
{
Scanner in = new Scanner(System.in);
System.out.printf("Please enter the name of the input file: ");
String input_name = in.next();
System.out.printf("Please enter the name of the output CSV file: ");
String csv_name = in.next();
System.out.printf("Please enter the name of the output pretty-print file: ");
String pretty_name = in.next();
processGrades(input_name, csv_name, pretty_name);
System.out.printf("\nExiting...\n");
}
public static void processGrades (String input_name, String csv_name, String pretty_name)
{
PrintWriter csv = null;
PrintWriter pretty = null;
String[][] data = readSpreadsheet(input_name);
boolean resultb = sanityCheck(data);
int length = data.length;
ArrayList<String> test_avg = new ArrayList<String>();
ArrayList<String> HW_avg = new ArrayList<String>();
ArrayList<String> NAME = new ArrayList<String>();
ArrayList<String> ColN = new ArrayList<String>();
ArrayList<String> Hell = new ArrayList<String>();
for(int row = 1; row<length; row++)
{
String name = data[row][0];
String name2 = data[row][1];
String Name = name+" "+name2;
int test1 = Integer.parseInt(data[row][2]);
int test2 = Integer.parseInt(data[row][3]);
int test3 = Integer.parseInt(data[row][4]);
int Test = (test1+test2+test3)/3;
String Testav = Integer.toString(Test);
int hw1 = Integer.parseInt(data[row][5]);
int hw2 = Integer.parseInt(data[row][6]);
int hw3 = Integer.parseInt(data[row][7]);
int hw4 = Integer.parseInt(data[row][8]);
int hw5 = Integer.parseInt(data[row][9]);
int hw6 = Integer.parseInt(data[row][10]);
int hw7 = Integer.parseInt(data[row][11]);
int HW = (hw1+hw2+hw3+hw4+hw5+hw6+hw7)/7;
int[] trying = {Test, HW};
int low = find_min(trying);
String grade = null;
if(low>=90)
{
grade ="A";
}
if(low < 90&& low>= 80)
{
grade = "B";
}
if(low <80&&low>=70)
{
grade ="C";
}
if(low<70&&low>=60)
{
grade="D";
}
if(low<60)
{
grade = "F";
}
String Lows = Integer.toString(low);
String HWav = Integer.toString(HW);
test_avg.add(Testav);
HW_avg.add(HWav);
NAME.add(Name);
Hell.add(Name);
Hell.add(Testav);
Hell.add(HWav);
Hell.add(Lows);
Hell.add(grade);
System.out.println(Hell);
System.out.printf("\n");
}
}
public static int find_min(int[] values)
{
int result = values[0];
for(int i = 0; i<values.length; i++)
{
if(values[i]<result)
{
result = values[i];
}
}
return result;
}
public static boolean sanityCheck(String[][] data)
{
if (data == null)
{
System.out.printf("Sanity check: nul data\n");
return false;
}
if(data.length<3)
{
System.out.printf("Sanity check: %d rows\n",data.length);
return false;
}
int cols= data[0].length;
for(int row = 0; row<data.length; row++)
{
int current_cols = data[row].length;
if(current_cols!=cols)
{
System.out.printf("Sanity Check: %d columns at rows%d\n", current_cols, row);
return false;
}
}
return true;
}
public static String[][] readSpreadsheet(String filename)
{
ArrayList<String> lines = readFile(filename);
if (lines == null)
{
return null;
}
int rows = lines.size();
String[][] result = new String[rows][];
for (int i = 0; i < rows; i++)
{
String line = lines.get(i);
String[] values = line.split(",");
result[i] = values;
}
return result;
}
public static ArrayList<String> readFile(String filename)
{
File temp = new File(filename);
Scanner input_file;
try
{
input_file = new Scanner(temp);
} catch (Exception e)
{
System.out.printf("Failed to open file %s\n",
filename);
return null;
}
ArrayList<String> result = new ArrayList<String>();
while (input_file.hasNextLine())
{
String line = input_file.nextLine();
result.add(line);
}
input_file.close();
return result;
}
}
Any help would be appreciated. thank you.
Broadly, you need to open a file with the name you require, and a writer in a loop - like this:
File csvFile = new File(csvName);
try (PrintWriter csvWriter = new PrintWriter(new FileWriter(csvFile));){
for(String item : list){
csvWriter.println(item);
}
} catch (IOException e) {
//Handle exception
e.printStackTrace();
}
Obviously you will have to print some commas as required

SPOJ Time Limit Exceeded - GENERAL

I'm trying to solve this problem of SPOJ: http://br.spoj.com/problems/GENERAL/
My solution works in Ideone (http://ideone.com/Xj2B9Y), but when I put the same solution in SPOJ, it reports that TLE - Time Limit Exceeded.
I have searched in the Internet to find a solution to improve my code. I replaced the "Scanner" by "BufferedReader", but I keep getting the message TLE.
Please could someone tell me where I am going wrong?
public static void main(String[] args) throws java.lang.Exception
{
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
StringTokenizer st;
//Scanner scan = new Scanner(System.in);
int instancias = Integer.parseInt(br.readLine());
int count = 0;
while(instancias != 0)
{
count = 0;
boolean possible = true;
boolean impossible = false;
st = new StringTokenizer(br.readLine());
int numSoldados = Integer.parseInt(st.nextToken());
int distancia = Integer.parseInt(st.nextToken());
int[] listaSoldados = new int[numSoldados];
st = new StringTokenizer(br.readLine());
for (int i = 0; i < numSoldados; i++)
{
listaSoldados[i] = Integer.parseInt(st.nextToken());
}
while(possible)
{
possible = false;
for (int i = 0; i < numSoldados; i++)
{
if(numSoldados - (i + distancia) >= 1)
{
int alturaPS = listaSoldados[i];
int alturaSS = listaSoldados[i + distancia];
if(alturaPS > alturaSS)
{
listaSoldados[i] = alturaSS;
listaSoldados[i + distancia] = alturaPS;
count = count + 1;
possible = true;
}
}
else
{
if(!possible)
{
for (int j = 0; j < numSoldados - 1; j++)
{
if(listaSoldados[j] > listaSoldados[j+1])
{
impossible = true;
break;
}
}
break;
}
break;
}
}
}
if(impossible)
System.out.println("impossivel");
else
System.out.println(count);
instancias--;
}
}

Array throws NullPointerException in Java

I have the following little problem... I have this code that uses the method OpenFile() of one class ReadData to read a .txt file and also I have another class ArraysTZones used to create an object that stores 3 arrays (data1,data2,data3) and 3 integers (total1,total2,total3) returned by the method OpenFile(). The problem is that when I try to display each array (data1,data2,data3) using the method getArray() of ArrayTZones it stops and displays the error NullPointerException. Anyone knows how could I fix this?
public static void main (String args[]) throws IOException {
String fileName = ".//data.txt";
int[] def = new int[180];
try {
ReadData file = new ReadData(fileName);
ArraysTZones summaryatz = new ArraysTZones();
summaryatz = file.OpenFile();
for (int i = 0; i < 180; i++)
System.out.print (summaryatz.getArray1()[i] + " ");
System.out.println ("");
System.out.println (summaryatz.getTotal1());
for (int i = 0; i < 180; i++)
System.out.print (summaryatz.getArray2()[i] + " ");
System.out.println ("");
System.out.println (summaryatz.getTotal2());
for (int i = 0; i < 180; i++)
System.out.print (summaryatz.getArray3()[i] + " ");
System.out.println ("");
System.out.println (summaryatz.getTotal3());
}
catch (IOException e) {
System.out.println(e.getMessage());
}
}
Heres OpenFile()
public ArraysTZones OpenFile() throws IOException {
FileReader reader = new FileReader(path);
BufferedReader textReader = new BufferedReader(reader);
int numberOfTimeZones = 3;
int[] data1 = new int[180];
int[] data2 = new int[180];
int[] data3 = new int[180];
int total1 = 0;
int total2 = 0;
int total3 = 0;
ArraysTZones atz = new ArraysTZones();
for (int i = 0; i < numberOfTimeZones; i++){
if (i == 0) {
String firstTimeZone = textReader.readLine();
String[] val = firstTimeZone.split ("\\s+");
for (int u = 0; u < val.length; u++)
{
int stats = (int)(Math.ceil(Math.abs(Double.parseDouble(val[u]))));
total1 += stats;
data1[u] = stats;
}
total1= total1/180;
atz.setTotal1(total1);
atz.setArray1(data1);
}
else
if (i == 1) {
String secondTimeZone = textReader.readLine();
String[] val = secondTimeZone.split ("\\s+");
for (int u = 0; u < val.length; u++)
{
int stats = (int)(Math.ceil(Math.abs(Double.parseDouble(val[u]))));
total2 += stats;
data2[u] = stats;
}
total2= total2/180;
atz.setTotal2(total2);
atz.setArray2(data2);
}
else {
String thirdTimeZone = textReader.readLine();
String[] val = thirdTimeZone.split ("\\s+");
for (int u = 0; u < val.length; u++)
{
int stats = (int)(Math.ceil(Math.abs(Double.parseDouble(val[u]))));
total3 += stats;
data3[u] = stats;
}
total3= total3/180;
atz.setTotal3(total3);
atz.setArray3(data3);
}
}
textReader.close();
return atz;
}
The getArray()
public int[] getArray1 () {
return data1;
}
And setArray()
public void setArray1 (int[] farray) {
int[] data1 = new int[180];
//int[] farray = new int[180];
data1 = farray;
}
The problem seems to be here
public void setArray1 (int[] farray)
{
int[] data1 = new int[180];
//int[] farray = new int[180];
data1 = farray;
}
You're declaring a new variable called data1 and storing the content of farray to it.
After that method is done, that variable will be removed, due to his scope.
Remove int[] from the line int[] data1 = new int[180]; (or just remove the whole line .. it is unnecessary) and your data will be stored in the correct variable that was declared for the class.
public void setArray1 (int[] farray) {
data1 = farray;
}
You have to initialize ArraysTZones

Java Serialization issues

I have this code that writes an object:
FileOutputStream fileOut = new FileOutputStream("Model.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);
out.close();
fileOut.close();
And this code that loads the object:
Model m = null;
try {
FileInputStream fileIn = new FileInputStream("Model.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
m = (Model) in.readObject();
in.close();
fileIn.close();
} catch (Exception e) {}
setStudentList(m.getStudentList());
setModuleList(m.getModuleList());
I'm pretty sure that saving works, as when I opened the file in notepad++ I saw most of the data that I had saved, but when I load there is no data in module list.
Full source code:
import java.io.*;
import java.util.*;
public class Model implements java.io.Serializable {
private Student[] studentList = new Student[0];
private Module[] moduleList = new Module[0];
public void menu() {
while (true) {
System.out.println ("MENU");
System.out.println ("");
System.out.println (" 1 - Run Tests");
System.out.println (" 2 - Add Student");
System.out.println (" 3 - Add Module");
System.out.println (" 4 - Add Student To Module");
System.out.println (" 5 - Save System (Text file)");
System.out.println (" 6 - Load System (Text file)");
System.out.println (" 7 - Save System (Serialized)");
System.out.println (" 8 - Load System (Serialized)");
System.out.println (" 9 - Print Report");
System.out.println ("");
System.out.print ("Enter choice: ");
String input = keyboard.readString();
switch (input) {
case "1" :
runTests();
break;
case "2" :
System.out.print("First Name : ");
String fN = keyboard.readString();
System.out.print("Surname : ");
String sN = keyboard.readString();
System.out.print("Course Code : ");
String c = keyboard.readString();
System.out.print("User ID : ");
String iD = keyboard.readString();
AddStudent(iD, sN, fN, c);
break;
case "3" :
System.out.print("Module Code : ");
String code = keyboard.readString();
String[] temp = new String[0];
AddModule(code,temp);
break;
case "4" :
System.out.print("Module Code : ");
code = keyboard.readString();
Module m = findAModule(code);
if (m != null) {
System.out.print("User ID : ");
iD = keyboard.readString();
Student s = findAStudent(iD);
if (s != null) {
m.addThisStudent(s);
} else {
System.out.println("Student not found");
}
} else {
System.out.println("Module not found");
}
break;
case "5" :
saveToTextFiles();
break;
case "6" :
loadFromTextFiles();
break;
case "7" :
saveSerialized();
break;
case "8" :
break;
case "9" :
printReport();
break;
}
}
}
public void runTests() {
loadFromTextFiles();
saveSerialized();
printReport();
}
public void loadFromTextFiles() {
studentList = new Student[0];
moduleList = new Module[0];
try {
Scanner fileReader = new Scanner(new InputStreamReader(new FileInputStream("students.txt")));
int num = fileReader.nextInt(); fileReader.nextLine();
for (int i = 0; i < num; i++) {
String u = fileReader.nextLine();
String sn = fileReader.nextLine();
String fn = fileReader.nextLine();
String c = fileReader.nextLine();
AddStudent(u, sn, fn, c);
}
fileReader.close();
fileReader = new Scanner(new InputStreamReader(new FileInputStream("modules.txt")));
num = fileReader.nextInt(); fileReader.nextLine();
for (int i = 0; i < num; i++) {
String code = fileReader.nextLine();
int numOfStudents = fileReader.nextInt(); fileReader.nextLine();
String[] students = new String[numOfStudents];
for (int j = 0; j < numOfStudents; j++) {
students[j] = fileReader.nextLine();
}
AddModule(code, students);
}
fileReader.close();
} catch (IOException e) {}
}
public void saveToTextFiles () {
try {
PrintWriter outfile = new PrintWriter(new OutputStreamWriter (new FileOutputStream("students.txt")));
outfile.println(studentList.length);
for (int i = 0; i < studentList.length; i++) {
outfile.println(studentList[i].getUID());
outfile.println(studentList[i].getSN());
outfile.println(studentList[i].getFN());
outfile.println(studentList[i].getDegree());
}
outfile.close();
outfile = new PrintWriter(new OutputStreamWriter (new FileOutputStream("modules.txt")));
outfile.println(moduleList.length);
for (int i = 0; i < moduleList.length; i++) {
outfile.println(moduleList[i].getCode());
outfile.println(moduleList[i].getStudents().length);
for (int j = 0; j < moduleList[i].getStudents().length; j++) {
outfile.println(moduleList[i].getStudents()[j]);
}
}
outfile.close();
} catch (IOException e) {}
}
public void saveSerialized() {
try {
FileOutputStream fileOut = new FileOutputStream("Model.ser");
ObjectOutputStream out = new ObjectOutputStream(fileOut);
out.writeObject(this);
out.close();
fileOut.close();
FileOutputStream fileOut2 = new FileOutputStream("Module.ser");
ObjectOutputStream out2 = new ObjectOutputStream(fileOut2);
out2.writeObject(studentList);
out2.close();
fileOut2.close();
FileOutputStream fileOut3 = new FileOutputStream("Student.ser");
ObjectOutputStream out3 = new ObjectOutputStream(fileOut3);
out3.writeObject(moduleList);
out3.close();
fileOut3.close();
} catch (IOException e) {}
}
public void loadSerialized() {
Model m = null;
try {
FileInputStream fileIn = new FileInputStream("Model.ser");
ObjectInputStream in = new ObjectInputStream(fileIn);
m = (Model) in.readObject();
in.close();
fileIn.close();
} catch (Exception e) {}
setStudentList(m.getStudentList());
setModuleList(m.getModuleList());
}
private Module[] getModuleList() {
return moduleList;
}
private Student[] getStudentList() {
return studentList;
}
private void setModuleList(Module[] m) {
moduleList = m.clone();
}
private void setStudentList(Student[] s) {
studentList = s.clone();
}
private void AddModule(String code, String[] students) {
int length = moduleList.length;
Module NewArray[] = new Module[length + 1];
for (int i = 0; i < length + 1; i++) {
if (i < length) {
NewArray[i] = new Module(moduleList[i]);
}
}
NewArray[length] = new Module(code, students);
moduleList = NewArray.clone();
}
private void AddStudent(String u, String sn, String fn, String c) {
int length = studentList.length;
Student NewArray[] = new Student[length + 1];
for(int i = 0; i < length + 1; i++) {
if (i < length) {
NewArray[i] = new Student(studentList[i]);
}
}
NewArray[length] = new Student(u, sn, fn, c);
studentList = NewArray.clone();
}
public void printReport() {
for (int i = 0; i < moduleList.length; i++) {
System.out.println(moduleList[i].toString(this));
}
}
public Student findAStudent(String uid) {
for (int i = 0; i < studentList.length; i++) {
if (studentList[i].getUID().compareTo(uid) == 0) {
return studentList[i];
}
}
return null;
}
public Module findAModule(String code) {
for (int i = 0; i < moduleList.length; i++) {
if (moduleList[i].getCode().compareTo(code) == 0) {
return moduleList[i];
}
}
return null;
}
}
Look at your code sample, in particular the switch statement:
switch (input) {
...
case "8" :
break;
...
}
I'd assume the method loadSerialized should be called there but it's missing and is not called anywhere else in the code.
Once you actually call the method that does the loading, the code will work, assuming you have declared a serialVersionUID for both Student and Module.
Edit: why using serialization to persist objects is a bad idea
In simple terms, using serialization to persist objects is brittle.
An object's serialized form is tied to its class. Classes tend to change over time, meaning the serialized instance of the old cannot be loaded into the new.
While you can work round this by setting a serialVersionUID doing so introduces a reverse of the problem where, in the case new fields are introduced, the new cannot be read into objects of the old class, which can be a problem if you do rolling updates to the deployed system.
There's a host of other reasons - it's not easily readable (meaning you can't update it like you would a database or XML/JSON doc), it's inefficient, etc.

Categories