我正在尝试创建一个代码,如果输入以“ Today”开头,以“ MLIA”结尾(大小写无关),则该代码将显示“ VALID ENTRY”。 如果不是,则显示“格式不正确,请尝试其他提交”。 由于某种原因,该程序不断给我一个越界错误,我不知道为什么。

当我将子字符串代码更改为sub.substring(0,1)进行测试时,仍然给我一个错误,所以这不是问题。 我还尝试为每个字母添加char值,以确定单词是什么,但这也不起作用。

public class submit{
   public static void main(String[] args) throws IOException{

   Scanner scanner = new Scanner(new File("submit.txt"));

   int trials = scanner.nextInt();
   int total = 0;

   for(int x = 0; x <= trials; x++){
       String sub = scanner.nextLine();
       sub = sub.toLowerCase();
       if(sub.substring(0,5) == "today") //I only have it set up to find "today"
         System.out.println("VALID ENTRY");
       else
         System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

      }  
   }//end of main
}//end of class

输入:

5  
ToDAY, I went to school. mlia  
Hehehe today mlia this shouldn't work  
Today, I went to a programming contest. Hehe. MLIA  
TODAYMLIA  
T0day is a brand new day! MLIA  

预期输出应为:

VALID ENTRY  
INCORRECT FORMATTING, TRY ANOTHER SUBMISSION  
VALID ENTRY  
VALID ENTRY  
INCORRECT FORMATTING, TRY ANOTHER SUBMISSION  

实际输出:

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 5  
    at java.lang.String.substring(String.java:1963)   
    at submit.main(submit.java:15)

#1楼 票数:0 已采纳

代码有两个问题。 首先,您应该使用equals而不是==来比较String 否则,即使对于相同的String它也可能返回false。

其次, nextLine将一直从Scanner读取,直到下一个换行符之后。 但是nextInt只会读到该换行符之前,因此您对nextLine的第一次调用只会使Scanner前进一个字符,并返回一个空String 您需要在nextInt之后调用额外的nextLine ,以前进到整数之后的下一行。 有关更多信息,请参见此问题

因此,您应该对代码进行以下更改:

Scanner scanner = new Scanner(new File("submit.txt"));

int trials = scanner.nextInt();
scanner.nextLine(); //Add this line, to consume the newline character after "5"
// alternatively, you could replace both of the above lines with this:
// int trials = Integer.parseInt(scanner.nextLine());
int total = 0;

for(int x = 0; x <= trials; x++){
   String sub = scanner.nextLine();
   sub = sub.toLowerCase();
   if(sub.substring(0,5).equals("today")) //compare strings using equals, not ==
     System.out.println("VALID ENTRY");
   else
     System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

}

#2楼 票数:0

您可以改用以下代码。

import java.io.File;
import java.io.IOException;
import java.util.Scanner;

public class Submit {
    public static void main(String[] args) throws IOException {

        Scanner scanner = new Scanner(new File("submit.txt"));

        int trials = scanner.nextInt();
        scanner.nextLine();
        int total = 0;

        for (int x = 0; x < trials; x++) {

            String sub = scanner.nextLine();
            sub = sub.toLowerCase();
            System.out.print(sub + " -> ");
            if (sub.startsWith("today")) // I only have it set up to find "today"
                System.out.println("VALID ENTRY");
            else
                System.out.println("INCORRECT FORMATTING, TRY ANOTHER SUBMISSION");

        }
        scanner.close();
    }// end of main
}// end of class

您可以使用startsWith和nextLine在nextInt之后需要调用nextLine,因为nextInt不会读取换行符,并且在读取int 5后将光标保留在同一行。 因此,您会遇到该错误。

当您放置额外的nextLine()它实际上将移至下一行。

之后,您只需要读取5行,并且不需要<=否则它将再次在最后抛出错误。

所以make是<

如果只需要检查开始并且也要检查结束,则startsWith()很好,那么也有一个方法endsWith()

如果要使用equals ,字符串还需要equals才能与字符串文字匹配。

  ask by jannCann translate from so

未解决问题?本站智能推荐:

1回复

线程“ main”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:7

我正在尝试打印姓氏字符,但是我的代码正在生成异常。 码: 例外: 线程“主”中的异常java.lang.StringIndexOutOfBoundsException:字符串索引超出范围:7 我找不到错误,也不了解异常信息。
9回复

如何在Java中从一个字符串复制到另一个字符串?

我有两个字符串 str1 和 str2。 我正在尝试使用charAt将一些字母从一个字符串复制到另一个字符串。 我知道我可以使用字符串复制,但我想要一些字符而不是全部。 如何在Java中将子字符串从字符串复制到另一个字符串?
2回复

有人可以解释这种反转字符串的递归Java方法吗?

所以我是一个试图理解递归的大三学生。 我了解一般概念,但不了解它是如何正确实施的。 我发现这个非常简单的代码,似乎无法理解最后一行(递归)是如何工作的。 任何帮助和解释都会很棒,谢谢! (总决赛也快到了,我是不是很紧张)
6回复

如果我想在每个空格之前在字符串中附加“ \\”。 我怎么做?

假设输入String是Abc def ghi ..我希望结果像这样的Abc \\ def \\ ghi
3回复

如何查看字符串的第一个字符是否是某个字符,如果是,请执行一个操作(工作不正常)

编辑:所以我更改了代码以使用.equals而不是==,并且当我输入只有一个单词的字符串时,我的代码成功运行,所以“是”。 如果我输入了多个单词的字符串(“是,是”),仍然会出现错误。 键入具有多个单词的字符串会产生错误。 当我使用scnr时。 next(),它将始终编译else语句,即
3回复

涉及substring()和charAt()方法的Java程序

我的程序应该打印出名称的首字母并打印姓氏。 例如。 如果输入的名称是Mohan Das Karamchand Gandhi,则输出必须是MDK Gandhi。 虽然我得到“字符串索引超出范围”异常。
4回复

接收单词并随机化字母并创建字谜的Java程序

我需要创建一个程序,该程序将接收不带空格,标点和所有小写字母的单词,并随机重新排列字母。 它需要有子字符串或charAt,因为我们还没有学会它们,所以我不能使用数组。 每次都会有所不同,真的是n! 我想次。 这就是我到目前为止 这会重新排列单词,但不会每次都随机进行。 我以为我
5回复

子串问题

我正在尝试分解字符串192.168.1.2:6060;rport;branch=z9hG4bKNskFdtGO4" 。 我想在第一个分号之前提取port:ip ,并在等号之后提取分支号。 我尝试的代码是 我添加了printlns以显示是否至少在字符串中找到了它们的字符。