Java 从字符串设置int值时,StringIndexOutOfBounds异常

Java 从字符串设置int值时,StringIndexOutOfBounds异常,java,Java,通过运行在远程服务器上运行命令的简单代码,如下所示: if (s.contains("CONNECTED") || s.endsWith("Enter command: ") || s.endsWith(":")) { //login command dataOutput.writeBytes(LoginCommand + "\r\n"); Arrays.fill(line, '\n'); lineSize = dataInput.read(line);

通过运行在远程服务器上运行命令的简单代码,如下所示:

if (s.contains("CONNECTED") || s.endsWith("Enter command: ") || s.endsWith(":")) {
    //login command
    dataOutput.writeBytes(LoginCommand + "\r\n");
    Arrays.fill(line, '\n');

    lineSize = dataInput.read(line);
    s = String.copyValueOf(line, 0, lineSize);
    result = Integer.parseInt(s.substring(s.indexOf("RESP:") + 5, s.indexOf(";")));

    if (result == 0) {
        result = -101;
        //execution command
        String TelnetCommand = executedCommand.replace("%par1%", par1).replace("%par2%", par2).replace("%par3%", par3);
        dataOutput.writeBytes(TelnetCommand + "\r\n");
        int iCounter = 0;

    }

    connectionTrials = Integer.parseInt(properties.getProperty("NumberOfRetries"));
}
我得到以下例外情况:

java.lang.StringIndexOutOfBoundsException: String index out of range: -5
    at java.lang.String.substring(String.java:1911)
    at com.test.tool.Creation.doGet(Creation.java:85)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:687)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:808)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:587)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:517)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:97)
    at org.eclipse.jetty.server.Server.handle(Server.java:499)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:310)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:257)
    at org.eclipse.jetty.io.AbstractConnection$2.run(AbstractConnection.java:540)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:635)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$3.run(QueuedThreadPool.java:555)
    at java.lang.Thread.run(Thread.java:722)
注意到我尝试了报告中提到和提到的解决方案,但没有成功

备注:变量
结果
的初始值为:

int result = -100;

您正在操纵输入,但没有确保它符合您的期望。强烈建议在处理任何输入之前对其进行验证

一个非常简单的方法是使用

在您的特定情况下,您必须
抛出新的StringIndexOutOfBoundsException(-5)
,因为
响应:
尚未找到。意思是你正在做:

s.substring(s.indexOf("RESP:") + 5, s.indexOf(";"));
s.substring(-1 + 5, -1);
s.substring(/*beginIndex*/ 4, /*endIndex*/ -1);
然后子字符串计算长度为:

sublength = -1 - 4
sublength = -5

由于sublength为负值,因此它会抛出新的StringIndexOutOfBoundsException(-5)

在尝试获取的第X个元素之前检查s的值it@Stultuske该值为“RESP:0没有双重报价marks@Stultuske即使字符串包含适当数量的字符,我也非常确定访问索引
-5
将始终引发异常;)您的代码是否实际使用了
*5
?我不明白这个代码怎么可能导致索引为-5。
-5
是结果,如果两个
都不响应:
,也不
已找到。我建议使用Regexp而不是使用索引。
sublength = -1 - 4
sublength = -5