我正在运行这个程序,它从命令行输入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!");
}
}
答案 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()吗?