全部产品
云市场

java_lang_RuntimeException

更新时间:2018-04-19 20:40:10

问题分析:

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进行捕获并进行业务恢复处理。

代码示例:

  1. try {
  2. somethingThrowingARuntimeException();
  3. }catch (RuntimeException e) {
  4. // Do something with it. At least log it
  5. e.printStackTrace();
  6. }
  1. 示例一:

    1. java.lang.RuntimeException: Unable to start activity ComponentInfo{*}: android.support.v4.app.Fragment$InstantiationException: *: make sure class name exists, is public, and has an empty constructor that is public

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

代码示例:

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

  1. public static final AlertFragment newInstance(int title, String message)
  2. {
  3. AlertFragment f = new AlertFragment();
  4. Bundle bdl = new Bundle(2);
  5. bdl.putInt(EXTRA_TITLE, title);
  6. bdl.putString(EXTRA_MESSAGE, message);
  7. f.setArguments(bdl);
  8. return f;
  9. }

步骤二:通过Bundle获取参数

  1. @Override
  2. public void onCreate(Bundle savedInstanceState)
  3. {
  4. title = getArguments().getInt(EXTRA_TITLE);
  5. message = getArguments().getString(EXTRA_MESSAGE);
  6. //...
  7. //etc
  8. //...
  9. }

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

  1. public onCreate(Bundle savedInstanceState) {
  2. if(savedInstanceState == null){
  3. getSupportFragmentManager()
  4. .beginTransaction()
  5. .replace(R.id.content,AlertFragment.newInstance(
  6. R.string.alert_title,
  7. "Oh noes an error occured!")
  8. )
  9. .commit();
  10. }
  11. }

示例二:

  1. Exception in thread "main" java.lang.IndexOutOfBoundsException: Index: 80, Size: 3
  2. at java.util.ArrayList.rangeCheck(ArrayList.java:635)
  3. at java.util.ArrayList.remove(ArrayList.java:474)
  4. at com.alibaba.mqc.test.Test.indexOutOfBounds(Test.java:66)
  5. at com.alibaba.mqc.test.Test.main(Test.java:32)

问题分析:

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

有误的代码:

  1. public void indexOutOfBounds(){
  2. ArrayList<Character> a = new ArrayList<Character>();
  3. a.add('A');
  4. a.add('B');
  5. a.add('C');
  6. System.out.println(a);
  7. //a.remove('A');
  8. a.remove(80); // 抛出此类异常
  9. System.out.println(a);
  10. }

建议的代码:

  1. public void indexOutOfBounds(){
  2. ArrayList<Character> a = new ArrayList<Character>();
  3. a.add('A');
  4. a.add('B');
  5. a.add('C');
  6. System.out.println(a);
  7. if(a.size()>80){
  8. a.remove(80);
  9. }
  10. System.out.println(a);
  11. }

参考文献:

1.https://developer.android.com/reference/java/lang/RuntimeException.html

2.http://stackoverflow.com/questions/10450348/do-fragments-really-need-an-empty-constructor

3.http://blog.csdn.net/xplee0576/article/details/43057633

4.http://stackoverflow.com/questions/2028719/handling-runtimeexceptions-in-java

5.http://tool.oschina.net/uploads/apidocs/jdk-zh/java/lang/RuntimeException.html