2016-05-14 13 views
0

ベクトルの要素がクラスのインスタンスでないかどうかを確認する方法を知りたいと思います。 ベクトルmの要素がsumにインクリメントするクラスに存在する場合です。 iがクラスのインスタンスでない場合、-1を返します。ここに私のコードです:クラスのインスタンスではありません。ベクトル

public static int CountHighs(Vector m) { 
    int sum = 0; 
    for (int i = 0; i < m.size(); i++) { 
     try { 
      if (m.get(i) instanceof HighRights) { 
       sum += 1; 
      } else if ((!m.get(i) instanceof Highrights) || (!m.get(i) instanceof LowRights)) { 
       sum = -1; 
      } 
     } catch (NullPointerException E) { 
      System.out.println("Error"); 
      System.exit(0); 
      return 0; 
     } 
     return sum; 
    } 
} 

私は演算子 "!"を使用しています。ここに回答者の利益のために。

!m.getsはエラーの原因となります。要素がこのクラスのインスタンスでないかどうかを示す方法があるかどうか疑問に思っていました。

+0

ので、正確な問題が何であるか:あなたはelse ifを使用するので、あなたの最終的なコードは次のようになりますので、また、それはとてもチェックが不要であるm.get(i)が可能とHighRightsのインスタンスことができないことを意味しますか? – Mureinik

+0

@Mureinik!m.getsは私にエラーを引き起こします、要素がこのクラスのインスタンスでないかどうかを示す方法があるかどうか疑問に思っていました。あいまいさに対する謝罪 – duldi

+2

'catch(NullPointerException E)'何ですか?そしてそのブロックは何か役に立つものさえしません。 – Tom

答えて

2

単項演算子は、Javaで(例えばinstanceofなど)関係演算子よりも高い優先順位を持つべきであると信じています(詳細はthe official tutorialを参照してください)。したがって、Javaは!m.get(i)を最初に解釈しようとします。m.get(i)はブール値を返さないため、失敗します。

else if (!((m.get(i) instanceof Highrights) || (m.get(i) instanceof LowRights))) { 
+0

なぜそれがこのような違いを作ったのか不思議に思っていたのですが、助けてくれてありがとうございます – duldi

+1

これは間違っています!(A || B)=>!&&!BはOPが望んでいないものです –

+0

Nicolasが言及したように、式から否定を抽出するときは、 '||'の代わりに '&&'を使う必要があります。 – Tom

1

この(!m.get(i) instanceof Highrights)をこの!(m.get(i) instanceof Highrights)に変更するだけです。実際には!booleanの値の演算子ですが、m.get(i)booleanを返しませんが、オブジェクトはコンパイルされないので、あなたのテストの負の値を得るためには、あなたの濁点の外に置く必要がありますx instanceof y

だから、最後のテストが!(m.get(i) instanceof Highrights) || !(m.get(i) instanceof LowRights)

NBです:ここにあなたのテストは、以前のifはそうあなたがそのm.get(i) instanceof HighRightsfalse、このようなテストが!(m.get(i) instanceof Highrights) || !(m.get(i) instanceof LowRights)常に意志ということで、すでに知って失敗したことを意味しelse ifでありますtrueなるので、私はあなたのテストは、(例えば!など)のみelse if (!(m.get(i) instanceof LowRights))

0

ちょうど行います:

else if(!(m.get(i) instanceof LowRights)) 

私はまた、あなたのコードの残りの部分をフォーマットして、不要なチェックを取り出した。この問題を解決するために、あなたはinstanceofが最初に評価するために括弧を使用する必要があります:

else if(!(m.get(i) instanceof Highrights)) 

括弧はbooleanとして、文全体を処理し、その後、あなたは!でそれを否定することができます。

public static int CountHighs (Vector m) { 
    int sum=0; 
    for(int i=0; i<m.size();i++){ 
     try{ 
      if(m.get(i) instanceof HighRights){ 
      sum+=1; 
     } 
     else if(!(m.get(i) instanceof LowRights)){ 
      sum=-1; 
     } 
     catch(NullPointerException E){ 
      System.out.println("Error"); 
      System.exit(0); 
      return 0; 
     } 
    } 
    return sum; 
}