我正在尝试在for循环中插入一个Stringbuilder,但它崩溃了。这是我的代码
StringBuilder sb = new StringBuilder("This is a text");
for(int i = 0;i < sb.length();i++){
if(sb.charAt(i) == 't'){
sb.insert(i, 't');
}
}
这样做的目的是使每个't'加倍。
答案 0 :(得分:7)
您收到了OutOfMemoryError
,因为您没有跳过加倍的t
字符。
This is a text
^
This is a ttext
^
This is a tttext
^
这一直持续到你内存不足为止。
您必须在插入加倍t
之后通过递增i
来跳过刚刚添加的t
。
if (sb.charAt(i) == 't')
{
sb.insert(i, 't');
i++;
}
答案 1 :(得分:1)
我建议使用StringBuilder和这样的字符串:
String currentText = "This is a text";
StringBuilder sb = new StringBuilder();
for(int i = 0; i < currentText.length(); i++){
sb.append(currentText.charAt(i));
if(currentText.charAt(i) == 't'){
sb.append('t');
}
}
使用该解决方案,您将不会遇到永无止境的循环问题。
答案 2 :(得分:0)
您遇到的问题如下:
t
添加t
。两种情况,t
中至少有1 String
或者没有t
。如果没有,那么一切都会起作用,代码什么都不做。但是,如果有t
它会发现t
添加另一个t
,则要检查的下一个字符现在是...... i
!无限循环。
您可以通过递增ì++
(continue
)或使用TABLE_NAME = 'Test'
sql = sqlite3.connect('DATABASE.db')
cur = sql.cursor()
cur.execute('CREATE TABLE IF NOT EXISTS ? (id TEXT)', [TABLE_NAME])
sql.commit()
来解决此问题。
答案 3 :(得分:0)
因为当你发现t
这条指令sb.insert(i, 't')
时,t
位置i
,而t
就位i+1
,所以当i
在for
循环结束时i++
与t
一起递增时,您会再次使用相同的字母i
进行处理。这将导致无限循环。
要解决此问题,您应该在i++
块中使用if
增加if(sb.charAt(i) == 't'){
sb.insert(i, 't');
i++;
}
,如下所示:
public class Main {
package com.omt.mouse;
import java.awt.Robot;
import java.awt.event.InputEvent;
public void mousePressed(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
mouseDown = true;
}
}
public void mouseReleased(MouseEvent e) {
if (e.getButton() == MouseEvent.BUTTON1) {
mouseDown = false;
}
}
public static void main(String[] args) {
Robot robot = new Robot();
num = 0;
while (true) {
if (mouseDown) {
if (num == 2000) {
robot.mousePress(InputEvent.BUTTON1_MASK);
} else {
num++;
}
} else if (num == 2000) {
num = 0;
robot.mouseRelease(InputEvent.BUTTON1_MASK);
}
}
}
}