【问题标题】:Java Concatenating Ever Growing String java.lang.RuntimeExceptionJava 连接不断增长的字符串 java.lang.RuntimeException
【发布时间】:2023-02-22 16:14:28
【问题描述】:

我的课程讲师使用自动检查作业的自动化 JUnit 4 单元测试软件出现错误。我们将代码草稿上传到云程序测试仪,该测试仪会自动检查作业并对其评分。

注意:每个讲师都允许我在 StackOverflow 上提问。

这是第一学期的第 3 周。我以前从未用 Java 编写过代码。我们只讨论了函数(包括 if/else、while、循环、开关),所以我不能使用未来模块的功能。

我们没有得到关于这个特定作业的课堂教程。该装置处于流量控制状态。

我的代码(如下)在学校提供的 VSCODE IDE 云中运行良好。

import java.util.Scanner;

public class SplitString {

  public static void main(String[] args) {
    Scanner scanner = new Scanner(System.in);
    String output = "";

    do {
  
      String inputString = scanner.nextLine();

      if (!inputString.equals(" ")) {
        output += inputString;
      } else {
        break;
      }
    } while (true);
    System.out.println(output);
    scanner.close();
  }
}

我得到这个回来

java.lang.RuntimeException 
java.lang.RuntimeException: Your application is expecting user input when no user input suppose to be given. Please take a look at the 'Caused by...' section of this stack trace for details of where the problem occurred in your code.
I get this feedback (which I don't understand)
java.lang.RuntimeException: Your application is expecting user input when no user input suppose to be given. Please take a look at the 'Caused by...' section of this stack trace for details of where the problem occurred in your code.
at tests.HomeworkTests.lambda$test_splitString$5(HomeworkTests.java:248)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:539)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1136)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:635)
at java.base/java.lang.Thread.run(Thread.java:833)
Caused by: java.util.NoSuchElementException: No line found
at java.base/java.util.Scanner.nextLine(Scanner.java:1651)
at defaultPackage.SplitString.main(SplitString.java:13)
at tests.HomeworkTests.lambda$test_splitString$5(HomeworkTests.java:245)

该程序测试输入诸如 hello hello hello 之类的字符串,应该在空行处停止。根据作业“当此应用程序收到空白输入时,此应用程序应停止接收输入并将不断增长的字符串打印到控制台。该程序应打印的最后一个字符串是不断增长的字符串的结果。”

起初我尝试了另一种方法,它只是在 ENTER 处停止但后来我得到了一个不同的错误(下面的其他代码。)这表明测试以“”空格结束而不是 ENTER。尽管讲师在讨论中说它按回车键。所以我基本上迷路了。

这是旧代码

import java.util.Scanner;

public class SplitString {

  public static void main(String[] args) {
    Scanner sx = new Scanner(System.in);
    String stringInput;
    String output = "";

    do {
      stringInput = sx.nextLine();
     
      output += stringInput;
      
    } while (!stringInput.isEmpty());

    System.out.println(output);
    sx.close();
  }
}

给出这个错误

java.lang.StringIndexOutOfBoundsException: begin 0, end 12, length 3
at java.base/java.lang.String.checkBoundsBeginEnd(String.java:3319)
at java.base/java.lang.String.substring(String.java:1874)
at homework.SplitString.main(SplitString.java:65)
at tests.HomeworkTests.lambda$test_splitString$5(HomeworkTests.java:288)
at java.base/java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:515)
at java.base/java.util.concurrent.FutureTask.run(FutureTask.java:264)
at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1128)
at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:628)
at java.base/java.lang.Thread.run(Thread.java:829)

任何帮助将不胜感激:

  • 解释我哪里出错了或者我需要修复什么或者我可以尝试什么
  • 解释我得到的错误意味着什么(或者我可以在哪里了解更多关于理解错误以及如何从中读取要修复的内容

感谢您的时间、支持和耐心 <3。

我希望程序连接用户提供的字符串,直到输入空白,然后将结果字符串打印到控制台。

【问题讨论】:

  • 第一的部分 (NoSuchElementException): " " 不是空行(或空字符串)——它包含一个空白字符,可能这从未被用户输入 ||第二部分 (StringIndexOutOfBoundsException):发布的堆栈跟踪似乎来自调用 substring()(SplitString.java 的第 65 行),但是发布的代码中没有调用该方法 - 它不是发生此异常的代码扔

标签: java runtime-error


【解决方案1】:

似乎空行意味着空行。 因为从需求中不清楚终止符应该是什么,所以使用 trim() 去除所有空格,如果 trim 后该行为空,则停止。 这是更正后的代码:

import java.util.Scanner;

public class SplitString{

    public static void main( String[] args ){
        String output = "";
        try (  Scanner scanner = new Scanner( System.in ); ){
            do{
                String inputString = scanner.nextLine();
                if( inputString.trim().isEmpty() ){
                    break;
                }
                output += inputString;
            } while( true );
        }
        System.out.println( output );
    }
}

【讨论】:

    猜你喜欢
    • 2012-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-15
    • 2011-04-02
    • 2013-09-20
    相关资源
    最近更新 更多