java – 什么是IndexOutOfBoundsException?我该如何解决?
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了java – 什么是IndexOutOfBoundsException?我该如何解决?,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含7896字,纯文字阅读大概需要12分钟。
内容图文
![java – 什么是IndexOutOfBoundsException?我该如何解决?](/upload/InfoBanner/zyjiaocheng/717/8f64e24438a64d5ba4ec0d18b6d51376.jpg)
参见英文答案 > What causes a java.lang.ArrayIndexOutOfBoundsException and how do I prevent it? 24个
这是我的代码:
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 one rrorResponse(VolleyError error) {
mTextView.setText("That didn't work!");
}
});
// Add the request to the RequestQueue.
queue.add(stringRequest);
}
这是android文档中给出的默认值.我只更改了网址.
这是我的错误消息:
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)
在调试期间,我看到mTextView.setText(“Response is:”response.substring(0,500));我的消息已发送给我,但textview永远不会更新,应用程序崩溃.
具体来说,它在Looper.Java文件中崩溃:
finally {
if (traceTag != 0) {
Trace.traceEnd(traceTag);
}
traceTag为0.
我读到一些字符串边界是错误的,但我找不到如何解决它.
解决方法:
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的简短表达式,但它是not a statement意味着它不能作为原子语句出现,因为这是无效的,因为没有赋值
((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);
什么是IndexOutOfBoundsException?
IndexOutOfBoundsException
is a subclass ofRuntimeException
mean
it is an unchecked exception which is thrown to indicate that an index
of some sort (such as to an array, to a string, or to a vector) is out
of range.e.g using List.
06006
预防:
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);
}
哪些是IndexOutOfBoundsException的其他变体/子类?
> ArrayIndexOutOfBoundsException:这表示已使用非法索引访问数组.例如,索引是负数或大于或等于数组的大小
06009
预防:
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方法),当索引等于字符串的大小时,也会抛出此异常.
060011
预防:
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
注意:length()是String类的函数,length是数组的关联字段.
为什么会发生这种异常
>使用带有数组或charAt,子串函数的负索引
> BeginIndex小于0或endIndex大于输入字符串的长度以创建子字符串或beginIndex大于endIndex
>当endIndex – beginIndex结果小于0时
>输入字符串/数组为空时
信息:JVM的工作是创建适当异常的对象并将其传递到使用throw关键字的位置,或者也可以使用throw关键字手动执行.
if (s == null) {
throw new IndexOutOfBoundsException("null");
}
我怎样才能解决这个问题 ?
>分析StackTrace
>根据nullity,length或valid索引验证输入字符串
>使用调试或日志
>使用Generic Exception catch块
1.)分析StackTrace
如本文开头所示,stacktrace在初始消息中提供了有关其发生位置的必要信息,为什么会发生这种情况,因此您只需跟踪该代码并应用所需的解决方案即可.
例如,StringIndexOutOfBoundsException的原因,然后查找指示您的类文件的包名称,然后转到该行并记住原因,只需应用解决方案
如果您在文档中研究异常及其原因,那么这是一个良好的开端.
2.)根据nullity,length或valid索引验证输入字符串
如果您不知道实际输入(例如响应来自服务器(或者可能是错误或没有)或用户),如果不确定,那么最好覆盖所有意外情况,但相信我很少有用户总是喜欢推送测试的极限所以使用输入!= null&& input.length()> 0或索引,您可以使用三元运算符或if-else边界检查条件
3.)使用调试或日志
您可以通过在项目中添加断点来在调试模式下测试项目的运行环境,系统将停在那里等待您的下一个操作,同时您可以查看变量的值和其他详细信息.
日志就像检查点一样,所以当你的控件跨越这一点时,它们会产生细节,基本上它们是由枯萎系统给出的信息性消息,或者用户也可以使用Logs或Println消息放置日志消息
4.)使用Generic Exception catch块
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 ");
}
进一步的参考
What is a NullPointerException, and how do I fix it?
内容总结
以上是互联网集市为您收集整理的java – 什么是IndexOutOfBoundsException?我该如何解决?全部内容,希望文章能够帮你解决java – 什么是IndexOutOfBoundsException?我该如何解决?所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。