java - StringIndexOutOfBounds 从字符串设置 int 值时出现异常
问题描述
通过运行在远程服务器上运行命令的简单代码,如下所示:
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)
请注意,我尝试了此处和官方文档中提到的解决方案,但没有成功。
PS:变量的初始值为result
:
int result = -100;
解决方案
您正在操纵您的输入,但没有确保它符合您的期望。始终强烈建议在处理任何输入之前对其进行验证。
一个很简单的方法是使用正则表达式。
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:
都;
没有被发现。意味着你正在做:
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 是负数,它throw new StringIndexOutOfBoundsException(-5)
推荐阅读
- scala - 将 Scala 流转换为流的操作符或方法(给定流的后缀)
- ffmpeg - 用 FFMPEG 转换 *.OMG
- python - Python 中的二级内存索引表示
- javascript - Javascript:使用未定义的类扩展类
- excel - 如何查看我上传Oracle DB的excel文件的Sql查询
- java - 创建了一个返回真值的方法是对象是 5 岁以上
- python - 循环浏览网站上的不同链接并抓取某些信息
- sql - SQL 嵌套 WERE
- mysql - 已恢复 latin1_swedish_ci 排序规则的 MySQL DB 显示列的字符串值不正确
- javascript - 在 javascript 中使用烧瓶中的 JSON 和 jinja