問題の説明
RuntimeException は、Java コンパイラでは予測できない例外を指します。 RuntimeException には多くのカテゴリが含まれます。このトピックでは、以下の一般的なカテゴリのみをリストしています。
Put 操作の実行時にバッファ制限に達した場合、BufferOverflowException が発生します。
配列に格納しようとするオブジェクトの型がサポートされていない場合、ArrayStoreException が発生します。
無効な操作条件が指定された場合、ArithmeticException が発生します。たとえば、整数をゼロで除算するように指定すると、ArithmeticException が発生します。
Get 操作の実行時にバッファ制限に達していない場合、BufferUnderflowException が発生します。
参照されるソートインデックス(配列、文字列、またはベクターのソートなど)が指定されたしきい値を超えると、IndexOutOfBoundsException が発生します。
nextElement メソッドによって NoSuchElementException がスローされ、列挙にこれ以上要素が含まれていないことが示されます。
解決策
RuntimeException は、Java コンパイラでは予測できません。コンパイラは、この例外をキャッチする必要はありません。ただし、実行時に RuntimeException が処理されない場合、JVM まで上位層にスローされます。 JVM はスタック情報を生成し、アプリを終了します。コードにエラーが含まれていないかどうかを確認し、スタック情報に基づいて変更することをお勧めします。この方法で例外を解決できない場合は、例外をキャッチして処理できます。
サンプルコード
try {
somethingThrowingARuntimeException();
}catch (RuntimeException e) {
// Do something with it. At least log it
e.printStackTrace();
}
例 1
java.lang.RuntimeException:Unable to start activity ComponentInfo{*}: android.support.v4.app.Fragment$InstantiationException:*: make sure class name exists,ispublic,and has an empty constructor that ispublic
メモリ不足のためにシステムがフォアグラウンドにないプロセスを強制終了し、再びフォアグラウンドに戻した場合、UI でフラグメントが使用されていて、restore() メソッドが呼び出されると、フラグメントはインスタンスオブジェクトを反映し、以前に保存された状態が復元される必要があります。したがって、コンストラクタ関数を再書き込みすることはできませんが、newInstance などの静的メソッドを使用してパラメータ化されたフラグメントオブジェクトを構築します。
サンプルコード:
1. 静的メソッドを使用してパラメータ化されたオブジェクトを作成する関数を記述します。
public static final AlertFragment newInstance(int title, String message)
{
AlertFragment f = new AlertFragment();
Bundle bdl = new Bundle(2);
bdl.putInt(EXTRA_TITLE, title);
bdl.putString(EXTRA_MESSAGE, message);
f.setArguments(bdl);
return f;
}
2. bundle クラスを使用してパラメータを取得します。
@Override
public void onCreate(Bundle savedInstanceState)
{
title = getArguments().getInt(EXTRA_TITLE);
message = getArguments().getString(EXTRA_MESSAGE);
//...
//etc
//...
}
3. FragmentManager を使用してフラグメントを管理します。
public onCreate(Bundle savedInstanceState) {
if(savedInstanceState == null){
getSupportFragmentManager()
.beginTransaction()
.replace(R.id.content,AlertFragment.newInstance(
R.string.alert_title,
"Oh noes an error occured!")
)
.commit();
}
}
例 2
Exception in thread "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 が発生します。 リストオブジェクトの参照インデックスが指定されたしきい値を超えていないか、配列にアクセスするためのインデックスが有効かどうかを確認します。
エラーコード:
public void indexOutOfBounds(){
ArrayList<Character> a = new ArrayList<Character>();
a.add('A');
a.add('B');
a.add('C');
System.out.println(a);
//a.remove('A');
A. remove(80); // Throw the exception.
System.out.println(a);
}
推奨コード:
public void indexOutOfBounds(){
ArrayList<Character> a = new ArrayList<Character>();
a.add('A');
a.add('B');
a.add('C');
System.out.println(a);
if(a.size()>80){
a.remove(80);
}
System.out.println(a);
}
参照
https://developer.android.com/reference/java/lang/RuntimeException.html
http://stackoverflow.com/questions/10450348/do-fragments-really-need-an-empty-constructor
http://stackoverflow.com/questions/2028719/handling-runtimeexceptions-in-java
http://tool.oschina.net/uploads/apidocs/jdk-zh/java/lang/RuntimeException.html