首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从字符串设置int值时的StringIndexOutOfBounds异常

从字符串设置int值时的StringIndexOutOfBounds异常
EN

Stack Overflow用户
提问于 2018-05-16 11:54:33
回答 1查看 85关注 0票数 1

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

代码语言:javascript
复制
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"));
}

我得到了以下例外:

代码语言:javascript
复制
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)

注意到我尝试了这里正式文件中提到的解决方案,但没有成功。

P.S:变量result的初始值是:

代码语言:javascript
复制
int result = -100;
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-05-16 15:39:31

您正在操作您的输入,但没有确保它符合您的期望。始终强烈建议在处理输入之前验证任何输入。

一个非常简单的方法是使用正则表达式

代码语言:javascript
复制
static final Pattern IS_CONNECTED = Pattern.compile("\\bCONNECTED\\b|\\bEnter command: $|:$");
static final Pattern RESPONSE = Pattern.compile("\\bRESP:(?<code>\\d+);")

if (IS_CONNECTED.matcher(s).matches()) {
    // ...
    Matcher matching_response = RESPONSE.matcher(s);
    if (matching_response.matches()) {
       String code_str = matching_response.group("code");
       result = Integer.parseInt(code_str); // Poor check, can still fail
    }
}

在您的具体情况下,您有throw new StringIndexOutOfBoundsException(-5),因为还没有找到RESP:;。意思是你在做:

代码语言:javascript
复制
s.substring(s.indexOf("RESP:") + 5, s.indexOf(";"));
s.substring(-1 + 5, -1);
s.substring(/*beginIndex*/ 4, /*endIndex*/ -1);

然后,子字符串计算长度为:

代码语言:javascript
复制
sublength = -1 - 4
sublength = -5

由于子长度为负数,所以它是throw new StringIndexOutOfBoundsException(-5)

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50370265

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档