'Why does it throw an exception when reading int array from file in java
I am trying to read an integer array from a file. the file format is as follows:
893
410
243
264
357
33
793
...
...
I will later split that array into 4 and calculate it's sum using MPI, but i can't seem to be able to read the file. I get this exception:
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:281)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.NumberFormatException: For input string: "893"
at java.lang.NumberFormatException.forInputString(NumberFormatException.java:65)
at java.lang.Integer.parseInt(Integer.java:580)
at java.lang.Integer.parseInt(Integer.java:615)
at lab3.main(lab3.java:28)
... 6 more
Process finished with exit code 0
So from what i understand, the format of the read string is not correct to be cast as an integer, here is the Code:
//create an array of length 400
int[] array = new int[400];
//read the array from the file using the scanner class
try {
Scanner scanner = new Scanner(new File("random1000.txt"));
for (int i = 0; i < array.length; i++) {
array[i] = Integer.parseInt(scanner.nextLine());
}
}
catch (FileNotFoundException e) {
System.out.println("File not found");
}
I also tried scanner.nextInt() and Integer.valueof() instead of parseInt, here is the error i got for scanner.nextInt()
java.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at runtime.starter.MulticoreStarter$1.run(MulticoreStarter.java:281)
at java.lang.Thread.run(Thread.java:748)
Caused by: java.util.InputMismatchException
at java.util.Scanner.throwFor(Scanner.java:864)
at java.util.Scanner.next(Scanner.java:1485)
at java.util.Scanner.nextInt(Scanner.java:2117)
at java.util.Scanner.nextInt(Scanner.java:2076)
at lab3.main(lab3.java:30)
... 6 more
It is my first time using the Scanner class and i am fairly new to java, what am i doing wrong and how do i fix this?
Here is the FULL code, i haven't tested any of the mpi stuff out yet, but i tried reading the file without the mpi code and i had the same problem.
import mpi.*;
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
public class lab3 {
//Build a program that sums a big array (for example 1000 elements) over four processes
public static void main(String[] args) {
//initialize MPI
MPI.Init(args);
//get the rank of the process
int rank = MPI.COMM_WORLD.Rank();
//if the rank is 0
if (rank == 0) {
// read the array from the file
int[] array = new int[400];
//read the array from the file using file reader
try {
Scanner scanner = new Scanner(new File("random1000.txt"));
for (int i = 0; i < array.length; i++) {
array[i] = scanner.nextInt();
}
}
catch (FileNotFoundException e) {
System.out.println("File not found");
}
//divide the array into 4 parts and send it to the other processes
int[] array1 = new int[array.length / 4];
int[] array2 = new int[array.length / 4];
int[] array3 = new int[array.length / 4];
int[] array4 = new int[array.length / 4];
for (int i = 0; i < array.length / 4; i++) {
array1[i] = array[i];
array2[i] = array[i + array.length / 4];
array3[i] = array[i + array.length / 2];
array4[i] = array[i + array.length / 4 + array.length / 2];
}
//send each part to the other processes
MPI.COMM_WORLD.Send(array2, 0, array2.length, MPI.INT, 1, 0);
MPI.COMM_WORLD.Send(array3, 0, array3.length, MPI.INT, 2, 0);
MPI.COMM_WORLD.Send(array4, 0, array4.length, MPI.INT, 3, 0);
//calculate the sum of the array 1
int sum1 = 0;
for (int i = 0; i < array1.length; i++) {
sum1 += array1[i];
}
//receive the summation from the other processes
int sum2 = 0;
MPI.COMM_WORLD.Recv(sum2 ,0, 0, MPI.INT, 1, 0);
int sum3 = 0;
MPI.COMM_WORLD.Recv(sum3 ,0, 0, MPI.INT, 2, 0);
int sum4 = 0;
MPI.COMM_WORLD.Recv(sum4 ,0, 0, MPI.INT, 3, 0);
//calculate the final sum
int sum = sum1 + sum2 + sum3 + sum4;
//print the final sum
System.out.println("The Final sum is: " + sum);
//finalize MPI
MPI.Finalize();
}
else {
//receive the array from the process 0
int[] array = new int[1000 / 4];
MPI.COMM_WORLD.Recv(array, 0, array.length, MPI.INT, 0, 0);
//calculate the sum of the array
int sum = 0;
for (int i = 0; i < array.length; i++) {
sum += array[i];
}
//send the sum to the process 0
MPI.COMM_WORLD.Send(sum, 0, 0, MPI.INT, 0, 0);
//print local sum and rank
System.out.println("The sum of the array is: " + sum + " and the rank is: " + rank);
}
}
}
IntelliJ Idea , Windows 11.
EDIT:
i tried doing it this way:
List<Integer> ints = Files.lines(Paths.get("random1000.txt"))
.map(Integer::parseInt)
.collect(Collectors.toList());
array = ints.stream().mapToInt(i -> i).toArray();
throws java.lang.NumberFormatException: For input string: "893"
Solution 1:[1]
I created a new file and added some random numbers manually and it worked, to my understanding, the random number generator I used to create the text file might have added some extra bytes at the beginning which might be the cause of the problem.
Sources
This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.
Source: Stack Overflow
| Solution | Source |
|---|---|
| Solution 1 | Zaka |
