1. ホーム
  2. Android開発

よくあるJavaのエラー50選(その1)

2022-02-10 01:11:50

Javaソフトウェアを開発する際に遭遇するエラーには多くの種類がありますが、そのほとんどは回避することができます。このため、最も一般的なJavaのコーディングエラー50個をリストアップし、コード例とチュートリアルで一般的なコーディングの問題を解決するのに役立つようにしています。

コンパイラのエラー

Javaソフトウェアのコードをコンパイラで実行すると、コンパイラのエラーメッセージが作成されます。コンパイラは、1つのエラーに対して多くのエラーメッセージを投げる可能性があることを覚えておいてください。ですから、最初のエラーを修正して、再コンパイルする必要があります。そうすることで、多くの問題を解決することができます。

1. "...予想される"

このエラーは、コードに何かが欠けているときに発生します。これは通常、セミコロンや右括弧が欠けていることが原因です。

private static double volume(String solidom, double alturam, double areaBasem, double raiom) {
double vol;
    if (solidom.equalsIgnoreCase("esfera"){
        vol=(4.0/3)*Math.pi*Math.pow(raiom,3);
    }
    else {
        if (solidom.equalsIgnoreCase("cilindro") {
            vol=Math.pi*Math.pow(raiom,2)*alturam;
        }
        else {
            vol=(1.0/3)*Math.pi*Math.pow(raiom,2)*alturam;
        }
    }
    return vol;
}

通常、このエラーメッセージは、問題の正確な場所を特定するものではありません。エラーを発見するためには

  • すべての左括弧に対応する右括弧があることを確認します。
  • Javaコードの指示行を見る前に、一応その行を見てください。このJavaソフトウェアのエラーは、コードの深い部分を見るまで、コンパイラが気づきません。
  • 左括弧のような文字は、Javaコードの本来の位置に配置されないことになっていることがあります。そのため、開発者は右カギ括弧を配置してバランスをとっていないのです。

クリックで表示 不正な括弧がエラーを引き起こす例 (@StackOverflow) .

2. "閉じない文字列リテラル"

文字列リテラルの末尾が引用符で囲まれていない場合、"Unclosed String Literal"というエラーメッセージが作成され、エラーと同じ行にそのメッセージが表示されます。(@DreamInCode) Literalは、値のソースコードです。

public abstract class NFLPlayersReference {
    private static Runningback[] nflplayersreference;
    private static Quarterback[] players;
    private static WideReceiver[] nflplayers;
    public static void main(String args[]){
    Runningback r = new Runningback("Thomlinsion");
    Quarterback q = new Quarterback("Tom Brady");
    WideReceiver w = new WideReceiver("Steve Smith");
    NFLPlayersReference[] NFLPlayersReference;
        Run();// {
        NFLPlayersReference = new NFLPlayersReference [3];
        nflplayersreference[0] = r;
        players[1] = q;
        nflplayers[2] = w;
            for ( int i = 0; i < nflplayersreference.length; i++ ) {
            System.out.println("My name is " + " nflplayersreference[i].getName());
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            nflplayersreference[i].run();
            System.out.println("NFL offensive threats have great running abilities!");
        }
    }
    private static void Run() {
        System.out.println("Not yet implemented");
    }     
}

通常は で起こります。

  • 文字列テキストが引用符で終わっていない。これは、必要な引用符を追加して文字列テキストを閉じると簡単に修正できます。
  • 文字列が1行を越えて展開される。長い文字列リテラルは、プラス記号("+")で文字列リテラルに分割することができます。
  • 文字列リテラルの一部である引用符は、バックスラッシュ(" \")でエスケープされません。

クリックしてお読みください Javaソフトウェアエラーメッセージ「Unclosed String Literal」に関する考察 . (@Quora)

3. "式の不正な開始"

Illegal Start of an Expression"エラーは、さまざまな理由で発生する可能性があります。そのため、あまり有用ではないエラーメッセージの1つです。開発者の中には、不正なコードが原因だと考える人もいます。

通常、式は新しい値を生成したり、変数に値を代入したりするために作成されます。コンパイラは式を見つけることを期待しますが、構文が期待と一致しないため、見つけることができません。(@StackOverflow) このエラーは、これらのステートメントで見つけることができます。

} // ADD IT HERE
       public void newShape(String shape) {
        switch (shape) {
            case "Line":
                Shape line = new Line(startX, startY, endX, endY);
            shapes.add(line);
            break;
                case "Oval":
            Shape oval = new Oval(startX, startY, endX, endY);
            shapes.add(oval);
            break;
            case "Rectangle":
            Shape rectangle = new Rectangle(startX, startY, endX, endY);
            shapes.add(rectangle);
            break;
            default:
            System.out.println("ERROR. Check logic.");
        }
        }
    } // REMOVE IT FROM HERE
    }

クリックで閲覧 Illegal Start of an Expression"エラーのトラブルシューティング方法に関する考察 . (@StackOverflow) さん

4. "シンボルが見つかりません"

これは非常によくある問題で、Javaではすべての識別子を使用する前に宣言する必要があるからです。このエラーは、コードがコンパイルされるときに、コンパイラが識別子の意味を理解していないために発生します。

シンボルが見つかりません」というメッセージが表示される理由はさまざまです。

  • 識別子のスペルは、宣言されたときとコードで使用されるときとで異なる場合があります。
  • 変数が宣言されていない。
  • 変数が使用時に宣言と同じスコープにない。
  • クラスがインポートされていない。

クリックしてお読みください Cannot Find Symbol"エラーについての詳細な説明と、この問題を発生させたコード例です。 . (@StackOverflow) さん

5. "パブリッククラスXXXはファイルであるべき"

Public Class XXX Should Be in File"は、XXXクラスとJavaプログラムファイル名が一致しない場合に表示されます。クラスとJavaファイルが同じである場合にのみ、コードはコンパイルされます。(@coderanch)さんからの情報です。

package javaapplication3;  
  public class Robot {  
        int xlocation;  
        int ylocation;  
        String name;  
        static int ccount = 0;  
        public Robot(int xxlocation, int yylocation, String nname) {  
            xlocation = xxlocation;  
            ylocation = yylocation;  
            name = nname;  
            ccount++;         
        } 
  }
  public class JavaApplication1 { 
    public static void main(String[] args) {  
        robot firstRobot = new Robot(34,51,"yossi");  
        System.out.println("numebr of robots is now " + Robot.count);  
    }
  }


この問題を解決するために

  • クラスとファイルの名前を同じにする。
  • 2つの名前がどちらも同じであることを確認してください。

クリックで表示 Public Class XXX Should Be in File"エラーの例 . (@StackOverflow) さん

6. "互換性のない型"

Incompatible Types"は、指定されたステートメントが変数と型式を組み合わせようとしたときに発生するロジックエラーです。通常、コードがテキスト文字列を整数型に入れようとしたとき、またはその逆の場合に発生します。これは、Javaの構文エラーではありません。(@StackOverflow)

test.java:78: error: incompatible types
return stringBuilder.toString();
                             ^
required: int
found: String
1 error

コンパイラが "Incompatible Types" というメッセージを表示した場合、簡単には修正できません。

  • 型変換ができる関数がある。
  • 開発者は、コードによって期待される機能を変更する必要があるかもしれません。

表示方法 この例 これは、文字列を整数に代入しようとすると "互換性のない型" というメッセージが表示されることを示しています。(@StackOverflow)

7. "無効なメソッド宣言です。

このJavaソフトウェアのエラーメッセージは、メソッドの戻り値の型がメソッド署名で明示的に宣言されていないことを示します。

public class Circle
{
    private double radius;
    public CircleR(double r)
    {
        radius = r;
    }
    public diameter()
    {
       double d = radius * 2;
       return d;
    }
}

Invalid Method Declaration; Return Type Required"エラーを発生させるには、いくつかの方法があります。

  • 型の宣言を忘れた
  • メソッドに戻り値がない場合、メソッドのシグネチャで型として "void" を宣言する必要があります。
  • コンストラクタ名は、型宣言をする必要はありません。ただし、コンストラクタ名に誤りがある場合、コンパイラはコンストラクタを型が指定されていないメソッドとして扱います。

この説明を見る コンストラクタの命名が、quot; Invalid Method Declaration; Return Type Required" 問題を誘発する例 . (@StackOverflow) さんの投稿

8.メソッド <X> in クラス <Y> Cannot Be Applied to Given Types".メソッド <X> in クラス <Y> Cannot Be Applied to Given Types"。

このJavaソフトウェアのエラーメッセージは、より有用なエラーメッセージの1つです。これは、メソッドシグネチャが間違ったパラメータを呼び出していることを宣言的に示しています。

RandomNumbers.java:9: error: method generateNumbers in class RandomNumbers cannot be applied to given types;
generateNumbers();
required: int[]
found: generateNumbers();
reason: actual and formal argument lists differ in length

呼び出されたメソッドは、メソッド宣言で定義された特定の引数を予期しています。メソッド宣言を確認し、互換性があることを確認した上で、注意深く呼び出してください。

を確認します。 今回のディスカッション Javaソフトウェアのエラーメッセージが、メソッド宣言とメソッド呼び出しのパラメータによって生じる非互換性をどのように識別するかを説明しています。(@StackOverflow)

9.リターンステートメントがありません。

Missing Return Statement" は、メソッドに return ステートメントがない場合に表示されるメッセージです。void 型以外の)値を返すすべてのメソッドには、メソッドの外部で呼び出すために、文字通りその値を返すステートメントが必要です。

public String[] OpenFile() throws IOException {
    Map<String, Double> map = new HashMap();
    FileReader fr = new FileReader("money.txt");
    BufferedReader br = new BufferedReader(fr);
    try{
        while (br.ready()){
            String str = br.readLine();
            String[] list = str.split(" ");
            System.out.println(list);               
        }
    } catch (IOException e){
        System.err.println("Error - IOException!");
    }
}

コンパイラが "Missing Return Statement" というメッセージを投げるのには、いくつかの理由があります。

  • エラーにより return 文が省略された。
  • このメソッドは値を返しませんが、メソッドのシグネチャで void 型が未宣言です。

表示 Javaソフトウェアエラー「Missing Return Statement"」の修正例 . (@StackOverflow) さん

10.精度が落ちる可能性があります。

Possible Loss of Precision"メッセージは、変数に容量以上の情報が代入された場合に発生します。このような場合、フラグメントは捨てられます。もしこれが問題でないなら、コードは明示的に変数を新しい型として宣言する必要があります。

Possible Loss of Precision"エラーは、通常、次のような場合に発生します。

  • 整数データ型の変数に実数を代入しようとした。
  • 整数データ型の変数にdoubleを代入しようとした。

この Javaにおける基本的なデータ型の説明 は、データの特性を表現しています。(@オラクル)

11. "パース中にファイルの末尾に到達しました。

このエラーメッセージは、Javaのコードで、プログラム中に閉じ中括弧("}")がない場合に発生します。コードの末尾に中括弧を配置することで、すぐにエラーを修正できることもあります。

public class mod_MyMod extends BaseMod
public String Version()
{
     return "1.2_02";
}
public void AddRecipes(CraftingManager recipes)
{
   recipes.addRecipe(new ItemStack(Item.diamond), new Object[] {
      "#", Character.valueOf('#'), Block.dirt
   });
}

上記のコードでは、以下のようなエラーになります。

java:11: reached end of file while parsing }

ユーティリティプログラムを書き、コードのインデントを適切に行うことで、このような中括弧の欠落を容易に発見することができます。

この 中括弧がないために "Reached End of File While Parsing" というエラーメッセージが発生することを説明します。(@StackOverflow)

12. "到達できないステートメント"

ステートメントが実行できない場所に書かれている場合、"Unreachable statement"エラーが発生します。通常、break文やreturn文の後に発生します。

for(;;){
   break;
   ... // unreachable statement
}
int i=1;
if(i==1)
  ...
else
  ... // dead code

returnステートメントを移動するだけでエラーが修正されることもよくあります。を読んでみてください。 Unreachable StatementのJavaソフトウェアエラーを修正する方法について説明します。 . (@StackOverflow)

13.変数 <X> が初期化されていない可能性があります "。

このエラーは、メソッド内で宣言されたローカル変数が初期化されていない場合に発生します。また、初期値のない変数がif文の一部である場合にも発生することがあります。

int x;
if (condition) {
    x = 5;
}
System.out.println(x); // x may not have been initialized


これを読む 変数 <X> が初期化されていない可能性があります" エラーのトリガーを回避する方法に関する考察 . (@reddit)

14. "演算子 ... X>"に適用することはできません。

この問題は、定義にない型に対して演算子を使用した場合に発生します。

operator < cannot be applied to java.lang.Object,java.lang.

これは通常、Javaコードが計算で型文字列を使用しようとしたときに起こります。これを解決するには、文字列を整数型または浮動小数点型に変換する必要があります。

この説明を読む 非数値型が原因で、alert演算子が適用できないJavaソフトウェアエラーが発生する例 . (@StackOverflow) さん

15.変換不可能な型(Inconvertible Types)"

Javaコードが不正な変換を行おうとすると、"Inconvertible Types"エラーが発生します。

TypeInvocationConversionTest.java:12: inconvertible types
found : java.util.ArrayList<java.lang.Class
 extends TypeInvocationConversionTest.Interface1>>
required: java.util.ArrayList<java.lang.
>>
    lessRestrictiveClassList = (ArrayList<Class
>) classList;

例えば、boolean 値は整数に変換できない。

については、こちらの記事をご覧ください。 Javaソフトウェアで変換不可能な型を変換する方法について説明します。 . (@StackOverflow)

16. "戻り値の欠落"

return文に不正な型が含まれている場合、"Missing Return Value"というメッセージが表示されます。例えば、次のようなコードです。

public class SavingsAcc2 {
    private double balance;
    private double interest;
    public SavingsAcc2() {
        balance = 0.0;
        interest = 6.17;
    }
    public SavingsAcc2(double initBalance, double interested) {
        balance = initBalance;
        interest = interested;
    }
    public SavingsAcc2 deposit(double amount) {
        balance = balance + amount;
        return;
    }
    public SavingsAcc2 withdraw(double amount) {
        balance = balance - amount;
        return;
    }
    public SavingsAcc2 addInterest(double interest) {
        balance = balance * (interest / 100) + balance;
        return;
    }
    public double getBalance() {
        return balance;
    }
}

次のようなエラーが返されます。

SavingsAcc2.java:29: missing return value 
return; 
^ 
SavingsAcc2.java:35: missing return value 
return; 
^ 
SavingsAcc2.java:41: missing return value 
return; 
^ 
3 errors

通常、何も返さないreturn文があります。

については、こちらの記事をお読みください。 Javaソフトウェアのエラーメッセージ「Missing Return Value"」を回避する方法について考察しています。 . (@coderanch) さん

アタッチメントです。

<スパン 翻訳へのリンクです。 http://www.codeceo.com/article/50-java-errors-part-1.html

原文は英語です。 Javaでよくある50のエラーとその回避方法(前編)
<スパン 翻訳者 コード・コム <スパン  - 小峰