获取 StringIndexOutOfBound 异常
getting StringIndexOutOfBound Exception
我正在编写一个程序来使用以下条件接受用户名和密码 - 用户名必须至少为 8 个字符。密码必须至少包含 10 个字符,1 个小写字母,1 个大写字母,密码中应包含 1 个数字。
我根据所有条件编写了一个方法 setPassword() 。当我尝试执行时,出现 StringIndexOutOfBound 异常。我无法理解为什么会出现该错误:
public void setPassword(String password)
{
char ch;
if (password.length() <= 10) {
for (int i = 0; i <= password.length() - 1; i++) {
ch = password.charAt(i);
if (Character.isDigit(ch)) {
for (int j = 0; j <= password.length() - 1; j++) {
char ch1 = password.charAt(j);
if (Character.isUpperCase(ch1)) {
for(int k = 0; k <= password.length(); k++) {
char ch2 = password.charAt(k);
if (Character.isLowerCase(ch2)) {
this.password = password;
}
}
}
}
}
}
}
}
忽略此实现的低效之处,以下行:
for(int k = 0; k <= password.length(); k++) {
应该是:
for(int k = 0; k < password.length(); k++) {
// ^ removed the = from here
或:
for(int k = 0; k <= password.length() - 1; k++) {
// ^ subtract 1 here
对于以下字符串:
String s = "this-is-a-test";
s.length()
即将 return 14
。该字符串中字符的有效索引为 0
到 13
。使用 for
循环遍历数组的惯用方法是:
for (int i = 0; i < length_of_array; i++)
您选择使用 i <= length_of_array - 1
,这实际上是同一件事(尽管更冗长),除了最后一个 for
循环,您忽略了从中减去 1
长度。
这里是一个简单的方法,用于根据您提供的条件检查密码有效性:
public static boolean isPasswordValid(String password)
{
if (password.length() < 10) {
return false;
}
int lc = 0, uc = 0, digit = 0;
for (int i = 0; i < password.length(); i++) {
char c = password.charAt(i);
if (Character.isLowerCase(c)) {
lc++;
} else if (Character.isUpperCase(c)) {
uc++;
} else if (Character.isDigit(c)) {
digit++;
}
}
return lc > 0 && uc > 0 && digit > 0;
}
如果所有条件都通过,这将 return true
,否则 false
。
我正在编写一个程序来使用以下条件接受用户名和密码 - 用户名必须至少为 8 个字符。密码必须至少包含 10 个字符,1 个小写字母,1 个大写字母,密码中应包含 1 个数字。 我根据所有条件编写了一个方法 setPassword() 。当我尝试执行时,出现 StringIndexOutOfBound 异常。我无法理解为什么会出现该错误:
public void setPassword(String password)
{
char ch;
if (password.length() <= 10) {
for (int i = 0; i <= password.length() - 1; i++) {
ch = password.charAt(i);
if (Character.isDigit(ch)) {
for (int j = 0; j <= password.length() - 1; j++) {
char ch1 = password.charAt(j);
if (Character.isUpperCase(ch1)) {
for(int k = 0; k <= password.length(); k++) {
char ch2 = password.charAt(k);
if (Character.isLowerCase(ch2)) {
this.password = password;
}
}
}
}
}
}
}
}
忽略此实现的低效之处,以下行:
for(int k = 0; k <= password.length(); k++) {
应该是:
for(int k = 0; k < password.length(); k++) {
// ^ removed the = from here
或:
for(int k = 0; k <= password.length() - 1; k++) {
// ^ subtract 1 here
对于以下字符串:
String s = "this-is-a-test";
s.length()
即将 return 14
。该字符串中字符的有效索引为 0
到 13
。使用 for
循环遍历数组的惯用方法是:
for (int i = 0; i < length_of_array; i++)
您选择使用 i <= length_of_array - 1
,这实际上是同一件事(尽管更冗长),除了最后一个 for
循环,您忽略了从中减去 1
长度。
这里是一个简单的方法,用于根据您提供的条件检查密码有效性:
public static boolean isPasswordValid(String password)
{
if (password.length() < 10) {
return false;
}
int lc = 0, uc = 0, digit = 0;
for (int i = 0; i < password.length(); i++) {
char c = password.charAt(i);
if (Character.isLowerCase(c)) {
lc++;
} else if (Character.isUpperCase(c)) {
uc++;
} else if (Character.isDigit(c)) {
digit++;
}
}
return lc > 0 && uc > 0 && digit > 0;
}
如果所有条件都通过,这将 return true
,否则 false
。