【问题标题】:How can i read inside loop in java without runtime error?如何在没有运行时错误的情况下读取 java 中的内部循环?
【发布时间】:2021-06-29 17:34:13
【问题描述】:

我是 java 新手,并尝试用它解决一些问题(练习),但我遇到运行时错误,不知道为什么或我应该搜索什么才能知道为什么会这样。

这是我的代码。

当我将测试粘贴到控制台时发生运行时错误,但是当我编写它时运行时不会发生

如果可以帮助您理解我的错误,这就是问题的链接

https://codeforces.com/contest/1374/problem/C

    import java.util.*;
 
 
public class Main {
 
    public static void main(String[] args){
        Scanner reader = new Scanner(System.in);
        int t = reader.nextInt();
        ArrayList<Integer> anss = new ArrayList<>();
        for(int tst = 0; tst < t; tst++){
            int n = new Scanner(System.in).nextInt();
            String s = new Scanner(System.in).nextLine();
            int ans = 0;
            int open = 0;
            for(int i = 0; i < n; i++){
                if(s.charAt(i) == ')'){
                    if(open == 0) ans++;
                    else open--;
                } else {
                    open++;
                }
            }
            anss.add(ans);
        }
        for(int i : anss) System.out.println(i);
    }
}

【问题讨论】:

  • 异常发生在哪里?你有它的堆栈跟踪吗?
  • 每次你想从控制台读取数据时,不需要构造一个新的 Scanner 实例。只需在开始时创建一次,然后每次要获取输入时使用相同的实例。

标签: java string runtime-error indexoutofboundsexception


【解决方案1】:

要阅读 Codeforces 问题所提供的文本,您需要做两件事:

首先,当Scanner 开始解析InputStream 时(例如调用nextInt 时),它将消耗相当一部分流。在这种情况下,它会消耗整个流,因此在读取流时创建另一个在同一 InputStream 上运行的 Scanner 将失败。

到第二个,尽管nextLine 的文档似乎表明将返回整行:

将此扫描器前进到当前行并返回被跳过的输入。此方法返回当前行的其余部分,不包括末尾的任何行分隔符。位置设置为下一行的开头。

它实际上似乎忽略了第一个标记,即该行的第一个非空白部分。在这种情况下,每一行都没有空格,因此next 将返回您需要的字符串。在一般情况下,看起来整条线都围绕着做这样的事情:

String s = reader.next() + reader.nextLine();

【讨论】:

  • 我知道了,非常感谢。但是为什么每一行在测试中都没有空格?我的意思是测试中的那些行分隔符是什么,或者当我将测试复制并粘贴到控制台中时 java 理解它们是什么?
  • @ahmadalghadban,从我在本地的测试中,您可以粘贴输入的内容(特别是来自 Codeforces 的示例),它按预期运行。根据您的操作系统,您也可以将内容通过管道传递给执行,其操作方式相同,通过标准输入将文本提交给可执行文件。在 macOS/Linux 下是 cat test.txt | java Main
  • ... 在 Windows 下是 type test.txt | java Main
【解决方案2】:

你不需要向用户询问行长,因为你可以计算出来:

public static void main(String[] args) throws Exception {
    Scanner reader = new Scanner(System.in);
    int t = reader.nextInt();
    ArrayList<Integer> anss = new ArrayList<>();
    for(int tst = 0; tst < t; tst++){
        String s = new Scanner(System.in).nextLine();
        int ans = 0;
        int open = 0;
        for(int i = 0; i < s.length(); i++){
            if(s.charAt(i) == ')'){
                if(open == 0) ans++;
                else open--;
            } else {
                open++;
            }
        }
        anss.add(ans);
    }
    for(int i : anss) System.out.println(i);
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-07-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-11-16
    • 2021-03-31
    • 2013-03-15
    • 1970-01-01
    相关资源
    最近更新 更多