Reputation: 103
Scanner hit empty line throw ArrayIndexOutOfBoundsException My code will throw an ArrayIndexOutOfBoundsException when hits with an empty line, how can I fix this? For example, the sample text file's line 3 is an empty line, that will throw an exception.
Scanner hit empty line throw ArrayIndexOutOfBoundsException
Sample text file
This is an
Example
for this
Class
ABC
DEF
G
H
IIIIII
XYZ
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;
class Test
{
// A utility function to get max of two integers
static int max (int x, int y) { return (x > y)? x : y; }
// Returns the length of the longest
// palindromic subsequence in seq
static int lps(String seq)
{
int n = seq.length();
int i, j, cl;
// Create a table to store results of subproblems
int L[][] = new int[n][n];
// Strings of length 1 are palindrome of lentgh 1
for (i = 0; i < n; i++)
L[i][i] = 1;
// Build the table. Note that the lower
// diagonal values of table are
// useless and not filled in the process.
// The values are filled in a manner similar
// to Matrix Chain Multiplication DP solution (See
// https://www.geeksforgeeks.org/matrix-chain-multiplication-dp-8/).
// cl is length of substring
for (cl=2; cl<=n; cl++)
{
for (i=0; i<n-cl+1; i++)
{
j = i+cl-1;
if (seq.charAt(i) == seq.charAt(j) && cl == 2)
L[i][j] = 2;
if (seq.charAt(i) == seq.charAt(j))
L[i][j] = L[i+1][j-1] + 2;
else
L[i][j] = max(L[i][j-1], L[i+1][j]);
}
}
return L[0][n-1];
}
/* Driver program to test above functions */
public static void main(String args[]) throws FileNotFoundException
{
Scanner file = new Scanner(new File("Sample.txt"));
while (file.hasNextLine()) {
String input = file.nextLine();
String seq = input.toUpperCase().replaceAll("\\P{Alnum}", "");
System.out.println("The length of the lps is "+ lps(seq));
}
}
}
Upvotes: 0
Views: 150
Reputation: 1777
While @Abhinaba's solution does fix the current error you experience, but it fails when the input file contains lines with only non-alphanumeric characters. For ex:
This is an
Example
for this
Class
ABC
DEF
G
H
IIIIII
XYZ
#$%^
You can modify the solution as :
public static void main(String args[]) throws FileNotFoundException {
Scanner file = new Scanner(new File("Sample.txt"));
while (file.hasNextLine()) {
String input = file.nextLine();
String seq = input.toUpperCase().replaceAll("\\P{Alnum}", "");
if (!seq.isBlank()) {
System.out.println("The length of the lps is "+ lps(seq));
}
}
}
Upvotes: 0
Reputation: 3671
Simple. Just add a "isBlank" check to the string.
public static void main(String args[]) throws FileNotFoundException
{
Scanner file = new Scanner(new File("src/main/resources/Sample.txt"));
while (file.hasNextLine()) {
String input = file.nextLine();
if(!input.isBlank()){
String seq = input.toUpperCase().replaceAll("\\P{Alnum}", "");
System.out.println("The length of the lps is "+ lps(seq));
}
}
}
and it gives output like this:
The length of the lps is 3
The length of the lps is 3
The length of the lps is 1
The length of the lps is 2
The length of the lps is 1
The length of the lps is 1
The length of the lps is 1
The length of the lps is 1
The length of the lps is 6
The length of the lps is 1
Upvotes: 1