Search code examples
javafilejava.util.scannerindexoutofboundsexception

Scanner hit empty line throw ArrayIndexOutOfBoundsException


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)); 
        
        }   
    } 
} 

Solution

  • 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