3種類のプログラミングエラーとその回避方法

プログラミングエラーは、アプリケーションの動作の欠陥です。それらは一般に「バグ」と呼ばれるため、「デバッグ」という用語が使用されます。

開発者は、バグの修正に多くの時間を費やしていることに気付くでしょう。あなたが遭遇するであろう多くのエラーは一般的であり、それらを知ることはあなたがそもそもそれらを防ぐのを助けるでしょう。

これらの3種類のプログラミングエラーについて知っておく必要があることと、それらを防ぐ方法は次のとおりです。

1.実行時または実行エラー

これらは、プログラムの実行中(つまり実行時)に発生するエラーです。プログラムが正しく実行されなかったり、まったく実行されなかったりする可能性があります。

致命的なランタイムエラーはプログラムの実行を停止させ、致命的でないエラーは実行を終了させますが、結果は正しくありません。

典型的なランタイムエラーは、ゼロ除算エラーです。ゼロ除算は無限の結果をもたらすはずですが、残念ながら、その量のデータを格納できるデータ構造はまだ考えられていません。

したがって、ゼロによる除算は、Javaコンパイラで算術例外を引き起こします。

2.論理エラー

論理エラーは、推論の欠陥が原因で発生します。これらのエラーは、必ずしもあなたが犯した「間違い」によるものではないことに注意することが重要です。特定の実行シナリオを考慮しなかったために発生する可能性があります。

それらは取り扱いが最も難しいです。これは、論理エラーのあるコードは、それが記述されている言語で有効なプログラムであるためです。したがって、コンパイラエラーはスローされません。唯一の問題は、誤った結果が生成されることです。

致命的な論理エラーはプログラムの実行を停止させ、致命的でない論理エラーはプログラムの実行を続行させますが、結果は正しくありません。

一般的な論理エラーは、オフバイワンエラーです。これは通常、ループ継続条件を示すときに発生します。最初の5つの平方数を印刷するとします。

関連:最も一般的なプログラミングとコーディングの間違い

以下のコードをforループに記述して、最初の4つのそのような数値のみを与える可能性があります。

 for( int x=1; x<5; x++){ System.out.ln(x*x); }

このようなエラーを回避するには、代わりに<=記号を使用できます。等号以下の記号を使用する方が直感的であるため、関係演算を混同する可能性が低くなります。

もう1つの一般的な論理エラーは、制御ステートメントの両方の中括弧を省略しているにもかかわらず、下の本文がその制御下にあるコードのブロックを形成していることです。

以下の例を見てください。乱数が奇数か偶数かをチェックしてから、出力を出力します。

 import java.util.Random;
public class OddEven{
public static void main(String[] args) {
Random numberGenerator = new Random();
int randomNumber = numberGenerator.nextInt(10);
if ((randomNumber%2)==0)
System.out.println("Here is your lucky number :" + randomNumber);
System.out.println("The number "+ randomNumber +" that you got is even"); // line 11
}
}

11行目に注意してください。取得した乱数が偶数であるかどうかに関係なく、常に実行されます。もちろん、得た数が奇数の場合、これは論理的に間違っています。

中括弧{}の間に両方のSystem.out.printlnステートメントを含めると、これを回避できます。

関連:すべてのプログラマーが知っておくべきソフトウェア開発手順

注意すべきもう1つの論理エラーは、ループ終了条件を提供しないことです。これにより、無限ループが発生し、プログラムの実行が終了することはありません。

3.構文エラーまたはコンパイル時エラー

これらは、Javaの言語規則の違反が原因で発生したエラーです。これらは、コンパイルエラーまたはコンパイル時エラーとも呼ばれます。

コンパイラは常にエラーを報告するため、これらは処理が最も簡単なエラーです。多くのコンパイラは先に進んで、エラーが発生しているコードの行を通知します。

フォールトトレランス

ソフトウェアの問題に対処する実際的な方法は、例外処理を含めることでフォールトトレランスを実現することです。これを実現するには、 try..catchステートメントを使用できます。

catchブロックでキャッチされた例外に関係なくプログラムの実行を続行するには、 finallyステートメントを使用します。

構文は次のとおりです。

 try{ // Block to execute if there are no issues }
catch (Exception e){
// Block to handle issues found
}finally{ // Block to execute after catch
}

以下のコード例を参照してください。

 import java.util.Random;
public class RandomNumbers{
public static void main(String[] args) {
Random numberGenerator = new Random();
try{
for (int counter = 10; counter<=100; counter++){
int randomNumber = numberGenerator.nextInt(10);
System.out.println(counter/randomNumber); } }
catch(Exception e){
System.out.println("Division by zero encountered!");
}
finally{
System.out.println("Infinite value got");}
}
}

上記のプログラムは、0から10までの乱数を生成し、その数を使用してカウンター値を10から100の間で除算します。ゼロによる除算が発生すると、システムはエラーをキャッチしてメッセージを表示します。

コーディングを上手に

コードにコメントを追加することをお勧めします。これにより、バグが発生したときにファイルを簡単に調べることができます。強力なコーディング手法を開発するための1つの小さな、しかし非常に重要なステップ。

優れたコーディング手法を使用すれば、一般的なプログラミングの間違いを回避できるはずです。