2016-05-14 6 views
0

Я хотел бы знать, как проверить, не является ли элемент вектора не экземпляром класса. Сценарий - если элемент в векторе m существует в классе, мы увеличиваем сумму. Если i не является экземпляром класса, то мы возвращаем -1. Вот мой код:Не экземпляр класса Vectors java

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

Так что именно проблема? – Mureinik

+0

@Mureinik The! M.gets вызывает у меня ошибку, мне было интересно, существует ли способ указать, является ли элемент не экземпляром этого класса. Извинения за двусмысленность – duldi

+2

'catch (NullPointerException E)' Что? И этот блок даже не делает ничего полезного. – Tom

ответ

2

унарные операторы (такие как !) имеют более высокий приоритет, чем реляционные операторы (такие как instanceof) в Java (см. the official tutorial). Поэтому Java пытается сначала интерпретировать !m.get(i) и не удается, поскольку m.get(i) не возвращает логическое значение. Для того, чтобы решить эту проблему, вы должны использовать круглые скобки, чтобы сделать instanceof оценку первым:

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

Спасибо, мне было интересно, почему это так повлияло, спасибо за вашу помощь. – duldi

+1

oops this is wrong! (A || B) =>! A &&!B, который не является тем, что хочет OP –

+0

Как упоминалось в Николасе, вам нужно использовать '&&' вместо '||', когда вы извлекаете отрицание из выражения. – 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: Здесь ваш тест в else if, что означает, что предыдущий if не удалось, так что вы уже знаете, что m.get(i) instanceof HighRights является false таким образом, что ваш тест будет !(m.get(i) instanceof Highrights) || !(m.get(i) instanceof LowRights) всегда будет быть true поэтому я считаю, что ваш тест должен быть только else if (!(m.get(i) instanceof LowRights))

0

Вобще:

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

Я также отформатирован остальная часть вашего кода, и вынул ненужную проверку :

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

скобка будет рассматривать все заявления в качестве boolean, а затем вы можете отрицать, что с !. Кроме того, поскольку вы используете else if это означает, что m.get(i) не может быть и экземпляр HighRights поэтому проверка не требуется, чтобы ваш окончательный код будет выглядеть следующим образом:

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; 
} 
Смежные вопросы