将字符串输入与所需长度进行比较

时间:2015-01-09 10:29:59

标签: java

我正在运行这个程序,它从命令行输入t(所需长度),没有测试
     例(N)。但它给出了运行时错误

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index
    out of range: -1
        at java.lang.AbstractStringBuilder.insert(AbstractStringBuilder.java:979)
      at java.lang.StringBuilder.insert(StringBuilder.java:300)
        at Test.main(Test.java:28)

我在访问错误的索引时感到困惑。

import java.io.BufferedReader;
import java.io.InputStreamReader;
class TestClass {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        String line = br.readLine();
        int N = Integer.parseInt(line);
        String[] profiles = null;
        for (int i = 0; i < N; i++) {
            profiles = br.readLine().trim().split(" ");
        }
        for (int i = 0; i < N; i++) {
            if (Integer.parseInt(profiles[0]) > t && Integer.parseInt(profiles[1]) == t ||
                    Integer.parseInt(profiles[0]) > t || Integer.parseInt(profiles[1]) > t
                    || Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) > t)
            {
                System.out.println("Crop");
            }
            if (Integer.parseInt(profiles[0]) < t && Integer.parseInt(profiles[1]) < t) {
                System.out.println("Upload next");
            }

            if (Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) == t) {
                System.out.println("Accepted");
            }
        }
        System.out.println("Hello World!");
    }
}

4 个答案:

答案 0 :(得分:0)

您的编码不安全,因为您在[0]上使用索引[1]profiles而未检查此数组是否包含任何元素。进一步循环覆盖循环中profiles的内容。如果没有要从br读取的文字,会发生什么?

您应该始终在访问前检查值(如防御性编程)。

这里可能需要一些Rubber Duck debugging

答案 1 :(得分:0)

这里代码中的恶魔:

 // Let t=3 and N=5
    String [] profiles=null; // Let the Input Here Be 12, 23, 34, 45, 56
    for (int i = 0; i < N; i++) {
        profiles=br.readLine().trim().split(" ");
    }
    System.out.println(Arrays.toString(profiles));  // [56] Only ? because you are initializing the same rer again and again 

所以当执行到这里时:

for (int i = 0; i < N; i++) {
    if (Integer.parseInt(profiles[0]) > t && 
        Integer.parseInt(profiles[1]) == t || ... // Throws Index out of bounds exception

编辑1:以下是完整的工作代码:

package com.stackoverflow;

import java.io.BufferedReader;
import java.io.InputStreamReader;

public class TestClass {
    public static void main(String args[]) throws Exception {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        int t = Integer.parseInt(br.readLine());
        System.out.println(t);
        String line = br.readLine();
        int N = Integer.parseInt(line);
        System.out.println(N);
        String[] profiles = new String[N];
        for (int i = 0; i < N; i++) {
            profiles[i] = br.readLine().trim();
        }
        for (int i = 0; i < N; i++) {
            System.out.println(Integer.parseInt(profiles[0]) > t && Integer.parseInt(profiles[1]) == t);
            System.out.println(Integer.parseInt(profiles[0]) > t || Integer.parseInt(profiles[1]) > t);
            System.out.println(Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) > t);
            if (Integer.parseInt(profiles[0]) > t && Integer.parseInt(profiles[1]) == t ||
                    Integer.parseInt(profiles[0]) > t || Integer.parseInt(profiles[1]) > t
                    || Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) > t)
            {
                System.out.println("Crop");
            }

            System.out.println(Integer.parseInt(profiles[0]) < t && Integer.parseInt(profiles[1]) < t);
            if (Integer.parseInt(profiles[0]) < t && Integer.parseInt(profiles[1]) < t) {
                System.out.println("Upload next");
            }

            System.out.println(Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) == t);
            if (Integer.parseInt(profiles[0]) == t && Integer.parseInt(profiles[1]) == t) {
                System.out.println("Accepted");
            }
        }
        System.out.println("Hello World!");
    }
}

编辑2:为for循环中的 if 条件添加测试用例:

测试用例1值:设t = 3,N = 5,五(即N)测试用例的值为12,23,34,45,56

将“裁剪”打印到控制台。

测试用例2值:设t = 30,N = 5,五(即N)测试用例的值为12,23,34,45,56

将“下一步上传”打印到控制台。

测试案例3值:设t = 10,N = 5,五(即N)测试用例的值为10,20,34,45,56

将“已接受”打印到控制台。

答案 2 :(得分:0)

我不明白你想要做的检查,但是如果你想检查每个字符串是否更长,更短或等于 t ,你应该使用这个代码:

public class Main
{
    private static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));


    public static void main(String args[]) throws IOException {
        int t = Integer.parseInt(br.readLine());
        int N = Integer.parseInt(br.readLine());

        /* MUST INITIALISE BEFORE FILLING IT! */
        String [] profiles = new String[N];
        for (int i = 0; i < N; i++) {
            profiles[i] = br.readLine().trim();
            if (profiles[i].length() < t)
                System.out.println("shorter than t");// do something
            else if (profiles[i].length() == t)
                System.out.println("equals to t");// do something
            else
                System.out.println("longer than t");// do something
        }
    }
}

答案 3 :(得分:0)

您正在使用缓冲读取器通过System.in读取某些行。在关闭此缓冲区之前,您尝试使用System.out。这可能是你遇到麻烦的原因吗?我认为要求系统同时写入和读取绝对不是一个好主意。你能尝试在第二个循环之前放一个br.close()吗?