Try-catchブロックを使用してNullPointerException
をキャッチしようとしましたが、まだ次のプログラムでエラーが発生しています。私は何か間違ったことをしていますか、または次のプログラムでNullPointerException
をキャッチする他の方法がありますか?どんな助けも大歓迎です。
public class Circular_or_not
{
/**
* @param args
*/
public static void main(String[] args)
{
// TODO Auto-generated method stub
try
{
LinkedListNode[] nodes = new LinkedListNode[10];
for (int i = 0; i < 10; i++)
{
nodes[i] = new LinkedListNode(i, null, i > 0 ? nodes[i - 1] : null);
}
// Create loop;
// nodes[9].next = nodes[3];
Boolean abc= Check_Circular(nodes[0]);
System.out.print(abc);
}
catch(NullPointerException e)
{
System.out.print("NullPointerException caught");
}
}
public static boolean Check_Circular(LinkedListNode head)
{
LinkedListNode n1 = head;
LinkedListNode n2 = head;
// Find meeting point
while (n2.next != null)
{
n1 = n1.next;
n2 = n2.next.next;
if (n1 == n2)
{
return true;
}
}
return false;
}
}
NullPointerException
は実行時例外であり、キャッチすることは推奨されませんが、代わりに回避してください。
if(someVariable != null) someVariable.doSomething();
else
{
// do something else
}
別の回答の中ですでに述べたように、NullPointerExceptionをキャッチすることをお勧めしますnotです。ただし、次の例に示すように、間違いなくキャッチできます。
public class Testclass{
public static void main(String[] args) {
try {
doSomething();
} catch (NullPointerException e) {
System.out.print("Caught the NullPointerException");
}
}
public static void doSomething() {
String nullString = null;
nullString.endsWith("test");
}
}
NPEをキャッチすることはできますが、最初の問題(Check_Circularメソッド)を修正することは絶対にすべきではありません。
コードの問題は、Check_Circularのループにあります。一度に1つのノードに移動して、n1を使用してリストを進みます。 n2をn2.next.nextに再割り当てすることにより、一度に2つずつ進みます。
これを行うと、n2.next.nextがヌルになる可能性があるため、割り当て後はn2がヌルになります。ループが繰り返され、n2.nextがnullでないかどうかをチェックすると、n2がすでにnullであるためnextに到達できないため、NPEがスローされます。
アレックスが代わりに投稿したようなことをしたいのです。
あなたの問題は、CheckCircularのwhile状態にあると思います。
2つのノードがあり、最初のN1とN2は同じノードを指し、次にN1は2番目のノード(最後)を指し、N2はN2を指します(N2.next.nextであるため)。次のループでは、N2で「next」メソッドを呼び出そうとしますが、N2はnullです。そこにある、NullPointerException
上記のコードでNullPointerException
をキャッチする必要がありますが、Check_Circular
が間違っているという事実は変わりません。 Check_Circular
を修正すると、コードは最初にNullPointerException
をスローせず、意図したとおりに動作します。
試してください:
public static boolean Check_Circular(LinkedListNode head)
{
LinkedListNode curNode = head;
do
{
curNode = curNode.next;
if(curNode == head)
return true;
}
while(curNode != null);
return false;
}