java lang exception_java_lang_RuntimeException

问题分析:

RuntimeException是运行时异常,是java编译器事先不可预见的异常。RuntimeException的子类众多,这里列举一些比较常见的子类:

1.BufferOverflowException当相关 put 操作达到目标缓冲区限制时,抛出此未经检查的异常。

2.ArrayStoreException试图将错误类型的对象存储到一个对象数组时抛出的异常。

3.ArithmeticException当出现异常的运算条件时,抛出此异常。例如,一个整数“除以零”时,抛出此类的一个实例。

4.BufferUnderflowException当相关 get 操作达到源缓冲区限制时,抛出此未经检查的异常。

5.IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)引用时超出范围时抛出。

6.NoSuchElementException 由 Enumeration 的 nextElement 方法抛出,表明枚举中没有更多的元素。

解决方案:

RuntimeException是发生在程序运行期,预先不可预见的发生。编译器未要求一定要进行捕获,如果运行期没有处理,则RuntimeException会一直往上层抛。最后由JVM来处理,JVM会打印堆栈信息然后结束应用。对于可能发生的RuntimeException,建议根据堆栈信息,检查代码是否有误并进行更改,如果情况复杂无法全部解决,可以对RuntimeException进行捕获并进行业务恢复处理。

代码示例:

try{

somethingThrowingARuntimeException();

}catch(RuntimeExceptione){

// Do something with it. At least log it

e.printStackTrace();

}示例一:

java.lang.RuntimeException:Unableto start activityComponentInfo{*}:android.support.v4.app.Fragment$InstantiationException:*:make sureclassname exists,ispublic,andhas an empty constructor thatispublic

当系统因为内存不足杀死非前台进程,用户又将被系统杀掉的非前台应用带回前台,如果这个时候有UI是呈现在Fragment中,那么会因为restore造成fragment需要通过反射实例对象,从而将之前save的状态还原。因此不应该改写构造函数,而应该使用静态方法比如newInstance来构造有参Fragment对象并返回。

代码示例:

步骤一:编写有参静态创建对象函数

publicstaticfinalAlertFragmentnewInstance(inttitle,Stringmessage)

{

AlertFragmentf=newAlertFragment();

Bundlebdl=newBundle(2);

bdl.putInt(EXTRA_TITLE,title);

bdl.putString(EXTRA_MESSAGE,message);

f.setArguments(bdl);

returnf;

}

步骤二:通过Bundle获取参数

@Override

publicvoidonCreate(BundlesavedInstanceState)

{

title=getArguments().getInt(EXTRA_TITLE);

message=getArguments().getString(EXTRA_MESSAGE);

//...

//etc

//...

}

步骤三:通过FragmentManager对Fragment进行管理。

publiconCreate(BundlesavedInstanceState){

if(savedInstanceState==null){

getSupportFragmentManager()

.beginTransaction()

.replace(R.id.content,AlertFragment.newInstance(

R.string.alert_title,

"Oh noes an error occured!")

)

.commit();

}

}

示例二:

Exceptioninthread"main"java.lang.IndexOutOfBoundsException:Index:80,Size:3

at java.util.ArrayList.rangeCheck(ArrayList.java:635)

at java.util.ArrayList.remove(ArrayList.java:474)

at com.alibaba.mqc.test.Test.indexOutOfBounds(Test.java:66)

at com.alibaba.mqc.test.Test.main(Test.java:32)

问题分析:

IndexOutOfBoundsException 指示某排序索引(例如对数组、字符串或向量的排序)引用时超出范围时抛出。请检查是否有对List有越界索引,判断访问数组的索引是否合法。

有误的代码:

publicvoidindexOutOfBounds(){

ArrayLista=newArrayList();

a.add('A');

a.add('B');

a.add('C');

System.out.println(a);

//a.remove('A');

a.remove(80);// 抛出此类异常

System.out.println(a);

}

建议的代码:

publicvoidindexOutOfBounds(){

ArrayLista=newArrayList();

a.add('A');

a.add('B');

a.add('C');

System.out.println(a);

if(a.size()>80){

a.remove(80);

}

System.out.println(a);

}

参考文献:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值