デスクトップアプリケーションを開発しています。Log4j を使用してログを書きました。でログを書き込むにはどうすればよいNullPointerException
ですか? 私はそれが起こるとは予測していませんでした。
4 に答える
構成が問題ないと仮定して、例外をログに出力する方法だけを意味する場合:
try {
....something
} catch(RuntimeException e) {
log.error("Got unexpected exception", e);
}
NullPointerException は RuntimeExepction から継承されるため、上記のコードを使用して安全にキャッチできます。上記のコードは、Exception から継承されているが RuntimeException から継承されていない例外をキャッチしません。
私があなたの質問を正しく理解していれば、Try catch ステートメントをコード全体に配置して NullPointer Exception を処理することは想定されていないため、望ましくありません。
簡単な処理方法は、操作にオブジェクト参照を使用する前に null チェックを入れることです。また、これらの null チェックは、他の例外またはエラー シナリオが原因で初期化されない可能性があると予想されるオブジェクトにのみ配置してください。
すなわち
if (objectReference!=null)
objectReference.CallSomeMethod();
もう一つの例
String listofDefaulters =null;
String defaulters = getDefauter();
/**you might expect that you will always get defaulters from the method call but it might happen dat it can return null value also.
So always put a null check where you are not 100% sure if value will not be null**/
if (defaulters !=null)
defaulters.doSomeOperation();
実行したい場合は、ログを含めて実行するaspect oriented programming
ためのアドバイスを以下に記述してください。Exception
NullPointerException
@Aspect
public class ExceptionLogging {
private static Logger log = null;
@Pointcut ("call(* *.*(..)))
public void exceptionLogMethods(){
}
@AfterThrowing(pointcut="exceptionLogMethods()", throwing="e")
public void handleException(Throwable ex, JoinPoint jointPoint) {
log = Logger.getLogger(jointPoint.getThis().getClass());
log.debug(jointPoint.getThis().getClass() + ex.getMessage());
}
}
例外とメッセージをカスタマイズするためPreconditions
に、Guava ライブラリでもこのクラスを使用できます。
参照がの場合、メソッドPreconditions#checkNotNull(T, java.lang.Object)
は a をスローします。NullPointerException
T
null
void method(String name) {
Preconditions.checkNotNull(name, "The name is null.");
// do something with the name
}
void otherMethod() {
try {
method("zerone"); // OK
method(null); // throws NPE
} catch(RuntimeExcetion e) {
LOG.error(e.getMessage(), e); // Message: "The name is null."
}
}