java 中的子字符串索引越界

Substring index out of bounds in java

我正在编写一个简单的代码,它仅显示 "console" 类型的进程的 name 使用 任务列表 java.

由于此代码中的字符串索引越界错误,我无法这样做。 我使用索引 36 到 43,因为在这些代码中,我在代码输出期间获得了进程类型,我们使用任务列表打印所有进程。进程名称的 0 到 30 也是如此。

请帮我解决这个问题。

import java.io.*;
 public class process_name
  {
    public static void main(String []args)
     {
        try {
             int i;
              String line,pn,pt;
              pn="";
              Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\system32\"+"tasklist.exe");

              BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while ((line = input.readLine()) != null)
            {
              pt=line.substring(36,43);
              if(pt.equals("Console")) 
              {
                 pn=line.substring(0,30);
                 System.out.println(pn);
              }
              System.out.println();
             }
        input.close();
       }
     catch (Exception err) 
     {
       err.printStackTrace();
     }
}

}

尝试检查该行的长度。它可能不够长,因为它不够长而导致越界错误。

 System.out.println(line.length());

或者您可以在通话前检查线路的长度

 if (line.length() >= 43){
 ....

据我所见,tasklist 在开头打印了一个空行。一个简单的检查是 while 循环开始时的 if (!line.contains("Console")) continue;。这样,您将跳过不包含字符串 Console.

的每一行

为了避免索引越界,我应该先检查当前行是否包含单词 "Console" 并检查长度:

import java.io.*;
 public class Main
  {
    public static void main(String []args)
     {
        try {
             int i;
              String line,pn,pt;
              pn="";
              Process p = Runtime.getRuntime().exec(System.getenv("windir") +"\system32\"+"tasklist.exe");


              BufferedReader input = new BufferedReader(new InputStreamReader(p.getInputStream()));

            while ((line = input.readLine()) != null)
            {
               if(line.contains("Console"))
               {
                   if(line.length()>30){
                   pn=line.substring(0,30); System.out.println(pn);}
            }
              System.out.println();
             }
        input.close();
       }
     catch (Exception err) 
     {
       err.printStackTrace();
     }
}}