当前位置: 首页 > 知识库问答 >
问题:

什么是IndexOutOfBoundsException?我该怎么修好它?[副本]

庄实
2023-03-14

这是我的代码:

    private void bringData() {
    final TextView mTextView = (TextView) findViewById(R.id.textView);

    // Instantiate the RequestQueue.
    RequestQueue queue = Volley.newRequestQueue(this);
    String url ="http://192.168.4.1:8080/";

    // Request a string response from the provided URL.
    StringRequest stringRequest = new StringRequest(Request.Method.GET, url,
            new Response.Listener<String>() {
                @Override
                public void onResponse(String response) {
                    // Display the first 500 characters of the response string.
                    mTextView.setText("Response is: "+ response.substring(0,500));
                }
            }, new Response.ErrorListener() {
        @Override
        public void onErrorResponse(VolleyError error) {
            mTextView.setText("That didn't work!");
        }
    });
    // Add the request to the RequestQueue.
    queue.add(stringRequest);
}

这是android文档中给出的默认值。我只是改了网址。

这是我的错误消息:

java.lang.StringIndexOutOfBoundsException:长度=28;RegionStart=1;RegionLength=499在java.lang.String.SubString(String.java:1931)在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在com.example.my.app.MainActivity$2在

在调试过程中,我看到在mtextview.settext(“response is:”+response.substring(0,500));上,我的消息传递给了我,但是textview从未更新,应用程序崩溃。

具体地说,它在looper.java文件中崩溃:

finally {
if (traceTag != 0) {
   Trace.traceEnd(traceTag);
} 

traceTag为0。

我读到一些字符串界限是错误的,但我无法找到如何修复它。

共有1个答案

洪伟兆
2023-03-14
Error Message:
    java.lang.StringIndexOutOfBoundsException: length=28; regionStart=1;
    regionLength=499 at java.lang.String.substring(String.java:1931) at     
    com.example.my.app.MainActivity$2.onResponse(MainActivity.java:50) at     
    com.example.my.app.MainActivity$2.onResponse(MainActivity.java:46) at     
    com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:60) at     
    com.android.volley.toolbox.StringRequest.deliverResponse(StringRequest.java:30) at     
    com.android.volley.ExecutorDelivery$ResponseDeliveryRunnable.run(ExecutorDelivery.java:99) at android.os.Handler.handleCallback(Handler.java:751) at     
    android.os.Handler.dispatchMessage(Handler.java:95) at     
    android.os.Looper.loop(Looper.java:154) at     
    android.app.ActivityThread.main(ActivityThread.java:6077) at     
    java.lang.reflect.Method.invoke(Native Method) at     
    com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:865) at     
    com.android.internal.os.ZygoteInit.main(ZygoteInit.java:755) 

错误描述

There is an IndexOutOfBound exception occurred in your MainActivity class 
Inside second inner class's OnResponse function as shown MainActivity$2onResponse
on line 46 which basically occurred during substring operation in String.java line 1931 
which was invoked from StringRequest.deliverResponse at line 60,
which was invoked from StringRequest.deliverResponse at line 30,
which was invoked from ExecutorDelivery.java at line 99,
which intially started from ZygoteInit$MethodAndArgsCaller's run function 
and reached up-to main thread of ActivityThread.main=>looper=>handler

实际原因

您的代码试图创建一个子字符串

starting index = 0
ending index = 500

虽然您的实际响应字符串长度为=28,但字符串长度不足以创建500个字符的子字符串

解决方案:

>

  • 使用三元运算符验证长度?:

    mTextView.setText("Response is: "+ 
       ((response.length()>499) ? response.substring(0,500) : "length is too short"));
    

    注意:三元运算符(?:)是if else的简短表达式,但它不是语句,意味着它不能作为原子语句出现,因为它是invalid,因为没有赋值

    ((someString.length()>499) ? someString.substring(0,500):"Invalid length");
    

    if-else增强可见性

    String msg="Invalid Response";
    if(response.length()>499){
        msg=response.substring(0,500);
    }
    mTextView.setText("Response is: "+msg);
    
    //or     mTextView.setText("Response is: "+response);
    

    indexoutofboundsexceptionruntimeexception的子类,意思是它是未经检查的异常,被抛出以指示某种类型的索引(如数组、字符串或向量)超出范围。

    如文档所示

    List<String> ls=new ArrayList<>();
          ls.add("a");
          ls.add("b");
          ls.get(3); // will throw IndexOutOfBoundsException , list length is 2
    

    预防:

    String str = "";
    int index =3; 
    if(index < ls.size())    // check, list size must be greater than index
        str = ls.get(index);
    else
        // print invalid index or other stuff
    
    public IndexOutOfBoundsException() {
        super();
    }
    
    public IndexOutOfBoundsException(String s) {
        super(s);
    }
    

    >

  • ArrayIndexOutOfBoundsException:这表示访问数组时使用了非法索引。索引为负数或大于或等于数组的大小,例如

    int arr = {1,2,3}
    int error = arr[-1]; // no negative index allowed
    int error2 = arr[4]; // arr length is 3 as index range is 0-2
    

    预防:

    int num = "";
    int index=4;
    if(index < arr.length)     // check, array length must be greater than index
        num = arr[index];
    else
        // print invalid index or other stuff
    

    >

  • StringIndexOutOfBoundsException:这是由String方法引发的,以指示索引为负或大于字符串的大小。对于某些方法(如charAt方法),当索引等于字符串的大小时也会引发此异常。

    String str = "foobar";       // length = 6
    char error = str.charAt(7);  // index input should be less than or equal to length-1
    char error = str.charAt(-1); // cannot use negative indexes
    

    预防:

    String name = "FooBar";
    int index = 7;
    char holder = '';
    if(index < name.length())     // check, String length must be greater than index
        holder = name.charAt(index) ;
    else
        // print invalid index or other stuff
    

    注意:长度()字符串类的函数,长度数组的关联字段。

    • 数组字符子字符串函数中使用负索引
    • beginIndex小于0或endIndex大于创建子字符串的输入字符串长度或beginIndex大于endIndex
    • EndIndex-BeginIndex结果小于0
    • 输入字符串/数组为空时

    信息:JVM的工作是创建适当异常的对象,并使用throw关键字将其传递到发生异常的地方,或者您也可以使用throw关键字手动执行此操作。

    if (s == null) {
        throw new IndexOutOfBoundsException("null");
    }
    
    1. 分析StackTrace
    2. 验证输入字符串是否无效、长度或有效索引
    3. 使用调试或日志
    4. 使用常规异常捕获块

    如本文开头所示,stacktrace在初始消息中提供了关于发生在何处、为什么发生的必要信息,这样您就可以简单地跟踪代码并应用所需的解决方案。

    例如,原因StringIndexOutOfBoundsException,然后查找表示类文件的包名,然后转到该行并记住原因,只需应用解决方案

    如果您在文档中研究异常及其原因,这将是一个良好的开端。

    在不确定的情况下,当您不知道实际的输入,例如来自服务器的响应(或者可能是一个错误或什么都没有)或用户,那么最好覆盖所有的意外情况,尽管相信我,很少有用户总是喜欢突破测试的极限,所以使用input!=null&&input.lengte()>0或者对于索引,您可以使用三元运算符或if-else边界检查条件

    通过在项目中添加断点,您可以在调试模式下测试项目的运行环境,系统将停止在此等待您的下一个操作,同时您可以查看变量的值和其他细节。

    日志就像检查点,所以当您的控件越过该点时,它们会生成详细信息,基本上它们是由WITHR系统提供的信息消息,或者用户也可以使用日志或打印消息来放置日志消息

    try-catch块对于处理runtimeexceptions总是有用的,因此您可以使用多个catch块来处理可能的问题并提供适当的详细信息

    try {
         mTextView.setText("Response is: "+ response.substring(0,500));
    } catch (IndexOutOfBoundsException e) {
        e.printStackTrace();
        System.out,println("Invalid indexes or empty string");
    }
      catch (NullPointerException e) { // mTextView or response can be null 
        e.printStackTrace();
        System.out,println("Something went wrong ,missed initialization");
    }
    catch (Exception e) {  
        e.printStackTrace();
        System.out,println("Something unexpected happened , move on or can see stacktrace ");
    }
    

    进一步参考文献

    什么是NullPointerException?如何修复它?

  •  类似资料:
    • 我想在Firefox上使用SharedArrayBuffer。因此,我让我的web服务器根据文档在响应头中添加跨Origin-Opener-Policy和跨Origin-Embedder-Policy。 当您以localhost身份访问服务器时,它工作正常,但当您以其IP地址访问服务器时,它就不工作了。我该怎么修好它? 火狐的版本是83.0。 谢了。

    • 我想达到的效果是,当我单击Add按钮时,我可以向我的表单添加一行输入。我写了一个jQuery,但当我点击时,内容很快出现又消失。我该怎么修好它? null null

    • 我正在编写if-else语句,如果满足某个条件,我希望程序什么也不做。下面的代码显示了我的意思。 如果number等于零,我希望程序保留这个If-else语句,并移动到下一段代码,这段代码在while循环中

    • 我试图在Java做简单的聊天应用程序,但我得到这个错误。怎么了?我该怎么修好它?for循环中有一些错误? 我得到这个错误 线程“main”java.lang.IndexOutoFboundsException:索引0超出长度0的界限,位于java.base/jdk.internal.util.preconditions.OutoFbounds(preconditions.java:64)位于jav

    • 这是我的代码,它说错误是我用了一个小版本的minsdkversion?我该怎么修? 这就是错误 错误:C:\用户\ismaprod\StudioProjects\android3\应用程序\src\main\AndroidManifest.xml:7:5-73 错误:使用-sdk:minSdkVersion 11 不能小于库中声明的版本 14 [com.google.android.gms:pla

    • 我在运行一些JPQL查询时遇到了一些问题。在我的域模型中,我有一个City类,它有一个名称和一个对Country对象的引用,而Country对象也有一个名称。我正在尝试运行此查询: 然而,我得到了这个例外: 谢谢!