扫描仪命中空行抛出 ArrayIndexOutOfBoundsException

Scanner hit empty line throw ArrayIndexOutOfBoundsException

扫描器命中空行抛出 ArrayIndexOutOfBoundsException 我的代码在遇到空行时会抛出 ArrayIndexOutOfBoundsException,我该如何解决这个问题? 例如,示例文本文件的第 3 行是空行,将引发异常。

扫描器命中空行抛出 ArrayIndexOutOfBoundsException

示例文本文件

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

简单。只需在字符串中添加一个“isBlank”检查即可。

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


    }
  }

它给出这样的输出:

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

虽然@Abhinaba 的解决方案确实修复了您遇到的当前错误,但是当输入文件包含仅包含非字母数字字符的行时它会失败。例如:

This is an 
Example

for this
Class

ABC
DEF

G

H



IIIIII


XYZ    

#$%^

您可以将解决方案修改为:

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

    }
}