Java の Bad Operand Types エラーを修正

Mohammad Irfan 2023年10月12日
  1. Java の&演算子の悪い演算子型
  2. Java の && 演算子のオペランドタイプが悪い
  3. Java の == 演算子のオペランドタイプが悪い
  4. Java の <= 演算子のオペランドタイプが正しくありません
Java の Bad Operand Types エラーを修正

このチュートリアルでは、Java の二項演算子の bad operand types エラーを紹介します。

二項演算子は、2つのオペランドを必要とする演算子です。算術演算子や関係演算子などの演算子は、二項演算子と呼ばれます。

演算子はプログラミングで重要な役割を果たします。二項演算子は、不適切な使用により bad operand types エラーが発生する場合があります。bad operand types エラーは、両方のタイプのオペランドに互換性がない場合のコンパイル時エラーです。

たとえば、文字列を整数と比較すると、このエラーが発生します。この記事では、このエラーがどのように発生し、どのように解決するかについて、さまざまな例を見ていきます。

場合によっては、演算子の優先順位によって、互換性のない演算子タイプが発生し、コンソールでエラーが発生する可能性があります。

Java の&演算子の悪い演算子型

まず、Java コードで Bad Operand Types が発生する可能性がある最も一般的なケースを理解しましょう。以下のサンプルコードを見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    if (x & 21 == 1) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

MyClass.java:4: error: bad operand types for binary operator '&'
      if( x & 21 == 1){
            ^
  first type:  int
  second type: boolean
1 error

このエラーは、==(等しい)演算子の優先順位が&演算子の優先順位よりも高いために発生します。これにより、21 == 1 の評価が行われ、ブール値が得られます。

ここで、&に 1つの整数オペランドと 1つのブール値があることに注意してください。両方の演算子のタイプが異なるため、&演算子は機能せず、エラーが発生します。

このエラーを解決するには、最初に x & 21 を評価する必要があることを示すために括弧を使用します。以下の変更されたコードを見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    if ((x & 21) == 1) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

if block executing

Java の && 演算子のオペランドタイプが悪い

同様に、論理&&(および)演算子を使用している場合、以下のサンプルコードのように、bad operand types エラーが発生する場合があります。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    if ((x > 10) && (x * 5)) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

MyClass.java:4: error: bad operand types for binary operator '&&'
      if((x > 10) && (x*5)){
                  ^
  first type:  boolean
  second type: int
1 error

このエラーは、&&オペランドが 2つのブールオペランドを想定しているために発生します。

ここで、式 x * 5 は整数値を示します。したがって、ここでの&&演算子には整数オペランドがあり、bad operand types エラーが発生します。

このエラーを解決するために、ブール値を返す x * 5==21 となるようにこのコードを変更します。以下の変更されたコードを見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    if ((x > 10) && (x * 5 == 21)) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

else block executing

Java の == 演算子のオペランドタイプが悪い

等号演算子 == を使っていると、同じエラーが発生する場合があります。渡された両方のオペランドが異なるタイプである場合、不正な演算子エラーが発生する可能性があります。

以下の例を見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    String y = "43";
    if (x == y) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

MyClass.java:5: error: bad operand types for binary operator '=='
      if(x == y){
           ^
  first type:  int
  second type: String
1 error

このエラーは、== 等号演算子のオペランドのタイプが異なるために発生します。1つは文字列で、もう 1つは整数です。

このエラーを解決するには、同じデータ型を取得するようにそれらの 1つを変換する必要があります。整数を文字列に変換すると、辞書式順序で比較が行われます。

したがって、string を int に変換します。以下の変更されたコードを見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    String y = "43";
    if (x == Integer.parseInt(y)) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

if block executing

Java の <= 演算子のオペランドタイプが正しくありません

前のケースの例のように、<=(以下に等しい)演算子も、両方のオペランドが異なるタイプである場合、不正な演算子タイプエラーを発生させる可能性があります。以下の例を見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    String y = "43";
    if (x <= y) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

MyClass.java:5: error: bad operand types for binary operator '<='
      if(x <= y){
           ^
  first type:  int
  second type: String
1 error

このエラーを解決するには、同じデータ型を取得するためにそれらの 1つを変換する必要があります。以下の変更されたコードを見てください。

public class MyClass {
  public static void main(String args[]) {
    int x = 43;
    String y = "43";
    if (x <= Integer.parseInt(y)) {
      System.out.println("if block executing");
    } else {
      System.out.println("else block executing");
    }
  }
}

出力:

if block executing

関連記事 - Java Error